1 /* Character handling in C locale.
2 
3    Copyright 2000-2003, 2006, 2009-2012 Free Software Foundation, Inc.
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, see <http://www.gnu.org/licenses/>.  */
17 
18 #include <config.h>
19 
20 /* Specification.  */
21 #define NO_C_CTYPE_MACROS
22 #include "c-ctype.h"
23 
24 /* The function isascii is not locale dependent. Its use in EBCDIC is
25    questionable. */
26 bool
c_isascii(int c)27 c_isascii (int c)
28 {
29   return (c >= 0x00 && c <= 0x7f);
30 }
31 
32 bool
c_isalnum(int c)33 c_isalnum (int c)
34 {
35 #if C_CTYPE_CONSECUTIVE_DIGITS \
36     && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
37 #if C_CTYPE_ASCII
38   return ((c >= '0' && c <= '9')
39           || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z'));
40 #else
41   return ((c >= '0' && c <= '9')
42           || (c >= 'A' && c <= 'Z')
43           || (c >= 'a' && c <= 'z'));
44 #endif
45 #else
46   switch (c)
47     {
48     case '0': case '1': case '2': case '3': case '4': case '5':
49     case '6': case '7': case '8': case '9':
50     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
51     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
52     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
53     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
54     case 'Y': case 'Z':
55     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
56     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
57     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
58     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
59     case 'y': case 'z':
60       return 1;
61     default:
62       return 0;
63     }
64 #endif
65 }
66 
67 bool
c_isalpha(int c)68 c_isalpha (int c)
69 {
70 #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
71 #if C_CTYPE_ASCII
72   return ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z');
73 #else
74   return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
75 #endif
76 #else
77   switch (c)
78     {
79     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
80     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
81     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
82     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
83     case 'Y': case 'Z':
84     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
85     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
86     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
87     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
88     case 'y': case 'z':
89       return 1;
90     default:
91       return 0;
92     }
93 #endif
94 }
95 
96 bool
c_isblank(int c)97 c_isblank (int c)
98 {
99   return (c == ' ' || c == '\t');
100 }
101 
102 bool
c_iscntrl(int c)103 c_iscntrl (int c)
104 {
105 #if C_CTYPE_ASCII
106   return ((c & ~0x1f) == 0 || c == 0x7f);
107 #else
108   switch (c)
109     {
110     case ' ': case '!': case '"': case '#': case '$': case '%':
111     case '&': case '\'': case '(': case ')': case '*': case '+':
112     case ',': case '-': case '.': case '/':
113     case '0': case '1': case '2': case '3': case '4': case '5':
114     case '6': case '7': case '8': case '9':
115     case ':': case ';': case '<': case '=': case '>': case '?':
116     case '@':
117     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
118     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
119     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
120     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
121     case 'Y': case 'Z':
122     case '[': case '\\': case ']': case '^': case '_': case '`':
123     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
124     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
125     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
126     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
127     case 'y': case 'z':
128     case '{': case '|': case '}': case '~':
129       return 0;
130     default:
131       return 1;
132     }
133 #endif
134 }
135 
136 bool
c_isdigit(int c)137 c_isdigit (int c)
138 {
139 #if C_CTYPE_CONSECUTIVE_DIGITS
140   return (c >= '0' && c <= '9');
141 #else
142   switch (c)
143     {
144     case '0': case '1': case '2': case '3': case '4': case '5':
145     case '6': case '7': case '8': case '9':
146       return 1;
147     default:
148       return 0;
149     }
150 #endif
151 }
152 
153 bool
c_islower(int c)154 c_islower (int c)
155 {
156 #if C_CTYPE_CONSECUTIVE_LOWERCASE
157   return (c >= 'a' && c <= 'z');
158 #else
159   switch (c)
160     {
161     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
162     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
163     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
164     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
165     case 'y': case 'z':
166       return 1;
167     default:
168       return 0;
169     }
170 #endif
171 }
172 
173 bool
c_isgraph(int c)174 c_isgraph (int c)
175 {
176 #if C_CTYPE_ASCII
177   return (c >= '!' && c <= '~');
178 #else
179   switch (c)
180     {
181     case '!': case '"': case '#': case '$': case '%': case '&':
182     case '\'': case '(': case ')': case '*': case '+': case ',':
183     case '-': case '.': case '/':
184     case '0': case '1': case '2': case '3': case '4': case '5':
185     case '6': case '7': case '8': case '9':
186     case ':': case ';': case '<': case '=': case '>': case '?':
187     case '@':
188     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
189     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
190     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
191     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
192     case 'Y': case 'Z':
193     case '[': case '\\': case ']': case '^': case '_': case '`':
194     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
195     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
196     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
197     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
198     case 'y': case 'z':
199     case '{': case '|': case '}': case '~':
200       return 1;
201     default:
202       return 0;
203     }
204 #endif
205 }
206 
207 bool
c_isprint(int c)208 c_isprint (int c)
209 {
210 #if C_CTYPE_ASCII
211   return (c >= ' ' && c <= '~');
212 #else
213   switch (c)
214     {
215     case ' ': case '!': case '"': case '#': case '$': case '%':
216     case '&': case '\'': case '(': case ')': case '*': case '+':
217     case ',': case '-': case '.': case '/':
218     case '0': case '1': case '2': case '3': case '4': case '5':
219     case '6': case '7': case '8': case '9':
220     case ':': case ';': case '<': case '=': case '>': case '?':
221     case '@':
222     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
223     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
224     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
225     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
226     case 'Y': case 'Z':
227     case '[': case '\\': case ']': case '^': case '_': case '`':
228     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
229     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
230     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
231     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
232     case 'y': case 'z':
233     case '{': case '|': case '}': case '~':
234       return 1;
235     default:
236       return 0;
237     }
238 #endif
239 }
240 
241 bool
c_ispunct(int c)242 c_ispunct (int c)
243 {
244 #if C_CTYPE_ASCII
245   return ((c >= '!' && c <= '~')
246           && !((c >= '0' && c <= '9')
247                || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z')));
248 #else
249   switch (c)
250     {
251     case '!': case '"': case '#': case '$': case '%': case '&':
252     case '\'': case '(': case ')': case '*': case '+': case ',':
253     case '-': case '.': case '/':
254     case ':': case ';': case '<': case '=': case '>': case '?':
255     case '@':
256     case '[': case '\\': case ']': case '^': case '_': case '`':
257     case '{': case '|': case '}': case '~':
258       return 1;
259     default:
260       return 0;
261     }
262 #endif
263 }
264 
265 bool
c_isspace(int c)266 c_isspace (int c)
267 {
268   return (c == ' ' || c == '\t'
269           || c == '\n' || c == '\v' || c == '\f' || c == '\r');
270 }
271 
272 bool
c_isupper(int c)273 c_isupper (int c)
274 {
275 #if C_CTYPE_CONSECUTIVE_UPPERCASE
276   return (c >= 'A' && c <= 'Z');
277 #else
278   switch (c)
279     {
280     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
281     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
282     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
283     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
284     case 'Y': case 'Z':
285       return 1;
286     default:
287       return 0;
288     }
289 #endif
290 }
291 
292 bool
c_isxdigit(int c)293 c_isxdigit (int c)
294 {
295 #if C_CTYPE_CONSECUTIVE_DIGITS \
296     && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
297 #if C_CTYPE_ASCII
298   return ((c >= '0' && c <= '9')
299           || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'F'));
300 #else
301   return ((c >= '0' && c <= '9')
302           || (c >= 'A' && c <= 'F')
303           || (c >= 'a' && c <= 'f'));
304 #endif
305 #else
306   switch (c)
307     {
308     case '0': case '1': case '2': case '3': case '4': case '5':
309     case '6': case '7': case '8': case '9':
310     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
311     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
312       return 1;
313     default:
314       return 0;
315     }
316 #endif
317 }
318 
319 int
c_tolower(int c)320 c_tolower (int c)
321 {
322 #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
323   return (c >= 'A' && c <= 'Z' ? c - 'A' + 'a' : c);
324 #else
325   switch (c)
326     {
327     case 'A': return 'a';
328     case 'B': return 'b';
329     case 'C': return 'c';
330     case 'D': return 'd';
331     case 'E': return 'e';
332     case 'F': return 'f';
333     case 'G': return 'g';
334     case 'H': return 'h';
335     case 'I': return 'i';
336     case 'J': return 'j';
337     case 'K': return 'k';
338     case 'L': return 'l';
339     case 'M': return 'm';
340     case 'N': return 'n';
341     case 'O': return 'o';
342     case 'P': return 'p';
343     case 'Q': return 'q';
344     case 'R': return 'r';
345     case 'S': return 's';
346     case 'T': return 't';
347     case 'U': return 'u';
348     case 'V': return 'v';
349     case 'W': return 'w';
350     case 'X': return 'x';
351     case 'Y': return 'y';
352     case 'Z': return 'z';
353     default: return c;
354     }
355 #endif
356 }
357 
358 int
c_toupper(int c)359 c_toupper (int c)
360 {
361 #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
362   return (c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c);
363 #else
364   switch (c)
365     {
366     case 'a': return 'A';
367     case 'b': return 'B';
368     case 'c': return 'C';
369     case 'd': return 'D';
370     case 'e': return 'E';
371     case 'f': return 'F';
372     case 'g': return 'G';
373     case 'h': return 'H';
374     case 'i': return 'I';
375     case 'j': return 'J';
376     case 'k': return 'K';
377     case 'l': return 'L';
378     case 'm': return 'M';
379     case 'n': return 'N';
380     case 'o': return 'O';
381     case 'p': return 'P';
382     case 'q': return 'Q';
383     case 'r': return 'R';
384     case 's': return 'S';
385     case 't': return 'T';
386     case 'u': return 'U';
387     case 'v': return 'V';
388     case 'w': return 'W';
389     case 'x': return 'X';
390     case 'y': return 'Y';
391     case 'z': return 'Z';
392     default: return c;
393     }
394 #endif
395 }
396