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