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