Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
ctype.cpp
Go to the documentation of this file.
1
29#define _RWSTD_LIB_SRC
30
31#include <rw/_defs.h>
32
33#include <ctype.h>
34#include <limits.h>
35#include <locale.h>
36#include <wctype.h>
37#include <string.h> // for memset()
38
39#include <loc/_ctype.h>
40#include <loc/_locale.h>
41#include <loc/_localedef.h>
42
43#include "access.h"
44#include "setlocale.h"
45#include "use_facet.h"
46
47
49
50// table of character classes
51extern const _STD::ctype_base::mask
52__rw_classic_tab [_STD::ctype<char>::table_size] = {
53
54#undef MASK
55#define MASK(x) _STD::ctype_base::mask (x)
56
57#undef LETTER
58#define LETTER(m) MASK (__rw_print | __rw_alpha | __rw_graph | m)
59
60#if 'A' == 0x41
61
62 /* 0x00 */ __rw_cntrl,
63 /* 0x01 */ __rw_cntrl,
64 /* 0x02 */ __rw_cntrl,
65 /* 0x03 */ __rw_cntrl,
66 /* 0x04 */ __rw_cntrl,
67 /* 0x05 */ __rw_cntrl,
68 /* 0x06 */ __rw_cntrl,
69 /* 0x07 */ __rw_cntrl,
70 /* 0x08 */ __rw_cntrl,
71 /* 0x09 */ MASK (__rw_space | __rw_cntrl),
72 /* 0x0a */ MASK (__rw_space | __rw_cntrl),
73 /* 0x0b */ MASK (__rw_space | __rw_cntrl),
74 /* 0x0c */ MASK (__rw_space | __rw_cntrl),
75 /* 0x0d */ MASK (__rw_space | __rw_cntrl),
76 /* 0x0e */ __rw_cntrl,
77 /* 0x0f */ __rw_cntrl,
78 /* 0x10 */ __rw_cntrl,
79 /* 0x11 */ __rw_cntrl,
80 /* 0x12 */ __rw_cntrl,
81 /* 0x13 */ __rw_cntrl,
82 /* 0x14 */ __rw_cntrl,
83 /* 0x15 */ __rw_cntrl,
84 /* 0x16 */ __rw_cntrl,
85 /* 0x17 */ __rw_cntrl,
86 /* 0x18 */ __rw_cntrl,
87 /* 0x19 */ __rw_cntrl,
88 /* 0x1a */ __rw_cntrl,
89 /* 0x1b */ __rw_cntrl,
90 /* 0x1c */ __rw_cntrl,
91 /* 0x1d */ __rw_cntrl,
92 /* 0x1e */ __rw_cntrl,
93 /* 0x1f */ __rw_cntrl,
94 /* ' ' */ MASK (__rw_space | __rw_print),
95 /* '!' */ MASK (__rw_print | __rw_punct | __rw_graph),
96 /* '"' */ MASK (__rw_print | __rw_punct | __rw_graph),
97 /* '#' */ MASK (__rw_print | __rw_punct | __rw_graph),
98 /* '$' */ MASK (__rw_print | __rw_punct | __rw_graph),
99 /* '%' */ MASK (__rw_print | __rw_punct | __rw_graph),
100 /* '&' */ MASK (__rw_print | __rw_punct | __rw_graph),
101 /* '\'' */ MASK (__rw_print | __rw_punct | __rw_graph),
102 /* '(' */ MASK (__rw_print | __rw_punct | __rw_graph),
103 /* ')' */ MASK (__rw_print | __rw_punct | __rw_graph),
104 /* '*' */ MASK (__rw_print | __rw_punct | __rw_graph),
105 /* '+' */ MASK (__rw_print | __rw_punct | __rw_graph),
106 /* ',' */ MASK (__rw_print | __rw_punct | __rw_graph),
107 /* '-' */ MASK (__rw_print | __rw_punct | __rw_graph),
108 /* '.' */ MASK (__rw_print | __rw_punct | __rw_graph),
109 /* '/' */ MASK (__rw_print | __rw_punct | __rw_graph),
110 /* '0' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
111 /* '1' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
112 /* '2' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
113 /* '3' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
114 /* '4' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
115 /* '5' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
116 /* '6' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
117 /* '7' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
118 /* '8' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
119 /* '9' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
120 /* ':' */ MASK (__rw_print | __rw_punct | __rw_graph),
121 /* ';' */ MASK (__rw_print | __rw_punct | __rw_graph),
122 /* '<' */ MASK (__rw_print | __rw_punct | __rw_graph),
123 /* '=' */ MASK (__rw_print | __rw_punct | __rw_graph),
124 /* '>' */ MASK (__rw_print | __rw_punct | __rw_graph),
125 /* '?' */ MASK (__rw_print | __rw_punct | __rw_graph),
126 /* '@' */ MASK (__rw_print | __rw_punct | __rw_graph),
127
128 /* 'A' */ LETTER (__rw_upper | __rw_xdigit),
129 /* 'B' */ LETTER (__rw_upper | __rw_xdigit),
130 /* 'C' */ LETTER (__rw_upper | __rw_xdigit),
131 /* 'D' */ LETTER (__rw_upper | __rw_xdigit),
132 /* 'E' */ LETTER (__rw_upper | __rw_xdigit),
133 /* 'F' */ LETTER (__rw_upper | __rw_xdigit),
134 /* 'G' */ LETTER (__rw_upper),
135 /* 'H' */ LETTER (__rw_upper),
136 /* 'I' */ LETTER (__rw_upper),
137 /* 'J' */ LETTER (__rw_upper),
138 /* 'K' */ LETTER (__rw_upper),
139 /* 'L' */ LETTER (__rw_upper),
140 /* 'M' */ LETTER (__rw_upper),
141 /* 'N' */ LETTER (__rw_upper),
142 /* 'O' */ LETTER (__rw_upper),
143 /* 'P' */ LETTER (__rw_upper),
144 /* 'Q' */ LETTER (__rw_upper),
145 /* 'R' */ LETTER (__rw_upper),
146 /* 'S' */ LETTER (__rw_upper),
147 /* 'T' */ LETTER (__rw_upper),
148 /* 'U' */ LETTER (__rw_upper),
149 /* 'V' */ LETTER (__rw_upper),
150 /* 'W' */ LETTER (__rw_upper),
151 /* 'X' */ LETTER (__rw_upper),
152 /* 'Y' */ LETTER (__rw_upper),
153 /* 'Z' */ LETTER (__rw_upper),
154 /* '[' */ MASK (__rw_print | __rw_punct | __rw_graph),
155 /* '\\' */ MASK (__rw_print | __rw_punct | __rw_graph),
156 /* ']' */ MASK (__rw_print | __rw_punct | __rw_graph),
157 /* '^' */ MASK (__rw_print | __rw_punct | __rw_graph),
158 /* '_' */ MASK (__rw_print | __rw_punct | __rw_graph),
159 /* '`' */ MASK (__rw_print | __rw_punct | __rw_graph),
160 /* 'a' */ LETTER (__rw_lower | __rw_xdigit),
161 /* 'b' */ LETTER (__rw_lower | __rw_xdigit),
162 /* 'c' */ LETTER (__rw_lower | __rw_xdigit),
163 /* 'd' */ LETTER (__rw_lower | __rw_xdigit),
164 /* 'e' */ LETTER (__rw_lower | __rw_xdigit),
165 /* 'f' */ LETTER (__rw_lower | __rw_xdigit),
166 /* 'g' */ LETTER (__rw_lower),
167 /* 'h' */ LETTER (__rw_lower),
168 /* 'i' */ LETTER (__rw_lower),
169 /* 'j' */ LETTER (__rw_lower),
170 /* 'k' */ LETTER (__rw_lower),
171 /* 'l' */ LETTER (__rw_lower),
172 /* 'm' */ LETTER (__rw_lower),
173 /* 'n' */ LETTER (__rw_lower),
174 /* 'o' */ LETTER (__rw_lower),
175 /* 'p' */ LETTER (__rw_lower),
176 /* 'q' */ LETTER (__rw_lower),
177 /* 'r' */ LETTER (__rw_lower),
178 /* 's' */ LETTER (__rw_lower),
179 /* 't' */ LETTER (__rw_lower),
180 /* 'u' */ LETTER (__rw_lower),
181 /* 'v' */ LETTER (__rw_lower),
182 /* 'w' */ LETTER (__rw_lower),
183 /* 'x' */ LETTER (__rw_lower),
184 /* 'y' */ LETTER (__rw_lower),
185 /* 'z' */ LETTER (__rw_lower),
186 /* '{' */ MASK (__rw_print | __rw_punct | __rw_graph),
187 /* '|' */ MASK (__rw_print | __rw_punct | __rw_graph),
188 /* '}' */ MASK (__rw_print | __rw_punct | __rw_graph),
189 /* '~' */ MASK (__rw_print | __rw_punct | __rw_graph),
190 /* 0x7f */ __rw_cntrl
191
192#elif 'A' == 0xc1
193
194 /* NUL */ __rw_cntrl,
195 /* SOH */ __rw_cntrl,
196 /* STX */ __rw_cntrl,
197 /* ETX */ __rw_cntrl,
198 /* PF */ __rw_cntrl,
199 /* HT */ __rw_cntrl,
200 /* LC */ __rw_cntrl,
201 /* DEL */ __rw_cntrl,
202 /* */ MASK (0),
203 /* */ MASK (0),
204 /* SMM */ __rw_cntrl,
205 /* VT */ __rw_cntrl,
206 /* FF */ __rw_cntrl,
207 /* CR */ __rw_cntrl,
208 /* SO */ __rw_cntrl,
209 /* SI */ __rw_cntrl,
210 /* DLE */ __rw_cntrl,
211 /* DC1 */ __rw_cntrl,
212 /* DC2 */ __rw_cntrl,
213 /* TM */ __rw_cntrl,
214 /* RES */ __rw_cntrl,
215 /* NL */ __rw_cntrl,
216 /* BS */ __rw_cntrl,
217 /* IL */ __rw_cntrl,
218 /* CAN */ __rw_cntrl,
219 /* EM */ __rw_cntrl,
220 /* CC */ __rw_cntrl,
221 /* CU1 */ __rw_cntrl,
222 /* IFS */ __rw_cntrl,
223 /* IGS */ __rw_cntrl,
224 /* IRS */ __rw_cntrl,
225 /* IUS */ __rw_cntrl,
226 /* DS */ __rw_cntrl,
227 /* SOS */ __rw_cntrl,
228 /* FS */ __rw_cntrl,
229 /* */ MASK (0),
230 /* BYP */ __rw_cntrl,
231 /* LF */ __rw_cntrl,
232 /* ETB */ __rw_cntrl,
233 /* ESC */ __rw_cntrl,
234 /* */ MASK (0),
235 /* */ MASK (0),
236 /* SM */ __rw_cntrl,
237 /* CU2 */ __rw_cntrl,
238 /* */ MASK (0),
239 /* ENQ */ __rw_cntrl,
240 /* ACK */ __rw_cntrl,
241 /* BEL */ __rw_cntrl,
242 /* */ MASK (0),
243 /* */ MASK (0),
244 /* SYN */ __rw_cntrl,
245 /* */ MASK (0),
246 /* PN */ __rw_cntrl,
247 /* RS */ __rw_cntrl,
248 /* UC */ __rw_cntrl,
249 /* EOT */ __rw_cntrl,
250 /* */ MASK (0),
251 /* */ MASK (0),
252 /* */ MASK (0),
253 /* CU3 */ __rw_cntrl,
254 /* DC4 */ __rw_cntrl,
255 /* NAK */ __rw_cntrl,
256 /* */ MASK (0),
257 /* SUB */ __rw_cntrl,
258 /* SP */ __rw_cntrl,
259 /* */ MASK (0),
260 /* */ MASK (0),
261 /* */ MASK (0),
262 /* */ MASK (0),
263 /* */ MASK (0),
264 /* */ MASK (0),
265 /* */ MASK (0),
266 /* */ MASK (0),
267 /* */ MASK (0),
268 /* ct. */ MASK (__rw_print | __rw_punct | __rw_graph),
269 /* '.' */ MASK (__rw_print | __rw_punct | __rw_graph),
270 /* '<' */ MASK (__rw_print | __rw_punct | __rw_graph),
271 /* '(' */ MASK (__rw_print | __rw_punct | __rw_graph),
272 /* '+' */ MASK (__rw_print | __rw_punct | __rw_graph),
273 /* '|' */ MASK (__rw_print | __rw_punct | __rw_graph),
274 /* '&' */ MASK (__rw_print | __rw_punct | __rw_graph),
275 /* */ MASK (0),
276 /* */ MASK (0),
277 /* */ MASK (0),
278 /* */ MASK (0),
279 /* */ MASK (0),
280 /* */ MASK (0),
281 /* */ MASK (0),
282 /* */ MASK (0),
283 /* */ MASK (0),
284 /* '!' */ MASK (__rw_print | __rw_punct | __rw_graph),
285 /* '$' */ MASK (__rw_print | __rw_punct | __rw_graph),
286 /* '*' */ MASK (__rw_print | __rw_punct | __rw_graph),
287 /* ')' */ MASK (__rw_print | __rw_punct | __rw_graph),
288 /* ';' */ MASK (__rw_print | __rw_punct | __rw_graph),
289 /* '~' */ MASK (__rw_print | __rw_punct | __rw_graph),
290 /* '-' */ MASK (__rw_print | __rw_punct | __rw_graph),
291 /* '/' */ MASK (__rw_print | __rw_punct | __rw_graph),
292 /* */ MASK (0),
293 /* */ MASK (0),
294 /* */ MASK (0),
295 /* */ MASK (0),
296 /* */ MASK (0),
297 /* */ MASK (0),
298 /* */ MASK (0),
299 /* */ MASK (0),
300 /* */ MASK (0),
301 /* ',' */ MASK (__rw_print | __rw_punct | __rw_graph),
302 /* '%' */ MASK (__rw_print | __rw_punct | __rw_graph),
303 /* '_' */ MASK (__rw_print | __rw_punct | __rw_graph),
304 /* '>' */ MASK (__rw_print | __rw_punct | __rw_graph),
305 /* '?' */ MASK (__rw_print | __rw_punct | __rw_graph),
306 /* */ MASK (0),
307 /* */ MASK (0),
308 /* */ MASK (0),
309 /* */ MASK (0),
310 /* */ MASK (0),
311 /* */ MASK (0),
312 /* */ MASK (0),
313 /* */ MASK (0),
314 /* */ MASK (0),
315 /* */ MASK (0),
316 /* ':' */ MASK (__rw_print | __rw_punct | __rw_graph),
317 /* '#' */ MASK (__rw_print | __rw_punct | __rw_graph),
318 /* '@' */ MASK (__rw_print | __rw_punct | __rw_graph),
319 /* ''' */ MASK (__rw_print | __rw_punct | __rw_graph),
320 /* '=' */ MASK (__rw_print | __rw_punct | __rw_graph),
321 /* '"' */ MASK (__rw_print | __rw_punct | __rw_graph),
322 /* */ MASK (0),
323 /* 'a' */ LETTER (__rw_lower | __rw_xdigit),
324 /* 'b' */ LETTER (__rw_lower | __rw_xdigit),
325 /* 'c' */ LETTER (__rw_lower | __rw_xdigit),
326 /* 'd' */ LETTER (__rw_lower | __rw_xdigit),
327 /* 'e' */ LETTER (__rw_lower | __rw_xdigit),
328 /* 'f' */ LETTER (__rw_lower | __rw_xdigit),
329 /* 'g' */ LETTER (__rw_lower),
330 /* 'h' */ LETTER (__rw_lower),
331 /* 'i' */ LETTER (__rw_lower),
332 /* */ MASK (0),
333 /* */ MASK (0),
334 /* */ MASK (0),
335 /* */ MASK (0),
336 /* */ MASK (0),
337 /* */ MASK (0),
338 /* */ MASK (0),
339 /* 'j' */ LETTER (__rw_lower),
340 /* 'k' */ LETTER (__rw_lower),
341 /* 'l' */ LETTER (__rw_lower),
342 /* 'm' */ LETTER (__rw_lower),
343 /* 'n' */ LETTER (__rw_lower),
344 /* 'o' */ LETTER (__rw_lower),
345 /* 'p' */ LETTER (__rw_lower),
346 /* 'q' */ LETTER (__rw_lower),
347 /* 'r' */ LETTER (__rw_lower),
348 /* */ MASK (0),
349 /* */ MASK (0),
350 /* */ MASK (0),
351 /* */ MASK (0),
352 /* */ MASK (0),
353 /* */ MASK (0),
354 /* */ MASK (0),
355 /* */ MASK (0),
356 /* 's' */ LETTER (__rw_lower),
357 /* 't' */ LETTER (__rw_lower),
358 /* 'u' */ LETTER (__rw_lower),
359 /* 'v' */ LETTER (__rw_lower),
360 /* 'w' */ LETTER (__rw_lower),
361 /* 'x' */ LETTER (__rw_lower),
362 /* 'y' */ LETTER (__rw_lower),
363 /* 'z' */ LETTER (__rw_lower),
364 /* */ MASK (0),
365 /* */ MASK (0),
366 /* */ MASK (0),
367 /* */ MASK (0),
368 /* */ MASK (0),
369 /* */ MASK (0),
370 /* */ MASK (0),
371 /* */ MASK (0),
372 /* */ MASK (0),
373 /* */ MASK (0),
374 /* */ MASK (0),
375 /* */ MASK (0),
376 /* */ MASK (0),
377 /* */ MASK (0),
378 /* */ MASK (0),
379 /* '`' */ MASK (0),
380 /* */ MASK (0),
381 /* */ MASK (0),
382 /* */ MASK (0),
383 /* */ MASK (0),
384 /* */ MASK (0),
385 /* */ MASK (0),
386 /* 'A' */ LETTER (__rw_upper | __rw_xdigit),
387 /* 'B' */ LETTER (__rw_upper | __rw_xdigit),
388 /* 'C' */ LETTER (__rw_upper | __rw_xdigit),
389 /* 'D' */ LETTER (__rw_upper | __rw_xdigit),
390 /* 'E' */ LETTER (__rw_upper | __rw_xdigit),
391 /* 'F' */ LETTER (__rw_upper | __rw_xdigit),
392 /* 'G' */ LETTER (__rw_upper),
393 /* 'H' */ LETTER (__rw_upper),
394 /* 'I' */ LETTER (__rw_upper),
395 /* */ MASK (0),
396 /* */ MASK (0),
397 /* */ MASK (0),
398 /* */ MASK (0),
399 /* */ MASK (0),
400 /* */ MASK (0),
401 /* */ MASK (0),
402 /* 'J' */ LETTER (__rw_upper),
403 /* 'K' */ LETTER (__rw_upper),
404 /* 'L' */ LETTER (__rw_upper),
405 /* 'M' */ LETTER (__rw_upper),
406 /* 'N' */ LETTER (__rw_upper),
407 /* 'O' */ LETTER (__rw_upper),
408 /* 'P' */ LETTER (__rw_upper),
409 /* 'Q' */ LETTER (__rw_upper),
410 /* 'R' */ LETTER (__rw_upper),
411 /* */ MASK (0),
412 /* */ MASK (0),
413 /* */ MASK (0),
414 /* */ MASK (0),
415 /* */ MASK (0),
416 /* */ MASK (0),
417 /* */ MASK (0),
418 /* */ MASK (0),
419 /* 'S' */ LETTER (__rw_upper),
420 /* 'T' */ LETTER (__rw_upper),
421 /* 'U' */ LETTER (__rw_upper),
422 /* 'V' */ LETTER (__rw_upper),
423 /* 'W' */ LETTER (__rw_upper),
424 /* 'X' */ LETTER (__rw_upper),
425 /* 'Y' */ LETTER (__rw_upper),
426 /* 'Z' */ LETTER (__rw_upper),
427 /* */ MASK (0),
428 /* */ MASK (0),
429 /* */ MASK (0),
430 /* */ MASK (0),
431 /* */ MASK (0),
432 /* */ MASK (0),
433 /* '0' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
434 /* '1' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
435 /* '2' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
436 /* '3' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
437 /* '4' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
438 /* '5' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
439 /* '6' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
440 /* '7' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
441 /* '8' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
442 /* '9' */ MASK (__rw_print | __rw_digit | __rw_graph | __rw_xdigit),
443 /* */ MASK (0),
444 /* */ MASK (0),
445 /* */ MASK (0),
446 /* */ MASK (0),
447 /* */ MASK (0),
448 /* */ MASK (0)
449
450#else // 'A' != 0x41 && 'A' != 0xc1
451# error unknown character set (neither ASCII nor EBCDIC)
452#endif // ASCII or EBCDIC
453
454};
455
456
457// table of lowercase to uppercase character mappings
458extern const unsigned char
459__rw_upper_tab [_STD::ctype<char>::table_size + 1] = {
460
461#if 'A' == 0x41
462
463 // basic ASCII:
464 // .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .a .b .c .d .e .f
465 // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
466 // NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI
467 /* 0. */ "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
468 // DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
469 /* 1. */ "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
470 // SPC ! " # $ % ' ' ( ) * + , - . /
471 /* 2. */ "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
472 // 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
473 /* 3. */ "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
474 // A B C D E F G H I J K L M N O
475 /* 4. */ "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
476 // P Q R S T U V W X Y Z [ \ ] ^ _
477 /* 5. */ "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
478 // ` a b c d e f g h i j k l m n o
479 /* 6. */ "\x60\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
480 // p q r s t u v w x y z { | } ~ DEL
481 /* 7. */ "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x7b\x7c\x7d\x7e\x7f"
482
483 // extended ASCII:
484 /* 8. */ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
485 /* 9. */ "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
486 /* a. */ "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
487 /* b. */ "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
488 /* c. */ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
489 /* d. */ "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
490 /* e. */ "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
491 /* f. */ "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
492
493#elif 'A' == 0xc1
494
495 // EBCDIC:
496 // .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .a .b .c .d .e .f
497 // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
498 // NUL SOH STX ETX PF HT LC DEL SMM VT FF CR SO SI
499 /* 0. */ "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
500 // DLE DC1 DC2 TM RES NL BS IL CAN EM CC CU1 IFS IGS IRS IUS
501 /* 1. */ "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
502 // DS SOS FS BYP LF ETB ESC SM CU2 ENQ ACK BEL
503 /* 2. */ "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
504 // SYN PN RS UC EOT CU3 DC4 NAK SUB
505 /* 3. */ "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
506 // SP ct. . < ( + |
507 /* 4. */ "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
508 // & ! $ * ) ; ~
509 /* 5. */ "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
510 // - / , % _ > ?
511 /* 6. */ "\x60\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
512 // : # @ ' = "
513 /* 7. */ "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
514 // a b c d e f g h i
515 /* 8. */ "\x80\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\x8a\x8b\x8c\x8d\x8e\x8f"
516 // j k l m n o p q r
517 /* 9. */ "\x90\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\x9a\x9b\x9c\x9d\x9e\x9f"
518 // s t u v w x y z
519 /* a. */ "\xa0\xa1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xaa\xab\xac\xad\xae\xaf"
520 // `
521 /* b. */ "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
522 // A B C D E F G H I
523 /* c. */ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
524 // J K L M N O P Q R
525 /* d. */ "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
526 // S T U V W X Y Z
527 /* e. */ "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
528 // 0 1 2 3 4 5 6 7 8 9
529 /* f. */ "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
530
531#else // 'A' != 0x41 && 'A' != 0xc1
532# error unknown character set (neither ASCII nor EBCDIC)
533#endif // ASCII or EBCDIC
534
535};
536
537
538// table of uppercase to lowercase character mappings
539extern const unsigned char
540__rw_lower_tab [_STD::ctype<char>::table_size + 1] = {
541
542#if 'A' == 0x41
543
544 // basic ASCII:
545 // .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .a .b .c .d .e .f
546 // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
547 // NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI
548 /* 0. */ "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
549 // DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
550 /* 1. */ "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
551 // SPC ! " # $ % ' ' ( ) * + , - . /
552 /* 2. */ "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
553 // 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
554 /* 3. */ "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
555 // A B C D E F G H I J K L M N O
556 /* 4. */ "\x40\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
557 // P Q R S T U V W X Y Z [ \ ] ^ _
558 /* 5. */ "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x5b\x5c\x5d\x5e\x5f"
559 // ` a b c d e f g h i j k l m n o
560 /* 6. */ "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
561 // p q r s t u v w x y z { | } ~ DEL
562 /* 7. */ "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
563
564 // extended ASCII:
565 /* 8. */ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
566 /* 9. */ "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
567 /* a. */ "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
568 /* b. */ "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
569 /* c. */ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
570 /* d. */ "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
571 /* e. */ "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
572 /* f. */ "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
573
574#elif 'A' == 0xc1
575
576 // EBCDIC:
577 // .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .a .b .c .d .e .f
578 // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
579 // NUL SOH STX ETX PF HT LC DEL SMM VT FF CR SO SI
580 /* 0. */ "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
581 // DLE DC1 DC2 TM RES NL BS IL CAN EM CC CU1 IFS IGS IRS IUS
582 /* 1. */ "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
583 // DS SOS FS BYP LF ETB ESC SM CU2 ENQ ACK BEL
584 /* 2. */ "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
585 // SYN PN RS UC EOT CU3 DC4 NAK SUB
586 /* 3. */ "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
587 // SP ct. . < ( + |
588 /* 4. */ "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
589 // & ! $ * ) ; ~
590 /* 5. */ "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
591 // - / , % _ > ?
592 /* 6. */ "\x60\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
593 // : # @ ' = "
594 /* 7. */ "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
595 // a b c d e f g h i
596 /* 8. */ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
597 // j k l m n o p q r
598 /* 9. */ "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
599 // s t u v w x y z
600 /* a. */ "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
601 // `
602 /* b. */ "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
603 // A B C D E F G H I
604 /* c. */ "\xc0\x81\x82\x83\x84\x85\x86\x87\x88\x89\xca\xcb\xcc\xcd\xce\xcf"
605 // J K L M N O P Q R
606 /* d. */ "\xd0\x91\x92\x93\x94\x95\x96\x97\x98\x99\xda\xdb\xdc\xdd\xde\xdf"
607 // S T U V W X Y Z
608 /* e. */ "\xe0\xe1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xea\xeb\xec\xed\xee\xef"
609 // 0 1 2 3 4 5 6 7 8 9
610 /* f. */ "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
611
612#else // 'A' != 0x41 && 'A' != 0xc1
613# error unknown character set (neither ASCII nor EBCDIC)
614#endif // ASCII or EBCDIC
615
616};
617
618
619_RWSTD_EXPORT __rw_facet::_C_ctor_t __rw_ct_ctype;
620
621_RWSTD_EXPORT __rw_facet* __rw_ct_ctype (_RWSTD_SIZE_T ref, const char *name)
622{
623 __rw_facet* pfacet;
624
625 if (name) {
626 pfacet = new _STD::ctype_byname<char>(name, ref);
627 }
628 else {
629 static union {
630 void *align_;
631 char data_ [sizeof (_STD::ctype<char>)];
632 } f;
633 static __rw_facet* const pf =
634 new (&f) _STD::ctype<char>(__rw_classic_tab, false, ref);
635 pfacet = pf;
636 }
637
638 // set the pointer to the facet id
639 __rw_access::_C_get_pid (*pfacet) =
640 &(__rw_access::_C_get_id (_STD::ctype<char>::id));
641
642 return pfacet;
643}
644
645
646} // namespace __rw
647
648
649typedef _STD::ctype<char> __rw_ctype_facet;
650
652
653
655
656
657_RW::__rw_facet_id ctype<char>::id;
658
659
660ctype<char>::ctype (const mask *tab, bool del, _RWSTD_SIZE_T refs)
661 : _RW::__rw_facet (refs),
662 _C_mask_tab (tab),
663 _C_delete_it (del)
664{
665 // Save the passed table of mask values.
666 if (!_C_mask_tab) {
667 _C_mask_tab = _RW::__rw_classic_tab;
668 // prevent deletion if `tab' was false and `del' was true
669 _C_delete_it = false;
670 }
671
672 _C_upper_tab = _RWSTD_CONST_CAST (_UChar*, _RW::__rw_upper_tab);
673 _C_lower_tab = _RWSTD_CONST_CAST (_UChar*, _RW::__rw_lower_tab);
674
675 memset (_C_narrow_tab, 0, sizeof _C_narrow_tab);
676 memset (_C_wide_tab, 0, sizeof _C_wide_tab);
677}
678
679
680ctype<char>::~ctype ()
681{
682 if (_C_delete_it) {
683 delete[] _RWSTD_CONST_CAST (mask*, _C_mask_tab);
684
685 if (_C_upper_tab != _RW::__rw_upper_tab) {
686 // lower_tab is allocated in the same block of memory
687 // as upper_tab and must not be deleted
688 delete[] _C_upper_tab;
689 }
690 }
691}
692
693
694const ctype<char>::mask* ctype<char>::classic_table () _THROWS (())
695{
696 return _RW::__rw_classic_tab;
697}
698
699
700const ctype<char>::char_type*
701ctype<char>::
702is (const char_type *lo, const char_type *hi, mask *vec) const
703{
704 _RWSTD_ASSERT (lo <= hi);
705 _RWSTD_ASSERT (!hi || (lo && vec));
706 _RWSTD_ASSERT (lo == hi || table ());
707
708 while (lo < hi) {
709 // follows lwg 28
710 *vec++ = table ()[_UChar (*lo++)];
711 }
712 return hi;
713}
714
715
716const ctype<char>::char_type*
717ctype<char>::
718scan_is (mask m, const char_type *lo, const char_type *hi) const
719{
720 _RWSTD_ASSERT (lo <= hi);
721 _RWSTD_ASSERT (!hi || lo);
722 _RWSTD_ASSERT (lo == hi || table ());
723
724 while (lo != hi && !(table ()[_UChar (*lo)] & m))
725 ++lo;
726
727 return lo;
728}
729
730
731const ctype<char>::char_type*
732ctype<char>::
733scan_not (mask m, const char_type *lo, const char_type *hi) const
734{
735 _RWSTD_ASSERT (lo <= hi);
736 _RWSTD_ASSERT (!hi || lo);
737 _RWSTD_ASSERT (lo == hi || table ());
738
739 while (lo != hi && (table ()[_UChar (*lo)] & m))
740 ++lo;
741
742 return lo;
743}
744
745
746/* virtual */ ctype<char>::char_type
747ctype<char>::
748do_toupper (char_type ch) const
749{
750#if _RWSTD_UCHAR_MAX <= 255
751 return _C_upper_tab [_UChar (ch)];
752#else
753 return ch < table_size ? _C_upper_tab [_UChar (ch)] : ch;
754#endif
755}
756
757
758/* virtual */ const ctype<char>::char_type*
759ctype<char>::
760do_toupper (char_type *lo, const char_type *hi) const
761{
762 _RWSTD_ASSERT (lo <= hi);
763 _RWSTD_ASSERT (!hi || lo);
764 _RWSTD_ASSERT (lo == hi || _C_upper_tab);
765
766 for ( ; lo < hi; ++lo)
767 *lo = _C_upper_tab [_UChar (*lo)];
768
769 return lo;
770}
771
772
773/* virtual */ ctype<char>::char_type
774ctype<char>::
775do_tolower (char_type ch) const
776{
777#if _RWSTD_UCHAR_MAX <= 255
778 return _C_lower_tab [_UChar (ch)];
779#else
780 return ch < table_size ? _C_lower_tab [_UChar (ch)] : ch;
781#endif
782}
783
784
785/* virtual */ const ctype<char>::char_type*
786ctype<char>::
787do_tolower (char_type *lo, const char_type *hi) const
788{
789 _RWSTD_ASSERT (lo <= hi);
790 _RWSTD_ASSERT (!hi || lo);
791 _RWSTD_ASSERT (lo == hi || _C_lower_tab);
792
793 for ( ; lo < hi; ++lo)
794 *lo = _C_lower_tab [_UChar (*lo)];
795
796 return lo;
797}
798
799
800/* virtual */ ctype<char>::char_type
801ctype<char>::
802do_widen (char ch) const
803{
804#if _RWSTD_UCHAR_MAX <= 255
805
806 if (_C_wide_tab [_UChar (ch)])
807 return _C_wide_tab [_UChar (ch)];
808
809 return _RWSTD_CONST_CAST (ctype<char>*, this)->
810 _C_wide_tab [_UChar (ch)] = char_type (ch);
811#else
812 return char_type (ch);
813#endif
814}
815
816
817/* virtual */ const ctype<char>::char_type*
818ctype<char>::
819do_widen (const char_type* lo, const char_type* hi, char_type* dst) const
820{
821 _RWSTD_ASSERT (lo <= hi);
822 _RWSTD_ASSERT (!hi || (lo && dst));
823
824 ::memcpy (dst, lo, hi - lo);
825
826 return hi;
827}
828
829
830/* virtual */ ctype<char>::char_type
831ctype<char>::
832do_narrow (char_type ch, char_type) const
833{
834 return ch;
835}
836
837
838/* virtual */ const ctype<char>::char_type*
839ctype<char>::
840do_narrow (const char_type* lo, const char_type* hi, char_type,
841 char_type* dst) const
842{
843 _RWSTD_ASSERT (lo <= hi);
844 _RWSTD_ASSERT (!hi || (lo && dst));
845
846 ::memcpy (dst, lo, hi - lo);
847
848 return hi;
849}
850
851
852ctype_byname<char>::ctype_byname (const char *name, _RWSTD_SIZE_T refs)
853 : ctype<char>(0, false, refs)
854{
855 _RWSTD_ASSERT (0 != name);
856
857 // the name of the locale must be initialized before we attempt
858 // to initialize the tables
859 this->_C_set_name (name, _C_namebuf, sizeof _C_namebuf);
860
861 if ('C' == name [0] && '\0' == name [1])
862 return;
863
864 // delayed initialization not used for efficiency
865 _RW::__rw_ctype_t* impl =
866 _RWSTD_CONST_CAST (_RW::__rw_ctype_t*,
867 _RWSTD_STATIC_CAST (const _RW::__rw_ctype_t*,
868 _RW::__rw_get_facet_data (LC_CTYPE, _C_impsize, _C_name)));
869
870 _C_impdata = impl;
871
872 if (impl == 0 || (this->_C_opts & this->_C_use_libc)) {
873
874 // try to set locale first for exception safety
875 const _RW::__rw_setlocale clocale (name, LC_CTYPE);
876
877 // allocate memory for all three tables
878 _C_mask_tab = new mask [table_size];
879
880 _TRY {
881 // allocate for both the upper and lower table to avoid
882 // having to allocate twice
883 _C_upper_tab = new unsigned char [table_size * 2];
884 _C_lower_tab = _C_upper_tab + table_size;
885
886 // set flag last, after allocation succeeds
887 _C_delete_it = true;
888 }
889 _CATCH (...) {
890 delete[] _RWSTD_CONST_CAST (mask*, _C_mask_tab);
891 _RETHROW;
892 }
893
894 int i;
895
896 for (i = 0; i != _RWSTD_UCHAR_MAX + 1; ++i) {
897
898 int m = 0;
899
900 if ((::isspace)(i))
901 m |= _RW::__rw_space;
902 if ((::isprint)(i))
903 m |= _RW::__rw_print;
904 if ((::iscntrl)(i))
905 m |= _RW::__rw_cntrl;
906 if ((::isupper)(i))
907 m |= _RW::__rw_upper;
908 if ((::islower)(i))
909 m |= _RW::__rw_lower;
910 if ((::isalpha)(i))
911 m |= _RW::__rw_alpha;
912 if ((::isdigit)(i))
913 m |= _RW::__rw_digit;
914 if ((::ispunct)(i))
915 m |= _RW::__rw_punct;
916 if ((::isxdigit)(i))
917 m |= _RW::__rw_xdigit;
918 if ((::isgraph)(i))
919 m |= _RW::__rw_graph;
920
921 _RWSTD_CONST_CAST (mask*, _C_mask_tab)[i] = mask (m);
922 }
923
924 typedef unsigned char UChar;
925
926 unsigned char *p;
927 for (p = _C_upper_tab, i = 0; i != _RWSTD_UCHAR_MAX + 1; ++i, ++p) {
928 const int upr = (::toupper)(i);
929 *p = UChar (_RWSTD_EOF == upr ? 0 : upr);
930 }
931
932 for (p = _C_lower_tab, i = 0; i != _RWSTD_UCHAR_MAX + 1; ++i, ++p) {
933 const int lwr = (::tolower)(i);
934 *p = UChar (_RWSTD_EOF == lwr ? 0 : lwr);
935 }
936 }
937 else {
938 _C_delete_it = false;
939
940 _C_upper_tab = impl->toupper_tab;
941 _C_lower_tab = impl->tolower_tab;
942
943 const mask *mask_tab =
944 _RWSTD_REINTERPRET_CAST (const mask*, impl->mask_tab);
945
946 // verify that mask is the same size
947 _RWSTD_ASSERT (sizeof *mask_tab == sizeof *impl->mask_tab);
948
949 _C_mask_tab = _RWSTD_CONST_CAST (mask*, mask_tab);
950 }
951}
952
953
954} // namespace std
#define m
Definition 17.names.cpp:129
#define i
Definition 17.names.cpp:126
#define pf
Definition 17.names.cpp:516
#define f
Definition 17.names.cpp:119
#define p
Definition 17.names.cpp:132
#define _THROWS()
#define LC_CTYPE
#define _RWSTD_EXPORT
Definition _defs.h:485
#define _RETHROW
Definition _defs.h:853
#define _RWSTD_REINTERPRET_CAST(T, x)
Definition _defs.h:535
#define _RWSTD_STATIC_CAST(T, x)
Definition _defs.h:534
#define _TRY
Definition _defs.h:850
#define _RWSTD_NAMESPACE(name)
Definition _defs.h:567
#define _RWSTD_ASSERT(ignore)
Definition _defs.h:1108
#define _CATCH(ex)
Definition _defs.h:851
#define _RWSTD_CONST_CAST(T, x)
Definition _defs.h:536
A TOML table.
Definition table.hpp:190
const char * name
Definition codecvt1.cpp:72
Definition json.h:5363
unsigned char UChar
Definition collate.cpp:122
#define LETTER(m)
_STD::ctype< char > __rw_ctype_facet
Definition ctype.cpp:649
#define MASK(x)
#define _RWSTD_SPECIALIZE_USE_FACET(fid)
Definition use_facet.h:129