1 /* 2 * Copyright (c) 2001 Proofpoint, 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.6 2013-11-22 20:51:43 ca 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 } 102