view Tools/scripts/make_ctype.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 65d5ecefd50d
children
line wrap: on
line source

#!/usr/bin/env python3
"""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)
""")