You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.2 KiB
95 lines
2.2 KiB
5 years ago
|
#!/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)
|
||
|
""")
|