Import upstream version 1.28
[debian/tar] / gnu / c-strcaseeq.h
1 /* -*- buffer-read-only: t -*- vi: set ro: */
2 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
3 /* Optimized case-insensitive string comparison in C locale.
4    Copyright (C) 2001-2002, 2007, 2009-2014 Free Software Foundation, Inc.
5
6    This program is free software: you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published
8    by the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18
19 /* Written by Bruno Haible <bruno@clisp.org>.  */
20
21 #include "c-strcase.h"
22 #include "c-ctype.h"
23
24 /* STRCASEEQ allows to optimize string comparison with a small literal string.
25      STRCASEEQ (s, "UTF-8", 'U','T','F','-','8',0,0,0,0)
26    is semantically equivalent to
27      c_strcasecmp (s, "UTF-8") == 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 /* Case insensitive comparison of ASCII characters.  */
35 # if C_CTYPE_ASCII
36 #  define CASEEQ(other,upper) \
37      (c_isupper (upper) ? ((other) & ~0x20) == (upper) : (other) == (upper))
38 # elif C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
39 #  define CASEEQ(other,upper) \
40      (c_isupper (upper) ? (other) == (upper) || (other) == (upper) - 'A' + 'a' : (other) == (upper))
41 # else
42 #  define CASEEQ(other,upper) \
43      (c_toupper (other) == (upper))
44 # endif
45
46 static inline int
47 strcaseeq9 (const char *s1, const char *s2)
48 {
49   return c_strcasecmp (s1 + 9, s2 + 9) == 0;
50 }
51
52 static inline int
53 strcaseeq8 (const char *s1, const char *s2, char s28)
54 {
55   if (CASEEQ (s1[8], s28))
56     {
57       if (s28 == 0)
58         return 1;
59       else
60         return strcaseeq9 (s1, s2);
61     }
62   else
63     return 0;
64 }
65
66 static inline int
67 strcaseeq7 (const char *s1, const char *s2, char s27, char s28)
68 {
69   if (CASEEQ (s1[7], s27))
70     {
71       if (s27 == 0)
72         return 1;
73       else
74         return strcaseeq8 (s1, s2, s28);
75     }
76   else
77     return 0;
78 }
79
80 static inline int
81 strcaseeq6 (const char *s1, const char *s2, char s26, char s27, char s28)
82 {
83   if (CASEEQ (s1[6], s26))
84     {
85       if (s26 == 0)
86         return 1;
87       else
88         return strcaseeq7 (s1, s2, s27, s28);
89     }
90   else
91     return 0;
92 }
93
94 static inline int
95 strcaseeq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
96 {
97   if (CASEEQ (s1[5], s25))
98     {
99       if (s25 == 0)
100         return 1;
101       else
102         return strcaseeq6 (s1, s2, s26, s27, s28);
103     }
104   else
105     return 0;
106 }
107
108 static inline int
109 strcaseeq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
110 {
111   if (CASEEQ (s1[4], s24))
112     {
113       if (s24 == 0)
114         return 1;
115       else
116         return strcaseeq5 (s1, s2, s25, s26, s27, s28);
117     }
118   else
119     return 0;
120 }
121
122 static inline int
123 strcaseeq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
124 {
125   if (CASEEQ (s1[3], s23))
126     {
127       if (s23 == 0)
128         return 1;
129       else
130         return strcaseeq4 (s1, s2, s24, s25, s26, s27, s28);
131     }
132   else
133     return 0;
134 }
135
136 static inline int
137 strcaseeq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
138 {
139   if (CASEEQ (s1[2], s22))
140     {
141       if (s22 == 0)
142         return 1;
143       else
144         return strcaseeq3 (s1, s2, s23, s24, s25, s26, s27, s28);
145     }
146   else
147     return 0;
148 }
149
150 static inline int
151 strcaseeq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
152 {
153   if (CASEEQ (s1[1], s21))
154     {
155       if (s21 == 0)
156         return 1;
157       else
158         return strcaseeq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
159     }
160   else
161     return 0;
162 }
163
164 static inline int
165 strcaseeq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
166 {
167   if (CASEEQ (s1[0], s20))
168     {
169       if (s20 == 0)
170         return 1;
171       else
172         return strcaseeq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
173     }
174   else
175     return 0;
176 }
177
178 #define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
179   strcaseeq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
180
181 #else
182
183 #define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
184   (c_strcasecmp (s1, s2) == 0)
185
186 #endif