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