1 /*
2 * Copyright (c) 2001 Sendmail, Inc. and its suppliers.
3 * All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 *
9 */
10
11 #pragma ident "%Z%%M% %I% %E% SMI"
12
13 #include <sm/gen.h>
14 SM_RCSID("@(#)$Id: strrevcmp.c,v 1.2 2001/08/27 22:21:51 gshapiro Exp $")
15
16 #include <sm/config.h>
17 #include <sm/string.h>
18 #include <string.h>
19
20 /* strcasecmp.c */
21 extern const unsigned char charmap[];
22
23 /*
24 ** SM_STRREVCASECMP -- compare two strings starting at the end (ignore case)
25 **
26 ** Parameters:
27 ** s1 -- first string.
28 ** s2 -- second string.
29 **
30 ** Returns:
31 ** strcasecmp(reverse(s1), reverse(s2))
32 */
33
34 int
sm_strrevcasecmp(s1,s2)35 sm_strrevcasecmp(s1, s2)
36 const char *s1, *s2;
37 {
38 register int i1, i2;
39
40 i1 = strlen(s1) - 1;
41 i2 = strlen(s2) - 1;
42 while (i1 >= 0 && i2 >= 0 &&
43 charmap[(unsigned char) s1[i1]] ==
44 charmap[(unsigned char) s2[i2]])
45 {
46 --i1;
47 --i2;
48 }
49 if (i1 < 0)
50 {
51 if (i2 < 0)
52 return 0;
53 else
54 return -1;
55 }
56 else
57 {
58 if (i2 < 0)
59 return 1;
60 else
61 return (charmap[(unsigned char) s1[i1]] -
62 charmap[(unsigned char) s2[i2]]);
63 }
64 }
65 /*
66 ** SM_STRREVCMP -- compare two strings starting at the end
67 **
68 ** Parameters:
69 ** s1 -- first string.
70 ** s2 -- second string.
71 **
72 ** Returns:
73 ** strcmp(reverse(s1), reverse(s2))
74 */
75
76 int
sm_strrevcmp(s1,s2)77 sm_strrevcmp(s1, s2)
78 const char *s1, *s2;
79 {
80 register int i1, i2;
81
82 i1 = strlen(s1) - 1;
83 i2 = strlen(s2) - 1;
84 while (i1 >= 0 && i2 >= 0 && s1[i1] == s2[i2])
85 {
86 --i1;
87 --i2;
88 }
89 if (i1 < 0)
90 {
91 if (i2 < 0)
92 return 0;
93 else
94 return -1;
95 }
96 else
97 {
98 if (i2 < 0)
99 return 1;
100 else
101 return s1[i1] - s2[i2];
102 }
103 }
104