Blame gettext-runtime/gnulib-lib/c-strcasecmp.c

Packit 5b56b6
/* c-strcasecmp.c -- case insensitive string comparator in C locale
Packit 5b56b6
   Copyright (C) 1998-1999, 2005-2006, 2009-2015 Free Software Foundation, Inc.
Packit 5b56b6
Packit 5b56b6
   This program is free software; you can redistribute it and/or modify
Packit 5b56b6
   it under the terms of the GNU General Public License as published by
Packit 5b56b6
   the Free Software Foundation; either version 3, or (at your option)
Packit 5b56b6
   any later version.
Packit 5b56b6
Packit 5b56b6
   This program is distributed in the hope that it will be useful,
Packit 5b56b6
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5b56b6
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 5b56b6
   GNU General Public License for more details.
Packit 5b56b6
Packit 5b56b6
   You should have received a copy of the GNU General Public License
Packit 5b56b6
   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
Packit 5b56b6
Packit 5b56b6
#include <config.h>
Packit 5b56b6
Packit 5b56b6
/* Specification.  */
Packit 5b56b6
#include "c-strcase.h"
Packit 5b56b6
Packit 5b56b6
#include <limits.h>
Packit 5b56b6
Packit 5b56b6
#include "c-ctype.h"
Packit 5b56b6
Packit 5b56b6
int
Packit 5b56b6
c_strcasecmp (const char *s1, const char *s2)
Packit 5b56b6
{
Packit 5b56b6
  register const unsigned char *p1 = (const unsigned char *) s1;
Packit 5b56b6
  register const unsigned char *p2 = (const unsigned char *) s2;
Packit 5b56b6
  unsigned char c1, c2;
Packit 5b56b6
Packit 5b56b6
  if (p1 == p2)
Packit 5b56b6
    return 0;
Packit 5b56b6
Packit 5b56b6
  do
Packit 5b56b6
    {
Packit 5b56b6
      c1 = c_tolower (*p1);
Packit 5b56b6
      c2 = c_tolower (*p2);
Packit 5b56b6
Packit 5b56b6
      if (c1 == '\0')
Packit 5b56b6
        break;
Packit 5b56b6
Packit 5b56b6
      ++p1;
Packit 5b56b6
      ++p2;
Packit 5b56b6
    }
Packit 5b56b6
  while (c1 == c2);
Packit 5b56b6
Packit 5b56b6
  if (UCHAR_MAX <= INT_MAX)
Packit 5b56b6
    return c1 - c2;
Packit 5b56b6
  else
Packit 5b56b6
    /* On machines where 'char' and 'int' are types of the same size, the
Packit 5b56b6
       difference of two 'unsigned char' values - including the sign bit -
Packit 5b56b6
       doesn't fit in an 'int'.  */
Packit 5b56b6
    return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
Packit 5b56b6
}