Line data Source code
1 : /* Case-insensitive buffer comparator.
2 : Copyright (C) 1996, 1997, 2000, 2003, 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 3 of the License, or
7 : (at your option) 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, see <http://www.gnu.org/licenses/>. */
16 :
17 : /* Written by Jim Meyering. */
18 :
19 : #include <config.h>
20 :
21 : #include "memcasecmp.h"
22 :
23 : #include <ctype.h>
24 : #include <limits.h>
25 :
26 : /* Like memcmp, but ignore differences in case.
27 : Convert to upper case (not lower) before comparing so that
28 : join -i works with sort -f. */
29 :
30 : int
31 21 : memcasecmp (const void *vs1, const void *vs2, size_t n)
32 : {
33 : size_t i;
34 21 : char const *s1 = vs1;
35 21 : char const *s2 = vs2;
36 26 : for (i = 0; i < n; i++)
37 : {
38 7 : unsigned char u1 = s1[i];
39 7 : unsigned char u2 = s2[i];
40 7 : int U1 = toupper (u1);
41 7 : int U2 = toupper (u2);
42 7 : int diff = (UCHAR_MAX <= INT_MAX ? U1 - U2
43 : : U1 < U2 ? -1 : U2 < U1);
44 7 : if (diff)
45 2 : return diff;
46 : }
47 19 : return 0;
48 : }
|