Blame gettext-tools/gnulib-lib/c-strcaseeq.h

Packit Bot 06c835
/* Optimized case-insensitive string comparison in C locale.
Packit Bot 06c835
   Copyright (C) 2001-2002, 2007, 2009-2015 Free Software Foundation, Inc.
Packit Bot 06c835
Packit Bot 06c835
   This program is free software: you can redistribute it and/or modify it
Packit Bot 06c835
   under the terms of the GNU General Public License as published
Packit Bot 06c835
   by the Free Software Foundation; either version 3 of the License, or
Packit Bot 06c835
   (at your option) any later version.
Packit Bot 06c835
Packit Bot 06c835
   This program is distributed in the hope that it will be useful,
Packit Bot 06c835
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Bot 06c835
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Bot 06c835
   General Public License for more details.
Packit Bot 06c835
Packit Bot 06c835
   You should have received a copy of the GNU General Public License
Packit Bot 06c835
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Bot 06c835
Packit Bot 06c835
/* Written by Bruno Haible <bruno@clisp.org>.  */
Packit Bot 06c835
Packit Bot 06c835
#include "c-strcase.h"
Packit Bot 06c835
#include "c-ctype.h"
Packit Bot 06c835
Packit Bot 06c835
/* STRCASEEQ allows to optimize string comparison with a small literal string.
Packit Bot 06c835
     STRCASEEQ (s, "UTF-8", 'U','T','F','-','8',0,0,0,0)
Packit Bot 06c835
   is semantically equivalent to
Packit Bot 06c835
     c_strcasecmp (s, "UTF-8") == 0
Packit Bot 06c835
   just faster.  */
Packit Bot 06c835
Packit Bot 06c835
/* Help GCC to generate good code for string comparisons with
Packit Bot 06c835
   immediate strings. */
Packit Bot 06c835
#if defined (__GNUC__) && defined (__OPTIMIZE__)
Packit Bot 06c835
Packit Bot 06c835
/* Case insensitive comparison of ASCII characters.  */
Packit Bot 06c835
# if C_CTYPE_ASCII
Packit Bot 06c835
#  define CASEEQ(other,upper) \
Packit Bot 06c835
     (c_isupper (upper) ? ((other) & ~0x20) == (upper) : (other) == (upper))
Packit Bot 06c835
# else
Packit Bot 06c835
#  define CASEEQ(other,upper) \
Packit Bot 06c835
     (c_toupper (other) == (upper))
