Home | History | Annotate | Download | only in lib
      1 /* Optimized string comparison.
      2    Copyright (C) 2001-2002, 2007, 2009-2012 Free Software Foundation, Inc.
      3 
      4    This program is free software: you can redistribute it and/or modify it
      5    under the terms of the GNU General Public License as published
      6    by the Free Software Foundation; either version 3 of the License, or
      7    (at your option) any later version.
      8 
      9    This program 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 GNU
     12    General Public License for more details.
     13 
     14    You should have received a copy of the GNU General Public License
     15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     16 
     17 /* Written by Bruno Haible <bruno (at) 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 (__OPTIMIZE__)
     33 
     34 static inline int
     35 streq9 (const char *s1, const char *s2)
     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)
     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)
     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)
     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)
     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)
     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)
    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)
    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)
    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)
    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 */
    177