Annotation of embedaddon/libiconv/srclib/streq.h, revision 1.1.1.2
1.1 misho 1: /* Optimized string comparison.
1.1.1.2 ! misho 2: Copyright (C) 2001-2002, 2007, 2009-2011 Free Software Foundation, Inc.
1.1 misho 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
1.1.1.2 ! misho 12: General Public License for more details.
1.1 misho 13:
14: You should have received a copy of the GNU General Public License
15: along with this program. If not, see <http://www.gnu.org/licenses/>. */
16:
17: /* Written by Bruno Haible <bruno@clisp.org>. */
18:
19: #ifndef _GL_STREQ_H
20: #define _GL_STREQ_H
21:
22: #include <string.h>
23:
24: /* STREQ allows to optimize string comparison with a small literal string.
25: STREQ (s, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
26: is semantically equivalent to
27: strcmp (s, "EUC-KR") == 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: static inline int
35: streq9 (const char *s1, const char *s2)
36: {
37: return strcmp (s1 + 9, s2 + 9) == 0;
38: }
39:
40: static inline int
41: streq8 (const char *s1, const char *s2, char s28)
42: {
43: if (s1[8] == s28)
44: {
45: if (s28 == 0)
46: return 1;
47: else
48: return streq9 (s1, s2);
49: }
50: else
51: return 0;
52: }
53:
54: static inline int
55: streq7 (const char *s1, const char *s2, char s27, char s28)
56: {
57: if (s1[7] == s27)
58: {
59: if (s27 == 0)
60: return 1;
61: else
62: return streq8 (s1, s2, s28);
63: }
64: else
65: return 0;
66: }
67:
68: static inline int
69: streq6 (const char *s1, const char *s2, char s26, char s27, char s28)
70: {
71: if (s1[6] == s26)
72: {
73: if (s26 == 0)
74: return 1;
75: else
76: return streq7 (s1, s2, s27, s28);
77: }
78: else
79: return 0;
80: }
81:
82: static inline int
83: streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
84: {
85: if (s1[5] == s25)
86: {
87: if (s25 == 0)
88: return 1;
89: else
90: return streq6 (s1, s2, s26, s27, s28);
91: }
92: else
93: return 0;
94: }
95:
96: static inline int
97: streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
98: {
99: if (s1[4] == s24)
100: {
101: if (s24 == 0)
102: return 1;
103: else
104: return streq5 (s1, s2, s25, s26, s27, s28);
105: }
106: else
107: return 0;
108: }
109:
110: static inline int
111: streq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
112: {
113: if (s1[3] == s23)
114: {
115: if (s23 == 0)
116: return 1;
117: else
118: return streq4 (s1, s2, s24, s25, s26, s27, s28);
119: }
120: else
121: return 0;
122: }
123:
124: static inline int
125: streq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
126: {
127: if (s1[2] == s22)
128: {
129: if (s22 == 0)
130: return 1;
131: else
132: return streq3 (s1, s2, s23, s24, s25, s26, s27, s28);
133: }
134: else
135: return 0;
136: }
137:
138: static inline int
139: streq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
140: {
141: if (s1[1] == s21)
142: {
143: if (s21 == 0)
144: return 1;
145: else
146: return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
147: }
148: else
149: return 0;
150: }
151:
152: static inline int
153: 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)
154: {
155: if (s1[0] == s20)
156: {
157: if (s20 == 0)
158: return 1;
159: else
160: return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
161: }
162: else
163: return 0;
164: }
165:
166: #define STREQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
167: streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
168:
169: #else
170:
171: #define STREQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
172: (strcmp (s1, s2) == 0)
173:
174: #endif
175:
176: #endif /* _GL_STREQ_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>