summaryrefslogtreecommitdiff
path: root/libc/misc/ctype/ctype.c
blob: a077dbf3c2f0e872c2e9c1ea266624346cf8515f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
/* ctype.c
 * Character classification and conversion
 * Copyright (C) 2000 Lineo, Inc.
 * Written by Erik Andersen
 * This file is part of the uClibc C library and is distributed
 * under the GNU Library General Public License.
 *
 * not C-locale only code
 * written by Vladimir Oleynik (c) vodz@usa.net
 * and Manuel Novoa III <mnovoa3@bellsouth.net>
 * used ideas is part of the GNU C Library.
 */

#define __USE_CTYPE_MACROS
#include <ctype.h>

#ifdef L_isascii
#undef isascii
int
isascii( int c )
{
    return (c > 0 && c <= 0x7f);
}
#endif

#ifdef L_isdigit
#undef isdigit
int
isdigit( int c )
{
    return (c >= '0' && c <= '9');
}
#endif

#ifdef L_toascii
#undef toascii
int
toascii( int c )
{
    return (c & 0x7f);
}
#endif


/* locale depended */
#ifndef __UCLIBC_HAS_LOCALE__

#ifdef L_isalpha
#undef isalpha
int
isalpha( int c )
{
    return (isupper(c) || islower(c));
}
#endif

#ifdef L_isalnum
#undef isalnum
int
isalnum( int c )
{
    return (isalpha(c) || isdigit(c));
}
#endif

#ifdef L_iscntrl
#undef iscntrl
int
iscntrl( int c )
{
    return ((c >= 0) && ((c <= 0x1f) || (c == 0x7f)));
}
#endif

#ifdef L_isgraph
#undef isgraph
int
isgraph( int c )
{
    return (c > ' ' && isprint(c));
}
#endif

#ifdef L_islower
#undef islower
int
islower( int c )
{
    return (c >=  'a' && c <= 'z');
}
#endif

#ifdef L_isprint
#undef isprint
int
isprint( int c )
{
    return (c >= ' ' && c <= '~');
}
#endif

#ifdef L_ispunct
#undef ispunct
int
ispunct( int c )
{
    return ((c > ' ' && c <= '~') && !isalnum(c));
}
#endif

#ifdef L_isspace
#undef isspace
int
isspace( int c )
{
    return (c == ' ' || c == '\f' || c == '\n' || c == '\r' ||
	    c == '\t' || c == '\v');
}
#endif

#ifdef L_isblank
#undef isblank
int
isblank( int c )
{
    return (c == ' ' || c == '\t');
}
#endif

#ifdef L_isupper
#undef isupper
int
isupper( int c )
{
    return (c >=  'A' && c <= 'Z');
}
#endif

#ifdef L_isxdigit
#undef isxdigit
int
isxdigit( int c )
{
    return (isdigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'));
}
#endif

#ifdef L_isxlower
#undef isxlower
int
isxlower( int c )
{
    return (isdigit(c) || (c >= 'a' && c <= 'f'));
}
#endif

#ifdef L_isxupper
#undef isxupper
int
isxupper( int c )
{
    return (isdigit(c) || (c >= 'A' && c <= 'F'));
}
#endif

#ifdef L_tolower
#undef tolower
int
tolower( int c )
{
    return (isupper(c) ? (c - 'A' + 'a') : (c));
}
#endif

#ifdef L_toupper
#undef toupper
int
toupper( int c )
{
    return (islower(c) ? (c - 'a' + 'A') : (c));
}
#endif

#else   /* __UCLIBC_HAS_LOCALE__ */

#include <limits.h>
#include "../locale/_locale.h"

#define _UC_ISCTYPE(c, type) \
((c != -1) && ((_uc_ctype_b[(int)((unsigned char)c)] & type) != 0))

#define _UC_ISCTYPE2(c, type, type2) \
((c != -1) && ((_uc_ctype_b[(int)((unsigned char)c)] & type) == type2))


#ifdef L_ctype_C

/* startup setlocale(LC_TYPE, "C"); */
#include "ctype_C.c"

const unsigned char *_uc_ctype_b     = _uc_ctype_b_C;
const unsigned char *_uc_ctype_trans = _uc_ctype_b_C+LOCALE_BUF_SIZE/2;

#endif  /* L_ctype_C */

#ifdef L_isalpha
#undef isalpha
int
isalpha( int c )
{
    return _UC_ISCTYPE(c, ISalpha);
}
#endif

#ifdef L_isalnum
#undef isalnum
int
isalnum( int c )
{
    return _UC_ISCTYPE(c, (ISalpha|ISxdigit));
}
#endif

#ifdef L_iscntrl
#undef iscntrl
int
iscntrl( int c )
{
    return _UC_ISCTYPE(c, IScntrl);
}
#endif

#ifdef L_isgraph
#undef isgraph
int
isgraph( int c )
{
    return _UC_ISCTYPE2(c, (ISprint|ISspace), ISprint);
}
#endif

#ifdef L_islower
#undef islower
int
islower( int c )
{
    return _UC_ISCTYPE(c, ISlower);
}
#endif

#ifdef L_isprint
#undef isprint
int
isprint( int c )
{
    return _UC_ISCTYPE(c, ISprint);
}
#endif

#ifdef L_ispunct
#undef ispunct
int
ispunct( int c )
{
    return _UC_ISCTYPE(c, ISpunct);
}
#endif

#ifdef L_isspace
#undef isspace
int
isspace( int c )
{
    return _UC_ISCTYPE(c, ISspace);
}
#endif

#ifdef L_isblank
#undef isblank
int
isblank( int c )
{
    return _UC_ISCTYPE(c, ISblank);
}
#endif

#ifdef L_isupper
#undef isupper
int
isupper( int c )
{
    return _UC_ISCTYPE(c, ISupper);
}
#endif

#ifdef L_isxdigit
#undef isxdigit
int
isxdigit( int c )
{
    return _UC_ISCTYPE(c, ISxdigit);
}
#endif

#ifdef L_isxlower
#undef isxlower
int
isxlower( int c )
{
    return _UC_ISCTYPE2(c, (ISxdigit|ISupper), ISxdigit);
}
#endif

#ifdef L_isxupper
#undef isxupper
int
isxupper( int c )
{
    return _UC_ISCTYPE2(c, (ISxdigit|ISlower), ISxdigit);
}
#endif

#ifdef L_tolower
#undef tolower
int
tolower( int c )
{
    if((c < CHAR_MIN) || (c > UCHAR_MAX))
		return c;
    if(isupper(c))
		return _uc_ctype_trans[(int)((unsigned char)c)];
    else
		return c;
}
#endif

#ifdef L_toupper
#undef toupper
int
toupper( int c )
{
    if((c < CHAR_MIN) || (c > UCHAR_MAX))
		return c;
    if(islower(c))
		return _uc_ctype_trans[(int)((unsigned char)c)];
    else
		return c;
}
#endif

#endif