view Tools/scripts/make_ctype.py @ 51749:1408feec0084 3.0

Merged revisions 69798 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r69798 | benjamin.peterson | 2009-02-19 22:02:38 -0600 (Thu, 19 Feb 2009) | 13 lines Merged revisions 69769,69776 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r69769 | georg.brandl | 2009-02-19 02:30:06 -0600 (Thu, 19 Feb 2009) | 1 line #5310, #3558: fix operator precedence table. ........ r69776 | georg.brandl | 2009-02-19 10:34:51 -0600 (Thu, 19 Feb 2009) | 2 lines #5317: update IronPython URL. ........ ................
author Benjamin Peterson <benjamin@python.org>
date Fri, 20 Feb 2009 04:05:32 +0000
parents 4a72fc5dfb79
children 65d5ecefd50d
line wrap: on
line source

"""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)
""")