Annotation of embedaddon/libiconv/srclib/streq.h, revision 1.1.1.2

1.1       misho       1: /* Optimized string comparison.
1.1.1.2 ! misho       2:    Copyright (C) 2001-2002, 2007, 2009-2011 Free Software Foundation, Inc.
1.1       misho       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
1.1.1.2 ! misho      12:    General Public License for more details.
1.1       misho      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@clisp.org>.  */
                     18: 
                     19: #ifndef _GL_STREQ_H
                     20: #define _GL_STREQ_H
                     21: 
                     22: #include <string.h>
                     23: 
                     24: /* STREQ allows to optimize string comparison with a small literal string.
                     25:      STREQ (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(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(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 */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>