From 174ce20865ee31998cbc42214b4446cad1f26c34 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 9 Oct 2007 17:30:03 +0000 Subject: Silly script I'd rather not throw away. --- Tools/scripts/make_ctype.py | 93 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 Tools/scripts/make_ctype.py diff --git a/Tools/scripts/make_ctype.py b/Tools/scripts/make_ctype.py new file mode 100644 index 0000000..359d6b3 --- /dev/null +++ b/Tools/scripts/make_ctype.py @@ -0,0 +1,93 @@ +"""Script that generates the ctype.h-replacement in stringobject.c.""" + +NAMES = ("LOWER", "UPPER", "ALPHA", "DIGIT", "XDIGIT", "ALNUM", "SPACE") + +print(""" +#define FLAG_LOWER 0x01 +#define FLAG_UPPER 0x02 +#define FLAG_ALPHA (FLAG_LOWER|FLAG_UPPER) +#define FLAG_DIGIT 0x04 +#define FLAG_ALNUM (FLAG_ALPHA|FLAG_DIGIT) +#define FLAG_SPACE 0x08 +#define FLAG_XDIGIT 0x10 + +static unsigned int ctype_table[256] = {""") + +for i in range(128): + c = chr(i) + flags = [] + for name in NAMES: + if name in ("ALPHA", "ALNUM"): + continue + if name == "XDIGIT": + method = lambda: c.isdigit() or c.upper() in "ABCDEF" + else: + method = getattr(c, "is" + name.lower()) + if method(): + flags.append("FLAG_" + name) + rc = repr(c) + if c == '\v': + rc = "'\\v'" + elif c == '\f': + rc = "'\\f'" + if not flags: + print(" 0, /* 0x%x %s */" % (i, rc)) + else: + print(" %s, /* 0x%x %s */" % ("|".join(flags), i, rc)) + +for i in range(128, 256, 16): + print(" %s," % ", ".join(16*["0"])) + +print("};") +print("") + +for name in NAMES: + print("#define IS%s(c) (ctype_table[Py_CHARMASK(c)] & FLAG_%s)" % + (name, name)) + +print("") + +for name in NAMES: + name = "is" + name.lower() + print("#undef %s" % name) + print("#define %s(c) undefined_%s(c)" % (name, name)) + +print(""" +static unsigned char ctype_tolower[256] = {""") + +for i in range(0, 256, 8): + values = [] + for i in range(i, i+8): + if i < 128: + c = chr(i) + if c.isupper(): + i = ord(c.lower()) + values.append("0x%02x" % i) + print(" %s," % ", ".join(values)) + +print("};") + +print(""" +static unsigned char ctype_toupper[256] = {""") + +for i in range(0, 256, 8): + values = [] + for i in range(i, i+8): + if i < 128: + c = chr(i) + if c.islower(): + i = ord(c.upper()) + values.append("0x%02x" % i) + print(" %s," % ", ".join(values)) + +print("};") + +print(""" +#define TOLOWER(c) (ctype_tolower[Py_CHARMASK(c)]) +#define TOUPPER(c) (ctype_toupper[Py_CHARMASK(c)]) + +#undef tolower +#define tolower(c) undefined_tolower(c) +#undef toupper +#define toupper(c) undefined_toupper(c) +""") -- cgit v0.12