1/* Case-insensitive buffer comparator.
2   Copyright (C) 1996-1997, 2000, 2003, 2006, 2009-2010 Free Software
3   Foundation, Inc.
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 3 of the License, or
8   (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17
18/* Written by Jim Meyering.  */
19
20#include <config.h>
21
22#include "memcasecmp.h"
23
24#include <ctype.h>
25#include <limits.h>
26
27/* Like memcmp, but ignore differences in case.
28   Convert to upper case (not lower) before comparing so that
29   join -i works with sort -f.  */
30
31int
32memcasecmp (const void *vs1, const void *vs2, size_t n)
33{
34  size_t i;
35  char const *s1 = vs1;
36  char const *s2 = vs2;
37  for (i = 0; i < n; i++)
38    {
39      unsigned char u1 = s1[i];
40      unsigned char u2 = s2[i];
41      int U1 = toupper (u1);
42      int U2 = toupper (u2);
43      int diff = (UCHAR_MAX <= INT_MAX ? U1 - U2
44                  : U1 < U2 ? -1 : U2 < U1);
45      if (diff)
46        return diff;
47    }
48  return 0;
49}
50