Merge from vendor branch GROFF:
[dragonfly.git] / contrib / sendmail-8.13.4 / libsm / strrevcmp.c
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 #include <sm/gen.h>
12 SM_RCSID("@(#)$Id: strrevcmp.c,v 1.5 2001/09/11 04:04:49 gshapiro Exp $")
13
14 #include <sm/config.h>
15 #include <sm/string.h>
16 #include <string.h>
17
18 /* strcasecmp.c */
19 extern const unsigned char charmap[];
20
21 /*
22 **  SM_STRREVCASECMP -- compare two strings starting at the end (ignore case)
23 **
24 **      Parameters:
25 **              s1 -- first string.
26 **              s2 -- second string.
27 **
28 **      Returns:
29 **              strcasecmp(reverse(s1), reverse(s2))
30 */
31
32 int
33 sm_strrevcasecmp(s1, s2)
34         const char *s1, *s2;
35 {
36         register int i1, i2;
37
38         i1 = strlen(s1) - 1;
39         i2 = strlen(s2) - 1;
40         while (i1 >= 0 && i2 >= 0 &&
41                charmap[(unsigned char) s1[i1]] ==
42                charmap[(unsigned char) s2[i2]])
43         {
44                 --i1;
45                 --i2;
46         }
47         if (i1 < 0)
48         {
49                 if (i2 < 0)
50                         return 0;
51                 else
52                         return -1;
53         }
54         else
55         {
56                 if (i2 < 0)
57                         return 1;
58                 else
59                         return (charmap[(unsigned char) s1[i1]] -
60                                 charmap[(unsigned char) s2[i2]]);
61         }
62 }
63 /*
64 **  SM_STRREVCMP -- compare two strings starting at the end
65 **
66 **      Parameters:
67 **              s1 -- first string.
68 **              s2 -- second string.
69 **
70 **      Returns:
71 **              strcmp(reverse(s1), reverse(s2))
72 */
73
74 int
75 sm_strrevcmp(s1, s2)
76         const char *s1, *s2;
77 {
78         register int i1, i2;
79
80         i1 = strlen(s1) - 1;
81         i2 = strlen(s2) - 1;
82         while (i1 >= 0 && i2 >= 0 && s1[i1] == s2[i2])
83         {
84                 --i1;
85                 --i2;
86         }
87         if (i1 < 0)
88         {
89                 if (i2 < 0)
90                         return 0;
91                 else
92                         return -1;
93         }
94         else
95         {
96                 if (i2 < 0)
97                         return 1;
98                 else
99                         return s1[i1] - s2[i2];
100         }
101 }