12fb4f839SGregory Neil Shapiro /*
22fb4f839SGregory Neil Shapiro * Copyright (c) 2020 Proofpoint, Inc. and its suppliers.
32fb4f839SGregory Neil Shapiro * All rights reserved.
42fb4f839SGregory Neil Shapiro *
52fb4f839SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set
62fb4f839SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of
72fb4f839SGregory Neil Shapiro * the sendmail distribution.
82fb4f839SGregory Neil Shapiro *
92fb4f839SGregory Neil Shapiro */
102fb4f839SGregory Neil Shapiro
112fb4f839SGregory Neil Shapiro #include <sm/gen.h>
122fb4f839SGregory Neil Shapiro #include <sm/sendmail.h>
132fb4f839SGregory Neil Shapiro
142fb4f839SGregory Neil Shapiro #if USE_EAI
152fb4f839SGregory Neil Shapiro #include <sm/string.h>
162fb4f839SGregory Neil Shapiro #include <sm/heap.h>
172fb4f839SGregory Neil Shapiro #include <sm/ixlen.h>
182fb4f839SGregory Neil Shapiro
192fb4f839SGregory Neil Shapiro /*
20*d39bd2c1SGregory Neil Shapiro ** SM_STRCASEEQ -- are two strings equal (case-insensitive)?
212fb4f839SGregory Neil Shapiro **
222fb4f839SGregory Neil Shapiro ** Parameters:
232fb4f839SGregory Neil Shapiro ** s1 -- string
242fb4f839SGregory Neil Shapiro ** s2 -- string
252fb4f839SGregory Neil Shapiro **
262fb4f839SGregory Neil Shapiro ** Returns:
272fb4f839SGregory Neil Shapiro ** true iff s1 == s2
282fb4f839SGregory Neil Shapiro */
292fb4f839SGregory Neil Shapiro
302fb4f839SGregory Neil Shapiro bool
sm_strcaseeq(s1,s2)312fb4f839SGregory Neil Shapiro sm_strcaseeq(s1, s2)
322fb4f839SGregory Neil Shapiro const char *s1;
332fb4f839SGregory Neil Shapiro const char *s2;
342fb4f839SGregory Neil Shapiro {
352fb4f839SGregory Neil Shapiro char *l1, *l2;
362fb4f839SGregory Neil Shapiro char *f1;
372fb4f839SGregory Neil Shapiro bool same;
382fb4f839SGregory Neil Shapiro
392fb4f839SGregory Neil Shapiro if (asciistr(s1))
402fb4f839SGregory Neil Shapiro {
412fb4f839SGregory Neil Shapiro if (!asciistr(s2))
422fb4f839SGregory Neil Shapiro return false;
432fb4f839SGregory Neil Shapiro return (sm_strcasecmp(s1, s2) == 0);
442fb4f839SGregory Neil Shapiro }
452fb4f839SGregory Neil Shapiro if (asciistr(s2))
462fb4f839SGregory Neil Shapiro return false;
472fb4f839SGregory Neil Shapiro l1 = sm_lowercase(s1);
482fb4f839SGregory Neil Shapiro if (l1 != s1)
492fb4f839SGregory Neil Shapiro {
502fb4f839SGregory Neil Shapiro f1 = sm_strdup_x(l1);
512fb4f839SGregory Neil Shapiro l1 = f1;
522fb4f839SGregory Neil Shapiro }
532fb4f839SGregory Neil Shapiro else
542fb4f839SGregory Neil Shapiro f1 = NULL;
552fb4f839SGregory Neil Shapiro l2 = sm_lowercase(s2);
562fb4f839SGregory Neil Shapiro
572fb4f839SGregory Neil Shapiro while (*l1 == *l2 && '\0' != *l1)
582fb4f839SGregory Neil Shapiro l1++, l2++;
592fb4f839SGregory Neil Shapiro same = *l1 == *l2;
602fb4f839SGregory Neil Shapiro
612fb4f839SGregory Neil Shapiro SM_FREE(f1);
622fb4f839SGregory Neil Shapiro return same;
632fb4f839SGregory Neil Shapiro }
642fb4f839SGregory Neil Shapiro
652fb4f839SGregory Neil Shapiro /*
66*d39bd2c1SGregory Neil Shapiro ** SM_STRNCASEEQ -- are two strings (up to a length) equal (case-insensitive)?
672fb4f839SGregory Neil Shapiro **
682fb4f839SGregory Neil Shapiro ** Parameters:
692fb4f839SGregory Neil Shapiro ** s1 -- string
702fb4f839SGregory Neil Shapiro ** s2 -- string
712fb4f839SGregory Neil Shapiro ** n -- maximum length to compare
722fb4f839SGregory Neil Shapiro **
732fb4f839SGregory Neil Shapiro ** Returns:
742fb4f839SGregory Neil Shapiro ** true iff s1 == s2 (for up to the first n char)
752fb4f839SGregory Neil Shapiro */
762fb4f839SGregory Neil Shapiro
772fb4f839SGregory Neil Shapiro bool
sm_strncaseeq(s1,s2,n)782fb4f839SGregory Neil Shapiro sm_strncaseeq(s1, s2, n)
792fb4f839SGregory Neil Shapiro const char *s1;
802fb4f839SGregory Neil Shapiro const char *s2;
812fb4f839SGregory Neil Shapiro size_t n;
822fb4f839SGregory Neil Shapiro {
832fb4f839SGregory Neil Shapiro char *l1, *l2;
842fb4f839SGregory Neil Shapiro char *f1;
852fb4f839SGregory Neil Shapiro bool same;
862fb4f839SGregory Neil Shapiro
872fb4f839SGregory Neil Shapiro if (0 == n)
882fb4f839SGregory Neil Shapiro return true;
89*d39bd2c1SGregory Neil Shapiro if (asciinstr(s1, n))
902fb4f839SGregory Neil Shapiro {
91*d39bd2c1SGregory Neil Shapiro if (!asciinstr(s2, n))
922fb4f839SGregory Neil Shapiro return false;
932fb4f839SGregory Neil Shapiro return (sm_strncasecmp(s1, s2, n) == 0);
942fb4f839SGregory Neil Shapiro }
95*d39bd2c1SGregory Neil Shapiro if (asciinstr(s2, n))
962fb4f839SGregory Neil Shapiro return false;
972fb4f839SGregory Neil Shapiro l1 = sm_lowercase(s1);
982fb4f839SGregory Neil Shapiro if (l1 != s1)
992fb4f839SGregory Neil Shapiro {
1002fb4f839SGregory Neil Shapiro f1 = sm_strdup_x(l1);
1012fb4f839SGregory Neil Shapiro l1 = f1;
1022fb4f839SGregory Neil Shapiro }
1032fb4f839SGregory Neil Shapiro else
1042fb4f839SGregory Neil Shapiro f1 = NULL;
1052fb4f839SGregory Neil Shapiro l2 = sm_lowercase(s2);
1062fb4f839SGregory Neil Shapiro
107*d39bd2c1SGregory Neil Shapiro while (*l1 == *l2 && '\0' != *l1 && --n > 0)
1082fb4f839SGregory Neil Shapiro l1++, l2++;
1092fb4f839SGregory Neil Shapiro same = *l1 == *l2;
1102fb4f839SGregory Neil Shapiro
1112fb4f839SGregory Neil Shapiro SM_FREE(f1);
1122fb4f839SGregory Neil Shapiro return same;
1132fb4f839SGregory Neil Shapiro }
1142fb4f839SGregory Neil Shapiro #endif /* USE_EAI */
115