blob: 359d6b3160f24ebb47803308ded34c8b00433d29 [file] [log] [blame]
Guido van Rossum174ce202007-10-09 17:30:03 +00001"""Script that generates the ctype.h-replacement in stringobject.c."""
2
3NAMES = ("LOWER", "UPPER", "ALPHA", "DIGIT", "XDIGIT", "ALNUM", "SPACE")
4
5print("""
6#define FLAG_LOWER 0x01
7#define FLAG_UPPER 0x02
8#define FLAG_ALPHA (FLAG_LOWER|FLAG_UPPER)
9#define FLAG_DIGIT 0x04
10#define FLAG_ALNUM (FLAG_ALPHA|FLAG_DIGIT)
11#define FLAG_SPACE 0x08
12#define FLAG_XDIGIT 0x10
13
14static unsigned int ctype_table[256] = {""")
15
16for i in range(128):
17 c = chr(i)
18 flags = []
19 for name in NAMES:
20 if name in ("ALPHA", "ALNUM"):
21 continue
22 if name == "XDIGIT":
23 method = lambda: c.isdigit() or c.upper() in "ABCDEF"
24 else:
25 method = getattr(c, "is" + name.lower())
26 if method():
27 flags.append("FLAG_" + name)
28 rc = repr(c)
29 if c == '\v':
30 rc = "'\\v'"
31 elif c == '\f':
32 rc = "'\\f'"
33 if not flags:
34 print(" 0, /* 0x%x %s */" % (i, rc))
35 else:
36 print(" %s, /* 0x%x %s */" % ("|".join(flags), i, rc))
37
38for i in range(128, 256, 16):
39 print(" %s," % ", ".join(16*["0"]))
40
41print("};")
42print("")
43
44for name in NAMES:
45 print("#define IS%s(c) (ctype_table[Py_CHARMASK(c)] & FLAG_%s)" %
46 (name, name))
47
48print("")
49
50for name in NAMES:
51 name = "is" + name.lower()
52 print("#undef %s" % name)
53 print("#define %s(c) undefined_%s(c)" % (name, name))
54
55print("""
56static unsigned char ctype_tolower[256] = {""")
57
58for i in range(0, 256, 8):
59 values = []
60 for i in range(i, i+8):
61 if i < 128:
62 c = chr(i)
63 if c.isupper():
64 i = ord(c.lower())
65 values.append("0x%02x" % i)
66 print(" %s," % ", ".join(values))
67
68print("};")
69
70print("""
71static unsigned char ctype_toupper[256] = {""")
72
73for i in range(0, 256, 8):
74 values = []
75 for i in range(i, i+8):
76 if i < 128:
77 c = chr(i)
78 if c.islower():
79 i = ord(c.upper())
80 values.append("0x%02x" % i)
81 print(" %s," % ", ".join(values))
82
83print("};")
84
85print("""
86#define TOLOWER(c) (ctype_tolower[Py_CHARMASK(c)])
87#define TOUPPER(c) (ctype_toupper[Py_CHARMASK(c)])
88
89#undef tolower
90#define tolower(c) undefined_tolower(c)
91#undef toupper
92#define toupper(c) undefined_toupper(c)
93""")