~ubuntu-branches/ubuntu/vivid/gzip/vivid

« back to all changes in this revision

Viewing changes to lib/c-ctype.c

  • Committer: Steve Langasek
  • Date: 2012-06-29 02:07:40 UTC
  • mfrom: (4.1.9 sid)
  • Revision ID: steve.langasek@canonical.com-20120629020740-qqikrblzana08v2y
Merge version 1.5-1.1 from Debian

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
27
c_isascii (int c)
 
28
{
 
29
  return (c >= 0x00 && c <= 0x7f);
 
30
}
 
31
 
 
32
bool
 
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
 
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
 
97
c_isblank (int c)
 
98
{
 
99
  return (c == ' ' || c == '\t');
 
100
}
 
101
 
 
102
bool
 
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
 
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
 
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
 
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
 
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
 
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
 
266
c_isspace (int c)
 
267
{
 
268
  return (c == ' ' || c == '\t'
 
269
          || c == '\n' || c == '\v' || c == '\f' || c == '\r');
 
270
}
 
271
 
 
272
bool
 
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
 
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
 
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
 
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
}