OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/python |
| 2 |
| 3 import sys |
| 4 |
| 5 header = sys.stdin.readline (), sys.stdin.readline () |
| 6 while sys.stdin.readline ().find ('##################') < 0: |
| 7 pass |
| 8 |
| 9 |
| 10 print "/* == Start of generated table == */" |
| 11 print "/*" |
| 12 print " * The following table is generated by running:" |
| 13 print " *" |
| 14 print " * ./gen-arabic-joining-table.py < ArabicShaping.txt" |
| 15 print " *" |
| 16 print " * on the ArabicShaping.txt file with the header:" |
| 17 print " *" |
| 18 for line in header: |
| 19 print " * %s" % (line.strip()) |
| 20 print " */" |
| 21 |
| 22 print "static const uint8_t joining_table[] =" |
| 23 print "{" |
| 24 |
| 25 |
| 26 min_u = 0x110000 |
| 27 max_u = 0 |
| 28 num = 0 |
| 29 last = -1 |
| 30 block = '' |
| 31 for line in sys.stdin: |
| 32 |
| 33 if line[0] == '#': |
| 34 if line.find (" characters"): |
| 35 block = line[2:].strip () |
| 36 continue |
| 37 |
| 38 fields = [x.strip () for x in line.split (';')] |
| 39 if len (fields) == 1: |
| 40 continue |
| 41 |
| 42 u = int (fields[0], 16) |
| 43 if u == 0x200C or u == 0x200D: |
| 44 continue |
| 45 if u < last: |
| 46 raise Exception ("Input data character not sorted", u) |
| 47 min_u = min (min_u, u) |
| 48 max_u = max (max_u, u) |
| 49 num += 1 |
| 50 |
| 51 if block: |
| 52 print "\n /* %s */\n" % block |
| 53 block = '' |
| 54 |
| 55 if last != -1: |
| 56 last += 1 |
| 57 while last < u: |
| 58 print " JOINING_TYPE_X, /* %04X */" % last |
| 59 last += 1 |
| 60 else: |
| 61 last = u |
| 62 |
| 63 if fields[3] in ["ALAPH", "DALATH RISH"]: |
| 64 value = "JOINING_GROUP_" + fields[3].replace(' ', '_') |
| 65 else: |
| 66 value = "JOINING_TYPE_" + fields[2] |
| 67 print " %s, /* %s */" % (value, '; '.join(fields)) |
| 68 |
| 69 print |
| 70 print " JOINING_TYPE_X /* dummy */" |
| 71 print "};" |
| 72 print |
| 73 |
| 74 print "#define JOINING_TABLE_FIRST 0x%04x" % min_u |
| 75 print "#define JOINING_TABLE_LAST 0x%04x" % max_u |
| 76 print |
| 77 |
| 78 print "/* == End of generated table == */" |
| 79 |
| 80 occupancy = num * 100 / (max_u - min_u + 1) |
| 81 # Maintain at least 40% occupancy in the table */ |
| 82 if occupancy < 40: |
| 83 raise Exception ("Table too sparse, please investigate: ", occupancy) |
OLD | NEW |