dhcpd-pools  3.0
ISC dhcpd lease usage analyser
All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
c-strcaseeq.h
Go to the documentation of this file.
1 /* Optimized case-insensitive string comparison in C locale.
2  Copyright (C) 2001-2002, 2007, 2009-2017 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  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 <https://www.gnu.org/licenses/>. */
16 
17 /* Written by Bruno Haible <bruno@clisp.org>. */
18 
19 #include "c-strcase.h"
20 #include "c-ctype.h"
21 
22 /* STRCASEEQ allows to optimize string comparison with a small literal string.
23  STRCASEEQ (s, "UTF-8", 'U','T','F','-','8',0,0,0,0)
24  is semantically equivalent to
25  c_strcasecmp (s, "UTF-8") == 0
26  just faster. */
27 
28 /* Help GCC to generate good code for string comparisons with
29  immediate strings. */
30 #if defined (__GNUC__) && defined (__OPTIMIZE__)
31 
32 /* Case insensitive comparison of ASCII characters. */
33 # if C_CTYPE_ASCII
34 # define CASEEQ(other,upper) \
35  (c_isupper (upper) ? ((other) & ~0x20) == (upper) : (other) == (upper))
36 # else
37 # define CASEEQ(other,upper) \
38  (c_toupper (other) == (upper))
39 # endif
40 
41 static inline int
42 strcaseeq9 (const char *s1, const char *s2)
43 {
44  return c_strcasecmp (s1 + 9, s2 + 9) == 0;
45 }
46 
47 static inline int
48 strcaseeq8 (const char *s1, const char *s2, char s28)
49 {
50  if (CASEEQ (s1[8], s28))
51  {
52  if (s28 == 0)
53  return 1;
54  else
55  return strcaseeq9 (s1, s2);
56  }
57  else
58  return 0;
59 }
60 
61 static inline int
62 strcaseeq7 (const char *s1, const char *s2, char s27, char s28)
63 {
64  if (CASEEQ (s1[7], s27))
65  {
66  if (s27 == 0)
67  return 1;
68  else
69  return strcaseeq8 (s1, s2, s28);
70  }
71  else
72  return 0;
73 }
74 
75 static inline int
76 strcaseeq6 (const char *s1, const char *s2, char s26, char s27, char s28)
77 {
78  if (CASEEQ (s1[6], s26))
79  {
80  if (s26 == 0)
81  return 1;
82  else
83  return strcaseeq7 (s1, s2, s27, s28);
84  }
85  else
86  return 0;
87 }
88 
89 static inline int
90 strcaseeq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
91 {
92  if (CASEEQ (s1[5], s25))
93  {
94  if (s25 == 0)
95  return 1;
96  else
97  return strcaseeq6 (s1, s2, s26, s27, s28);
98  }
99  else
100  return 0;
101 }
102 
103 static inline int
104 strcaseeq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
105 {
106  if (CASEEQ (s1[4], s24))
107  {
108  if (s24 == 0)
109  return 1;
110  else
111  return strcaseeq5 (s1, s2, s25, s26, s27, s28);
112  }
113  else
114  return 0;
115 }
116 
117 static inline int
118 strcaseeq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
119 {
120  if (CASEEQ (s1[3], s23))
121  {
122  if (s23 == 0)
123  return 1;
124  else
125  return strcaseeq4 (s1, s2, s24, s25, s26, s27, s28);
126  }
127  else
128  return 0;
129 }
130 
131 static inline int
132 strcaseeq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
133 {
134  if (CASEEQ (s1[2], s22))
135  {
136  if (s22 == 0)
137  return 1;
138  else
139  return strcaseeq3 (s1, s2, s23, s24, s25, s26, s27, s28);
140  }
141  else
142  return 0;
143 }
144 
145 static inline int
146 strcaseeq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
147 {
148  if (CASEEQ (s1[1], s21))
149  {
150  if (s21 == 0)
151  return 1;
152  else
153  return strcaseeq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
154  }
155  else
156  return 0;
157 }
158 
159 static inline int
160 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)
161 {
162  if (CASEEQ (s1[0], s20))
163  {
164  if (s20 == 0)
165  return 1;
166  else
167  return strcaseeq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
168  }
169  else
170  return 0;
171 }
172 
173 #define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
174  strcaseeq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
175 
176 #else
177 
178 #define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
179  (c_strcasecmp (s1, s2) == 0)
180 
181 #endif
int c_strcasecmp(const char *s1, const char *s2) _GL_ATTRIBUTE_PURE
Definition: c-strcasecmp.c:27