xref: /dflybsd-src/contrib/grep/lib/streq.h (revision 91b9ed38d3db6a8a8ac5b66da1d43e6e331e259a)
195b7b453SJohn Marino /* Optimized string comparison.
2*09d4459fSDaniel Fojt    Copyright (C) 2001-2002, 2007, 2009-2020 Free Software Foundation, Inc.
395b7b453SJohn Marino 
495b7b453SJohn Marino    This program is free software: you can redistribute it and/or modify it
595b7b453SJohn Marino    under the terms of the GNU General Public License as published
695b7b453SJohn Marino    by the Free Software Foundation; either version 3 of the License, or
795b7b453SJohn Marino    (at your option) any later version.
895b7b453SJohn Marino 
995b7b453SJohn Marino    This program is distributed in the hope that it will be useful,
1095b7b453SJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
1195b7b453SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12200fbe8dSJohn Marino    General Public License for more details.
1395b7b453SJohn Marino 
1495b7b453SJohn Marino    You should have received a copy of the GNU General Public License
15*09d4459fSDaniel Fojt    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
1695b7b453SJohn Marino 
1795b7b453SJohn Marino /* Written by Bruno Haible <bruno@clisp.org>.  */
1895b7b453SJohn Marino 
1995b7b453SJohn Marino #ifndef _GL_STREQ_H
2095b7b453SJohn Marino #define _GL_STREQ_H
2195b7b453SJohn Marino 
2295b7b453SJohn Marino #include <string.h>
2395b7b453SJohn Marino 
24cf28ed85SJohn Marino /* STREQ_OPT allows to optimize string comparison with a small literal string.
25cf28ed85SJohn Marino      STREQ_OPT (s, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
2695b7b453SJohn Marino    is semantically equivalent to
2795b7b453SJohn Marino      strcmp (s, "EUC-KR") == 0
2895b7b453SJohn Marino    just faster.  */
2995b7b453SJohn Marino 
3095b7b453SJohn Marino /* Help GCC to generate good code for string comparisons with
3195b7b453SJohn Marino    immediate strings. */
3295b7b453SJohn Marino #if defined (__GNUC__) && defined (__OPTIMIZE__)
3395b7b453SJohn Marino 
3495b7b453SJohn Marino static inline int
streq9(const char * s1,const char * s2)3595b7b453SJohn Marino streq9 (const char *s1, const char *s2)
3695b7b453SJohn Marino {
3795b7b453SJohn Marino   return strcmp (s1 + 9, s2 + 9) == 0;
3895b7b453SJohn Marino }
3995b7b453SJohn Marino 
4095b7b453SJohn Marino static inline int
streq8(const char * s1,const char * s2,char s28)4195b7b453SJohn Marino streq8 (const char *s1, const char *s2, char s28)
4295b7b453SJohn Marino {
4395b7b453SJohn Marino   if (s1[8] == s28)
4495b7b453SJohn Marino     {
4595b7b453SJohn Marino       if (s28 == 0)
4695b7b453SJohn Marino         return 1;
4795b7b453SJohn Marino       else
4895b7b453SJohn Marino         return streq9 (s1, s2);
4995b7b453SJohn Marino     }
5095b7b453SJohn Marino   else
5195b7b453SJohn Marino     return 0;
5295b7b453SJohn Marino }
5395b7b453SJohn Marino 
5495b7b453SJohn Marino static inline int
streq7(const char * s1,const char * s2,char s27,char s28)5595b7b453SJohn Marino streq7 (const char *s1, const char *s2, char s27, char s28)
5695b7b453SJohn Marino {
5795b7b453SJohn Marino   if (s1[7] == s27)
5895b7b453SJohn Marino     {
5995b7b453SJohn Marino       if (s27 == 0)
6095b7b453SJohn Marino         return 1;
6195b7b453SJohn Marino       else
6295b7b453SJohn Marino         return streq8 (s1, s2, s28);
6395b7b453SJohn Marino     }
6495b7b453SJohn Marino   else
6595b7b453SJohn Marino     return 0;
6695b7b453SJohn Marino }
6795b7b453SJohn Marino 
6895b7b453SJohn Marino static inline int
streq6(const char * s1,const char * s2,char s26,char s27,char s28)6995b7b453SJohn Marino streq6 (const char *s1, const char *s2, char s26, char s27, char s28)
7095b7b453SJohn Marino {
7195b7b453SJohn Marino   if (s1[6] == s26)
7295b7b453SJohn Marino     {
7395b7b453SJohn Marino       if (s26 == 0)
7495b7b453SJohn Marino         return 1;
7595b7b453SJohn Marino       else
7695b7b453SJohn Marino         return streq7 (s1, s2, s27, s28);
7795b7b453SJohn Marino     }
7895b7b453SJohn Marino   else
7995b7b453SJohn Marino     return 0;
8095b7b453SJohn Marino }
8195b7b453SJohn Marino 
8295b7b453SJohn Marino static inline int
streq5(const char * s1,const char * s2,char s25,char s26,char s27,char s28)8395b7b453SJohn Marino streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
8495b7b453SJohn Marino {
8595b7b453SJohn Marino   if (s1[5] == s25)
8695b7b453SJohn Marino     {
8795b7b453SJohn Marino       if (s25 == 0)
8895b7b453SJohn Marino         return 1;
8995b7b453SJohn Marino       else
9095b7b453SJohn Marino         return streq6 (s1, s2, s26, s27, s28);
9195b7b453SJohn Marino     }
9295b7b453SJohn Marino   else
9395b7b453SJohn Marino     return 0;
9495b7b453SJohn Marino }
9595b7b453SJohn Marino 
9695b7b453SJohn Marino static inline int
streq4(const char * s1,const char * s2,char s24,char s25,char s26,char s27,char s28)9795b7b453SJohn Marino streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
9895b7b453SJohn Marino {
9995b7b453SJohn Marino   if (s1[4] == s24)
10095b7b453SJohn Marino     {
10195b7b453SJohn Marino       if (s24 == 0)
10295b7b453SJohn Marino         return 1;
10395b7b453SJohn Marino       else
10495b7b453SJohn Marino         return streq5 (s1, s2, s25, s26, s27, s28);
10595b7b453SJohn Marino     }
10695b7b453SJohn Marino   else
10795b7b453SJohn Marino     return 0;
10895b7b453SJohn Marino }
10995b7b453SJohn Marino 
11095b7b453SJohn Marino static inline int
streq3(const char * s1,const char * s2,char s23,char s24,char s25,char s26,char s27,char s28)11195b7b453SJohn Marino streq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
11295b7b453SJohn Marino {
11395b7b453SJohn Marino   if (s1[3] == s23)
11495b7b453SJohn Marino     {
11595b7b453SJohn Marino       if (s23 == 0)
11695b7b453SJohn Marino         return 1;
11795b7b453SJohn Marino       else
11895b7b453SJohn Marino         return streq4 (s1, s2, s24, s25, s26, s27, s28);
11995b7b453SJohn Marino     }
12095b7b453SJohn Marino   else
12195b7b453SJohn Marino     return 0;
12295b7b453SJohn Marino }
12395b7b453SJohn Marino 
12495b7b453SJohn Marino static inline int
streq2(const char * s1,const char * s2,char s22,char s23,char s24,char s25,char s26,char s27,char s28)12595b7b453SJohn Marino streq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
12695b7b453SJohn Marino {
12795b7b453SJohn Marino   if (s1[2] == s22)
12895b7b453SJohn Marino     {
12995b7b453SJohn Marino       if (s22 == 0)
13095b7b453SJohn Marino         return 1;
13195b7b453SJohn Marino       else
13295b7b453SJohn Marino         return streq3 (s1, s2, s23, s24, s25, s26, s27, s28);
13395b7b453SJohn Marino     }
13495b7b453SJohn Marino   else
13595b7b453SJohn Marino     return 0;
13695b7b453SJohn Marino }
13795b7b453SJohn Marino 
13895b7b453SJohn Marino static inline int
streq1(const char * s1,const char * s2,char s21,char s22,char s23,char s24,char s25,char s26,char s27,char s28)13995b7b453SJohn Marino streq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
14095b7b453SJohn Marino {
14195b7b453SJohn Marino   if (s1[1] == s21)
14295b7b453SJohn Marino     {
14395b7b453SJohn Marino       if (s21 == 0)
14495b7b453SJohn Marino         return 1;
14595b7b453SJohn Marino       else
14695b7b453SJohn Marino         return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
14795b7b453SJohn Marino     }
14895b7b453SJohn Marino   else
14995b7b453SJohn Marino     return 0;
15095b7b453SJohn Marino }
15195b7b453SJohn Marino 
15295b7b453SJohn Marino static inline int
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)15395b7b453SJohn Marino 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)
15495b7b453SJohn Marino {
15595b7b453SJohn Marino   if (s1[0] == s20)
15695b7b453SJohn Marino     {
15795b7b453SJohn Marino       if (s20 == 0)
15895b7b453SJohn Marino         return 1;
15995b7b453SJohn Marino       else
16095b7b453SJohn Marino         return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
16195b7b453SJohn Marino     }
16295b7b453SJohn Marino   else
16395b7b453SJohn Marino     return 0;
16495b7b453SJohn Marino }
16595b7b453SJohn Marino 
166cf28ed85SJohn Marino #define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
16795b7b453SJohn Marino   streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
16895b7b453SJohn Marino 
16995b7b453SJohn Marino #else
17095b7b453SJohn Marino 
171cf28ed85SJohn Marino #define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
17295b7b453SJohn Marino   (strcmp (s1, s2) == 0)
17395b7b453SJohn Marino 
17495b7b453SJohn Marino #endif
17595b7b453SJohn Marino 
17695b7b453SJohn Marino #endif /* _GL_STREQ_H */
177