root/maint/gnulib/lib/streq.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. streq9
  2. streq8
  3. streq7
  4. streq6
  5. streq5
  6. streq4
  7. streq3
  8. streq2
  9. streq1
  10. streq0

   1 /* Optimized string comparison.
   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 #ifndef _GL_STREQ_H
  20 #define _GL_STREQ_H
  21 
  22 #include <string.h>
  23 
  24 /* STREQ_OPT allows to optimize string comparison with a small literal string.
  25      STREQ_OPT (s, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
  26    is semantically equivalent to
  27      strcmp (s, "EUC-KR") == 0
  28    just faster.  */
  29 
  30 /* Help GCC to generate good code for string comparisons with
  31    immediate strings. */
  32 #if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__
  33 
  34 static inline int
  35 streq9 (const char *s1, const char *s2)
     /* [previous][next][first][last][top][bottom][index][help] */
  36 {
  37   return strcmp (s1 + 9, s2 + 9) == 0;
  38 }
  39 
  40 static inline int
  41 streq8 (const char *s1, const char *s2, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
  42 {
  43   if (s1[8] == s28)
  44     {
  45       if (s28 == 0)
  46         return 1;
  47       else
  48         return streq9 (s1, s2);
  49     }
  50   else
  51     return 0;
  52 }
  53 
  54 static inline int
  55 streq7 (const char *s1, const char *s2, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
  56 {
  57   if (s1[7] == s27)
  58     {
  59       if (s27 == 0)
  60         return 1;
  61       else
  62         return streq8 (s1, s2, s28);
  63     }
  64   else
  65     return 0;
  66 }
  67 
  68 static inline int
  69 streq6 (const char *s1, const char *s2, char s26, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
  70 {
  71   if (s1[6] == s26)
  72     {
  73       if (s26 == 0)
  74         return 1;
  75       else
  76         return streq7 (s1, s2, s27, s28);
  77     }
  78   else
  79     return 0;
  80 }
  81 
  82 static inline int
  83 streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
  84 {
  85   if (s1[5] == s25)
  86     {
  87       if (s25 == 0)
  88         return 1;
  89       else
  90         return streq6 (s1, s2, s26, s27, s28);
  91     }
  92   else
  93     return 0;
  94 }
  95 
  96 static inline int
  97 streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
     /* [previous][next][first][last][top][bottom][index][help] */
  98 {
  99   if (s1[4] == s24)
 100     {
 101       if (s24 == 0)
 102         return 1;
 103       else
 104         return streq5 (s1, s2, s25, s26, s27, s28);
 105     }
 106   else
 107     return 0;
 108 }
 109 
 110 static inline int
 111 streq3 (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] */
 112 {
 113   if (s1[3] == s23)
 114     {
 115       if (s23 == 0)
 116         return 1;
 117       else
 118         return streq4 (s1, s2, s24, s25, s26, s27, s28);
 119     }
 120   else
 121     return 0;
 122 }
 123 
 124 static inline int
 125 streq2 (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] */
 126 {
 127   if (s1[2] == s22)
 128     {
 129       if (s22 == 0)
 130         return 1;
 131       else
 132         return streq3 (s1, s2, s23, s24, s25, s26, s27, s28);
 133     }
 134   else
 135     return 0;
 136 }
 137 
 138 static inline int
 139 streq1 (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] */
 140 {
 141   if (s1[1] == s21)
 142     {
 143       if (s21 == 0)
 144         return 1;
 145       else
 146         return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
 147     }
 148   else
 149     return 0;
 150 }
 151 
 152 static inline int
 153 streq0 (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] */
 154 {
 155   if (s1[0] == s20)
 156     {
 157       if (s20 == 0)
 158         return 1;
 159       else
 160         return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
 161     }
 162   else
 163     return 0;
 164 }
 165 
 166 #define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
 167   streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
 168 
 169 #else
 170 
 171 #define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
 172   (strcmp (s1, s2) == 0)
 173 
 174 #endif
 175 
 176 #endif /* _GL_STREQ_H */

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