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