| 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 |