Line data Source code
1 : /* c-strcasecmp.c -- case insensitive string comparator in C locale 2 : Copyright (C) 1998-1999, 2005-2006, 2009-2020 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 Lesser General Public License as published by 6 : the Free Software Foundation; either version 2.1, 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 Lesser General Public License for more details. 13 : 14 : You should have received a copy of the GNU Lesser General Public License 15 : along with this program; if not, see <https://www.gnu.org/licenses/>. */ 16 : 17 : #include <config.h> 18 : 19 : /* Specification. */ 20 : #include "c-strcase.h" 21 : 22 : #include <limits.h> 23 : 24 : #include "c-ctype.h" 25 : 26 : int 27 11990 : c_strcasecmp (const char *s1, const char *s2) 28 : { 29 11990 : register const unsigned char *p1 = (const unsigned char *) s1; 30 11990 : register const unsigned char *p2 = (const unsigned char *) s2; 31 : unsigned char c1, c2; 32 : 33 11990 : if (p1 == p2) 34 0 : return 0; 35 : 36 : do 37 : { 38 29667 : c1 = c_tolower (*p1); 39 29667 : c2 = c_tolower (*p2); 40 : 41 29667 : if (c1 == '0円') 42 3676 : break; 43 : 44 25991 : ++p1; 45 25991 : ++p2; 46 : } 47 25991 : while (c1 == c2); 48 : 49 : if (UCHAR_MAX <= INT_MAX) 50 11990 : return c1 - c2; 51 : else 52 : /* On machines where 'char' and 'int' are types of the same size, the 53 : difference of two 'unsigned char' values - including the sign bit - 54 : doesn't fit in an 'int'. */ 55 : return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0); 56 : }