+# Characters with special properties\r
+special = {\r
+ # Blank characters\r
+ 0x0020: BIT_SPACE | BIT_BLANK, # space\r
+ 0x0009: BIT_SPACE | BIT_BLANK, # tab\r
+\r
+ # Digits\r
+ 0x0030: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
+ 0x0031: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
+ 0x0032: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
+ 0x0033: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
+ 0x0034: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
+ 0x0035: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
+ 0x0036: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
+ 0x0037: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
+ 0x0038: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
+ 0x0039: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
+\r
+ # A-F (hex uppercase)\r
+ 0x0041: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
+ 0x0042: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
+ 0x0043: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
+ 0x0044: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
+ 0x0045: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
+ 0x0046: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
+\r
+\r
+ # a-f (hex lowercase)\r
+ 0x0061: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
+ 0x0062: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
+ 0x0063: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
+ 0x0064: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
+ 0x0065: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
+ 0x0066: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
+}\r
+\r
+class Group:\r
+ def __init__(self, start, flags, upper_delta, lower_delta):\r
+ self.start = start\r
+ self.flags = flags\r
+ self.upper_delta = upper_delta\r
+ self.lower_delta = lower_delta\r
+ self.chars = []\r
+\r
+ def add_char(self, num, label):\r
+ self.chars.append((num, label))\r
+\r
+ def write_to_file(self, f):\r
+ for char in self.chars:\r
+ f.write("// %x %s\n" % char)\r
+ f.write(" { 0x%X, \t0x%X, \t0x%X, \t%d, \t%d },\n" %\r
+ (self.start, len(self.chars), self.flags, self.lower_delta, self.upper_delta))\r
+\r
+ def next(self):\r
+ return self.start + len(self.chars)\r
+\r
+groups = []\r
+\r
+def add_char(num, upper, lower, bits, label):\r
+ upper_delta = upper - num\r
+ lower_delta = lower - num\r
+\r
+ if len(groups) != 0:\r
+ cur = groups[-1]\r
+ if num == cur.next() and cur.flags == bits and \\r
+ cur.upper_delta == upper_delta and \\r
+ cur.lower_delta == lower_delta:\r
+ cur.add_char(num, label)\r
+ return\r
+\r
+ g = Group(num, bits, upper_delta, lower_delta)\r
+ g.add_char(num, label)\r
+ groups.append(g)\r
+\r