root/maint/gnulib/lib/c-strcaseeq.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. strcaseeq9
  2. strcaseeq8
  3. strcaseeq7
  4. strcaseeq6
  5. strcaseeq5
  6. strcaseeq4
  7. strcaseeq3
  8. strcaseeq2
  9. strcaseeq1
  10. strcaseeq0

   1 /* Optimized case-insensitive string comparison in C locale.
   2    Copyright (C) 2001-2002, 2007, 2009-2021 Free Software Foundation, Inc.
   3 
   4    This file is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU Lesser General Public License as
   6    published by the Free Software Foundation; either version 2.1 of the
   7    License, or (at your option) any later version.
   8 
   9    This file 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 /* Written by Bruno Haible <bruno@clisp.org>.  */
  18 
  19 #include "c-strcase.h"
  20 #include "c-ctype.h"
  21 
  22 /* STRCASEEQ allows to optimize string comparison with a small literal string.
  23      STRCASEEQ (s, "UTF-8", 'U','T','F','-','8',0,0,0,0)
  24    is semantically equivalent to
  25      c_strcasecmp (s, "UTF-8") == 0
  26    just faster.  */
  27 
  28 /* Help GCC to generate good code for string comparisons with
  29    immediate strings. */
  30 #if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__
  31 
  32 /* Case insensitive comparison of ASCII characters.  */
  33 # if C_CTYPE_ASCII
  34 #  define CASEEQ(other,upper) \
  35      (c_isupper (upper) ? ((other) & ~0x20) == (upper) : (other) == (upper))
  36 # else
  37 #  define CASEEQ(other,upper) \
  38      (c_toupper (other) == (upper))
  39 # endif
  40 
  41 static inline int
  42 strcaseeq9 (const char *s1, const char *s2)
     /* [previous][next][first][last][top][bottom][index][help] */
  43 {
  44   return c_strcasecmp (s1 + 9, s2 + 9) == 0;
  45 }
  46 
  47 static inline int
  48 strcaseeq8 (const char *s1, const char *s2, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
  49 {
  50   if (CASEEQ (s1[8], s28))
  51     {
  52       if (s28 == 0)
  53         return 1;
  54       else
  55         return strcaseeq9 (s1, s2);
  56     }
  57   else
  58     return 0;
  59 }
  60 
  61 static inline int
  62 strcaseeq7 (const char *s1, const char *s2, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
  63 {
  64   if (CASEEQ (s1[7], s27))
  65     {
  66       if (s27 == 0)
  67         return 1;
  68       else
  69         return strcaseeq8 (s1, s2, s28);
  70     }
  71   else
  72     return 0;
  73 }
  74 
  75 static inline int
  76 strcaseeq6 (const char *s1, const char *s2, char s26, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
  77 {
  78   if (CASEEQ (s1[6], s26))
  79     {
  80       if (s26 == 0)
  81         return 1;
  82       else
  83         return strcaseeq7 (s1, s2, s27, s28);
  84     }
  85   else
  86     return 0;
  87 }
  88 
  89 static inline int
  90 strcaseeq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
  91 {
  92   if (CASEEQ (s1[5], s25))
  93     {
  94       if (s25 == 0)
  95         return 1;
  96       else
  97         return strcaseeq6 (s1, s2, s26, s27, s28);
  98     }
  99   else
 100     return 0;
 101 }
 102 
 103 static inline int
 104 strcaseeq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
 105 {
 106   if (CASEEQ (s1[4], s24))
 107     {
 108       if (s24 == 0)
 109         return 1;
 110       else
 111         return strcaseeq5 (s1, s2, s25, s26, s27, s28);
 112     }
 113   else
 114     return 0;
 115 }
 116 
 117 static inline int
 118 strcaseeq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
 119 {
 120   if (CASEEQ (s1[3], s23))
 121     {
 122       if (s23 == 0)
 123         return 1;
 124       else
 125         return strcaseeq4 (s1, s2, s24, s25, s26, s27, s28);
 126     }
 127   else
 128     return 0;
 129 }
 130 
 131 static inline int
 132 strcaseeq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
 133 {
 134   if (CASEEQ (s1[2], s22))
 135     {
 136       if (s22 == 0)
 137         return 1;
 138       else
 139         return strcaseeq3 (s1, s2, s23, s24, s25, s26, s27, s28);
 140     }
 141   else
 142     return 0;
 143 }
 144 
 145 static inline int
 146 strcaseeq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
 147 {
 148   if (CASEEQ (s1[1], s21))
 149     {
 150       if (s21 == 0)
 151         return 1;
 152       else
 153         return strcaseeq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
 154     }
 155   else
 156     return 0;
 157 }
 158 
 159 static inline int
 160 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)
     /* [previous][next][first][last][top][bottom][index][help] */
 161 {
 162   if (CASEEQ (s1[0], s20))
 163     {
 164       if (s20 == 0)
 165         return 1;
 166       else
 167         return strcaseeq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
 168     }
 169   else
 170     return 0;
 171 }
 172 
 173 #define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
 174   strcaseeq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
 175 
 176 #else
 177 
 178 #define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
 179   (c_strcasecmp (s1, s2) == 0)
 180 
 181 #endif

/* [previous][next][first][last][top][bottom][index][help] */