comparison druntime/src/compiler/dmd/util/ctype.d @ 1458:e0b2d67cfe7c

Added druntime (this should be removed once it works).
author Robert Clipsham <robert@octarineparrot.com>
date Tue, 02 Jun 2009 17:43:06 +0100
parents
children
comparison
equal deleted inserted replaced
1456:7b218ec1044f 1458:e0b2d67cfe7c
1 /**
2 * Simple ASCII char classification functions.
3 *
4 * Copyright: Copyright Digital Mars 2004 - 2009.
5 * License: <a href="http://www.boost.org/LICENSE_1_0.txt>Boost License 1.0</a>.
6 * Authors: Walter Bright
7 *
8 * Copyright Digital Mars 2004 - 2009.
9 * Distributed under the Boost Software License, Version 1.0.
10 * (See accompanying file LICENSE_1_0.txt or copy at
11 * http://www.boost.org/LICENSE_1_0.txt)
12 */
13 module rt.util.ctype;
14
15 int isalnum(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG) : 0; }
16 int isalpha(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP) : 0; }
17 int iscntrl(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_CTL) : 0; }
18 int isdigit(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_DIG) : 0; }
19 int islower(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_LC) : 0; }
20 int ispunct(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_PNC) : 0; }
21 int isspace(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_SPC) : 0; }
22 int isupper(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_UC) : 0; }
23 int isxdigit(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_HEX) : 0; }
24 int isgraph(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG|_PNC) : 0; }
25 int isprint(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG|_PNC|_BLK) : 0; }
26 int isascii(dchar c) { return c <= 0x7F; }
27
28 dchar tolower(dchar c)
29 out (result)
30 {
31 assert(!isupper(result));
32 }
33 body
34 {
35 return isupper(c) ? c + (cast(dchar)'a' - 'A') : c;
36 }
37
38 dchar toupper(dchar c)
39 out (result)
40 {
41 assert(!islower(result));
42 }
43 body
44 {
45 return islower(c) ? c - (cast(dchar)'a' - 'A') : c;
46 }
47
48 private:
49
50 enum
51 {
52 _SPC = 8,
53 _CTL = 0x20,
54 _BLK = 0x40,
55 _HEX = 0x80,
56 _UC = 1,
57 _LC = 2,
58 _PNC = 0x10,
59 _DIG = 4,
60 _ALP = _UC|_LC,
61 }
62
63 immutable ubyte _ctype[128] =
64 [
65 _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,
66 _CTL,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL,_CTL,
67 _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,
68 _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,
69 _SPC|_BLK,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,
70 _PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,
71 _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,
72 _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,
73 _PNC,_PNC,_PNC,_PNC,_PNC,_PNC,
74 _PNC,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC,
75 _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC,
76 _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC,
77 _UC,_UC,_UC,_PNC,_PNC,_PNC,_PNC,_PNC,
78 _PNC,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC,
79 _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC,
80 _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC,
81 _LC,_LC,_LC,_PNC,_PNC,_PNC,_PNC,_CTL
82 ];
83
84
85 unittest
86 {
87 assert(isspace(' '));
88 assert(!isspace('z'));
89 assert(toupper('a') == 'A');
90 assert(tolower('Q') == 'q');
91 assert(!isxdigit('G'));
92 }