
1: /* c-strncasecmp.c -- case insensitive string comparator in C locale 2: Copyright (C) 1998-1999, 2005-2006 Free Software Foundation, Inc. 3: 4: This program is free software; you can redistribute it and/or modify 5: it under the terms of the GNU General Public License as published by 6: the Free Software Foundation; either version 2, or (at your option) 7: any later version. 8: 9: This program is distributed in the hope that it will be useful, 10: but WITHOUT ANY WARRANTY; without even the implied warranty of 11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12: GNU General Public License for more details. 13: 14: You should have received a copy of the GNU General Public License 15: along with this program; if not, write to the Free Software Foundation, 16: Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 17: 18: #include <config.h> 19: 20: /* Specification. */ 21: #include "c-strcase.h" 22: 23: #include <limits.h> 24: 25: #include "c-ctype.h" 26: 27: int 28: c_strncasecmp (const char *s1, const char *s2, size_t n) 29: { 30: register const unsigned char *p1 = (const unsigned char *) s1; 31: register const unsigned char *p2 = (const unsigned char *) s2; 32: unsigned char c1, c2; 33: 34: if (p1 == p2 || n == 0) 35: return 0; 36: 37: do 38: { 39: c1 = c_tolower (*p1); 40: c2 = c_tolower (*p2); 41: 42: if (--n == 0 || c1 == '\0') 43: break; 44: 45: ++p1; 46: ++p2; 47: } 48: while (c1 == c2); 49: 50: if (UCHAR_MAX <= INT_MAX) 51: return c1 - c2; 52: else 53: /* On machines where 'char' and 'int' are types of the same size, the 54: difference of two 'unsigned char' values - including the sign bit - 55: doesn't fit in an 'int'. */ 56: return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0); 57: }