1/* Optimized string comparison.
2   Copyright (C) 2001-2002 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 Library General Public License as published
6   by the Free Software Foundation; either version 2, or (at your option)
7   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   Library General Public License for more details.
13
14   You should have received a copy of the GNU Library General Public
15   License along with this program; if not, write to the Free Software
16   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
17   USA.  */
18
19/* Written by Bruno Haible <bruno@clisp.org>.  */
20
21#include <string.h>
22
23/* Help GCC to generate good code for string comparisons with
24   immediate strings. */
25#if defined (__GNUC__) && defined (__OPTIMIZE__)
26
27static inline int
28streq9 (const char *s1, const char *s2)
29{
30  return strcmp (s1 + 9, s2 + 9) == 0;
31}
32
33static inline int
34streq8 (const char *s1, const char *s2, char s28)
35{
36  if (s1[8] == s28)
37    {
38      if (s28 == 0)
39        return 1;
40      else
41        return streq9 (s1, s2);
42    }
43  else
44    return 0;
45}
46
47static inline int
48streq7 (const char *s1, const char *s2, char s27, char s28)
49{
50  if (s1[7] == s27)
51    {
52      if (s27 == 0)
53        return 1;
54      else
55        return streq8 (s1, s2, s28);
56    }
57  else
58    return 0;
59}
60
61static inline int
62streq6 (const char *s1, const char *s2, char s26, char s27, char s28)
63{
64  if (s1[6] == s26)
65    {
66      if (s26 == 0)
67        return 1;
68      else
69        return streq7 (s1, s2, s27, s28);
70    }
71  else
72    return 0;
73}
74
75static inline int
76streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
77{
78  if (s1[5] == s25)
79    {
80      if (s25 == 0)
81        return 1;
82      else
83        return streq6 (s1, s2, s26, s27, s28);
84    }
85  else
86    return 0;
87}
88
89static inline int
90streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
91{
92  if (s1[4] == s24)
93    {
94      if (s24 == 0)
95        return 1;
96      else
97        return streq5 (s1, s2, s25, s26, s27, s28);
98    }
99  else
100    return 0;
101}
102
103static inline int
104streq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
105{
106  if (s1[3] == s23)
107    {
108      if (s23 == 0)
109        return 1;
110      else
111        return streq4 (s1, s2, s24, s25, s26, s27, s28);
112    }
113  else
114    return 0;
115}
116
117static inline int
118streq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
119{
120  if (s1[2] == s22)
121    {
122      if (s22 == 0)
123        return 1;
124      else
125        return streq3 (s1, s2, s23, s24, s25, s26, s27, s28);
126    }
127  else
128    return 0;
129}
130
131static inline int
132streq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
133{
134  if (s1[1] == s21)
135    {
136      if (s21 == 0)
137        return 1;
138      else
139        return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
140    }
141  else
142    return 0;
143}
144
145static inline int
146streq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
147{
148  if (s1[0] == s20)
149    {
150      if (s20 == 0)
151        return 1;
152      else
153        return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
154    }
155  else
156    return 0;
157}
158
159#define STREQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
160  streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
161
162#else
163
164#define STREQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
165  (strcmp (s1, s2) == 0)
166
167#endif
168