strrevcmp.c revision 261194
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> 12SM_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 */ 19extern 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 32int 33sm_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 74int 75sm_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