Packit Bot 06c835
# endif
Packit Bot 06c835
Packit Bot 06c835
static inline int
Packit Bot 06c835
strcaseeq9 (const char *s1, const char *s2)
Packit Bot 06c835
{
Packit Bot 06c835
  return c_strcasecmp (s1 + 9, s2 + 9) == 0;
Packit Bot 06c835
}
Packit Bot 06c835
Packit Bot 06c835
static inline int
Packit Bot 06c835
strcaseeq8 (const char *s1, const char *s2, char s28)
Packit Bot 06c835
{
Packit Bot 06c835
  if (CASEEQ (s1[8], s28))
Packit Bot 06c835
    {
Packit Bot 06c835
      if (s28 == 0)
Packit Bot 06c835
        return 1;
Packit Bot 06c835
      else
Packit Bot 06c835
        return strcaseeq9 (s1, s2);
Packit Bot 06c835
    }
Packit Bot 06c835
  else
Packit Bot 06c835
    return 0;
Packit Bot 06c835
}
Packit Bot 06c835
Packit Bot 06c835
static inline int
Packit Bot 06c835
strcaseeq7 (const char *s1, const char *s2, char s27, char s28)
Packit Bot 06c835
{
Packit Bot 06c835
  if (CASEEQ (s1[7], s27))
Packit Bot 06c835
    {
Packit Bot 06c835
      if (s27 == 0)
Packit Bot 06c835
        return 1;
Packit Bot 06c835
      else
Packit Bot 06c835
        return strcaseeq8 (s1, s2, s28);
Packit Bot 06c835
    }
Packit Bot 06c835
  else
Packit Bot 06c835
    return 0;
Packit Bot 06c835
}
Packit Bot 06c835
Packit Bot 06c835
static inline int
Packit Bot 06c835
strcaseeq6 (const char *s1, const char *s2, char s26, char s27, char s28)
Packit Bot 06c835
{
Packit Bot 06c835
  if (CASEEQ (s1[6], s26))
Packit Bot 06c835
    {
Packit Bot 06c835
      if (s26 == 0)
Packit Bot 06c835
        return 1;
Packit Bot 06c835
      else
Packit Bot 06c835
        return strcaseeq7 (s1, s2, s27, s28);
Packit Bot 06c835
    }
Packit Bot 06c835
  else
Packit Bot 06c835
    return 0;
Packit Bot 06c835
}
Packit Bot 06c835
Packit Bot 06c835
static inline int
Packit Bot 06c835
strcaseeq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
Packit Bot 06c835
{
Packit Bot 06c835
  if (CASEEQ (s1[5], s25))
Packit Bot 06c835
    {
Packit Bot 06c835
      if (s25 == 0)
Packit Bot 06c835
        return 1;
Packit Bot 06c835
      else
Packit Bot 06c835
        return strcaseeq6 (s1, s2, s26, s27, s28);
Packit Bot 06c835
    }
Packit Bot 06c835
  else
Packit Bot 06c835
    return 0;
Packit Bot 06c835
}
Packit Bot 06c835
Packit Bot 06c835
static inline int
Packit Bot 06c835
strcaseeq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
Packit Bot 06c835
{
Packit Bot 06c835
  if (CASEEQ (s1[4], s24))
Packit Bot 06c835
    {
Packit Bot 06c835
      if (s24 == 0)
Packit Bot 06c835
        return 1;
Packit Bot 06c835
      else
Packit Bot 06c835
        return strcaseeq5 (s1, s2, s25, s26, s27, s28);
Packit Bot 06c835
    }
Packit Bot 06c835
  else
Packit Bot 06c835
    return 0;
Packit Bot 06c835
}
Packit Bot 06c835
Packit Bot 06c835
static inline int
Packit Bot 06c835
strcaseeq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
Packit Bot 06c835
{
Packit Bot 06c835
  if (CASEEQ (s1[3], s23))
Packit Bot 06c835
    {
Packit Bot 06c835
      if (s23 == 0)
Packit Bot 06c835
        return 1;
Packit Bot 06c835
      else
Packit Bot 06c835
        return strcaseeq4 (s1, s2, s24, s25, s26, s27, s28);
Packit Bot 06c835
    }
Packit Bot 06c835
  else
Packit Bot 06c835
    return 0;
Packit Bot 06c835
}
Packit Bot 06c835
Packit Bot 06c835
static inline int
Packit Bot 06c835
strcaseeq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
Packit Bot 06c835
{
Packit Bot 06c835
  if (CASEEQ (s1[2], s22))
Packit Bot 06c835
    {
Packit Bot 06c835
      if (s22 == 0)
Packit Bot 06c835
        return 1;
Packit Bot 06c835
      else
Packit Bot 06c835
        return strcaseeq3 (s1, s2, s23, s24, s25, s26, s27, s28);
Packit Bot 06c835
    }
Packit Bot 06c835
  else
Packit Bot 06c835
    return 0;
Packit Bot 06c835
}
Packit Bot 06c835
Packit Bot 06c835
static inline int
Packit Bot 06c835
strcaseeq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
Packit Bot 06c835
{
Packit Bot 06c835
  if (CASEEQ (s1[1], s21))
Packit Bot 06c835
    {
Packit Bot 06c835
      if (s21 == 0)
Packit Bot 06c835
        return 1;
Packit Bot 06c835
      else
Packit Bot 06c835
        return strcaseeq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
Packit Bot 06c835
    }
Packit Bot 06c835
  else
Packit Bot 06c835
    return 0;
Packit Bot 06c835
}
Packit Bot 06c835
Packit Bot 06c835
static inline int
Packit Bot 06c835
strcaseeq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
Packit Bot 06c835
{
Packit Bot 06c835
  if (CASEEQ (s1[0], s20))
Packit Bot 06c835
    {
Packit Bot 06c835
      if (s20 == 0)
Packit Bot 06c835
        return 1;
Packit Bot 06c835
      else
Packit Bot 06c835
        return strcaseeq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
Packit Bot 06c835
    }
Packit Bot 06c835
  else
Packit Bot 06c835
    return 0;
Packit Bot 06c835
}
Packit Bot 06c835
Packit Bot 06c835
#define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
Packit Bot 06c835
  strcaseeq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
Packit Bot 06c835
Packit Bot 06c835
#else
Packit Bot 06c835
Packit Bot 06c835
#define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
Packit Bot 06c835
  (c_strcasecmp (s1, s2) == 0)
Packit Bot 06c835
Packit Bot 06c835
#endif