File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libiconv / srclib / streq.h
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:57:48 2012 UTC (12 years, 4 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

    1: /* Optimized string comparison.
    2:    Copyright (C) 2001-2002, 2007 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:    Lesser 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@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>