132
|
1
|
|
2 /*
|
|
3 * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com
|
|
4 * Written by Walter Bright
|
|
5 *
|
|
6 * This software is provided 'as-is', without any express or implied
|
|
7 * warranty. In no event will the authors be held liable for any damages
|
|
8 * arising from the use of this software.
|
|
9 *
|
|
10 * Permission is granted to anyone to use this software for any purpose,
|
|
11 * including commercial applications, and to alter it and redistribute it
|
|
12 * freely, in both source and binary form, subject to the following
|
|
13 * restrictions:
|
|
14 *
|
|
15 * o The origin of this software must not be misrepresented; you must not
|
|
16 * claim that you wrote the original software. If you use this software
|
|
17 * in a product, an acknowledgment in the product documentation would be
|
|
18 * appreciated but is not required.
|
|
19 * o Altered source versions must be plainly marked as such, and must not
|
|
20 * be misrepresented as being the original software.
|
|
21 * o This notice may not be removed or altered from any source
|
|
22 * distribution.
|
|
23 */
|
|
24
|
|
25 // Simple ASCII char classification functions
|
|
26
|
|
27 module util.ctype;
|
|
28
|
|
29 int isalnum(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG) : 0; }
|
|
30 int isalpha(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP) : 0; }
|
|
31 int iscntrl(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_CTL) : 0; }
|
|
32 int isdigit(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_DIG) : 0; }
|
|
33 int islower(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_LC) : 0; }
|
|
34 int ispunct(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_PNC) : 0; }
|
|
35 int isspace(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_SPC) : 0; }
|
|
36 int isupper(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_UC) : 0; }
|
|
37 int isxdigit(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_HEX) : 0; }
|
|
38 int isgraph(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG|_PNC) : 0; }
|
|
39 int isprint(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG|_PNC|_BLK) : 0; }
|
|
40 int isascii(dchar c) { return c <= 0x7F; }
|
|
41
|
|
42 dchar tolower(dchar c)
|
|
43 out (result)
|
|
44 {
|
|
45 assert(!isupper(result));
|
|
46 }
|
|
47 body
|
|
48 {
|
|
49 return isupper(c) ? c + (cast(dchar)'a' - 'A') : c;
|
|
50 }
|
|
51
|
|
52 dchar toupper(dchar c)
|
|
53 out (result)
|
|
54 {
|
|
55 assert(!islower(result));
|
|
56 }
|
|
57 body
|
|
58 {
|
|
59 return islower(c) ? c - (cast(dchar)'a' - 'A') : c;
|
|
60 }
|
|
61
|
|
62 private:
|
|
63
|
|
64 enum
|
|
65 {
|
|
66 _SPC = 8,
|
|
67 _CTL = 0x20,
|
|
68 _BLK = 0x40,
|
|
69 _HEX = 0x80,
|
|
70 _UC = 1,
|
|
71 _LC = 2,
|
|
72 _PNC = 0x10,
|
|
73 _DIG = 4,
|
|
74 _ALP = _UC|_LC,
|
|
75 }
|
|
76
|
|
77 ubyte _ctype[128] =
|
|
78 [
|
|
79 _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,
|
|
80 _CTL,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL,_CTL,
|
|
81 _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,
|
|
82 _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,
|
|
83 _SPC|_BLK,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,
|
|
84 _PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,
|
|
85 _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,
|
|
86 _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,
|
|
87 _PNC,_PNC,_PNC,_PNC,_PNC,_PNC,
|
|
88 _PNC,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC,
|
|
89 _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC,
|
|
90 _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC,
|
|
91 _UC,_UC,_UC,_PNC,_PNC,_PNC,_PNC,_PNC,
|
|
92 _PNC,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC,
|
|
93 _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC,
|
|
94 _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC,
|
|
95 _LC,_LC,_LC,_PNC,_PNC,_PNC,_PNC,_CTL
|
|
96 ];
|
|
97
|
|
98
|
|
99 unittest
|
|
100 {
|
|
101 assert(isspace(' '));
|
|
102 assert(!isspace('z'));
|
|
103 assert(toupper('a') == 'A');
|
|
104 assert(tolower('Q') == 'q');
|
|
105 assert(!isxdigit('G'));
|
|
106 }
|