phobos/std/ctype.d
2007-09-10 03:11:55 +00:00

90 lines
2.3 KiB
D

// Written by Walter Bright
// Copyright (c) 2001-2003 Digital Mars
// All Rights Reserved
// www.digitalmars.com
// Simple char classification functions
module std.ctype;
int isalnum(char c) { return _ctype[1 + c] & (_ALP|_DIG); }
int isalpha(char c) { return _ctype[1 + c] & (_ALP); }
int iscntrl(char c) { return _ctype[1 + c] & (_CTL); }
int isdigit(char c) { return _ctype[1 + c] & (_DIG); }
int isgraph(char c) { return _ctype[1 + c] & (_ALP|_DIG|_PNC); }
int islower(char c) { return _ctype[1 + c] & (_LC); }
int isprint(char c) { return _ctype[1 + c] & (_ALP|_DIG|_PNC|_BLK); }
int ispunct(char c) { return _ctype[1 + c] & (_PNC); }
int isspace(char c) { return _ctype[1 + c] & (_SPC); }
int isupper(char c) { return _ctype[1 + c] & (_UC); }
int isxdigit(char c) { return _ctype[1 + c] & (_HEX); }
int isascii(char c) { return c <= 0x7F; }
char tolower(char c)
out (result)
{
assert(!isupper(result));
}
body
{
return isupper(c) ? c + (cast(char)'a' - 'A') : c;
}
char toupper(char c)
out (result)
{
assert(!islower(result));
}
body
{
return islower(c) ? c - (cast(char)'a' - 'A') : c;
}
private:
enum
{
_SPC = 8,
_CTL = 0x20,
_BLK = 0x40,
_HEX = 0x80,
_UC = 1,
_LC = 2,
_PNC = 0x10,
_DIG = 4,
_ALP = _UC|_LC,
}
ubyte _ctype[257] =
[ 0,
_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,
_CTL,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL,_CTL,
_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,
_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,
_SPC|_BLK,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,
_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,
_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,
_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,
_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,
_PNC,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC,
_UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC,
_UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC,
_UC,_UC,_UC,_PNC,_PNC,_PNC,_PNC,_PNC,
_PNC,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC,
_LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC,
_LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC,
_LC,_LC,_LC,_PNC,_PNC,_PNC,_PNC,_CTL
// the remaining 128 bytes are 0
];
unittest
{
assert(isspace(' '));
assert(!isspace('z'));
assert(toupper('a') == 'A');
assert(tolower('Q') == 'q');
assert(!isxdigit('G'));
}