]> granicus.if.org Git - python/commitdiff
Silly script I'd rather not throw away.
authorGuido van Rossum <guido@python.org>
Tue, 9 Oct 2007 17:30:03 +0000 (17:30 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 9 Oct 2007 17:30:03 +0000 (17:30 +0000)
Tools/scripts/make_ctype.py [new file with mode: 0644]

diff --git a/Tools/scripts/make_ctype.py b/Tools/scripts/make_ctype.py
new file mode 100644 (file)
index 0000000..359d6b3
--- /dev/null
@@ -0,0 +1,93 @@
+"""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)
+""")