1b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod#!/usr/bin/python
2b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
3b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodimport sys
4b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
5ae4a2b9365051c23c9a299cf76f3ab7e661999b1Behdad Esfahbodif len (sys.argv) != 4:
6b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	print >>sys.stderr, "usage: ./gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt"
7b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	sys.exit (1)
8b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
9171f970e4f72d9fe1af30eab32b96906ee4a14f5Behdad EsfahbodBLACKLISTED_BLOCKS = ["Thai", "Lao", "Tibetan"]
10171f970e4f72d9fe1af30eab32b96906ee4a14f5Behdad Esfahbod
11ae4a2b9365051c23c9a299cf76f3ab7e661999b1Behdad Esfahbodfiles = [file (x) for x in sys.argv[1:]]
12b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
13b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodheaders = [[f.readline () for i in range (2)] for f in files]
14b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
15b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahboddata = [{} for f in files]
16b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodvalues = [{} for f in files]
17b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodfor i, f in enumerate (files):
18b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	for line in f:
19b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
20b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		j = line.find ('#')
21b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		if j >= 0:
22b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			line = line[:j]
23d606daa4cca323c8977b2e52e6863dc0f1b72fa9Behdad Esfahbod
24b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		fields = [x.strip () for x in line.split (';')]
25b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		if len (fields) == 1:
26b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			continue
27b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
28b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		uu = fields[0].split ('..')
29b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		start = int (uu[0], 16)
30b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		if len (uu) == 1:
31b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			end = start
32b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		else:
33b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			end = int (uu[1], 16)
34b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
35b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		t = fields[1]
36b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
37b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		for u in range (start, end + 1):
38b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			data[i][u] = t
395fa21b3ab7175f55f89cb194b544d5d4bd06a481Behdad Esfahbod		values[i][t] = values[i].get (t, 0) + end - start + 1
40b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
41b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod# Merge data into one dict:
42b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahboddefaults = ('Other', 'Not_Applicable', 'No_Block')
43b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodfor i,v in enumerate (defaults):
44b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	values[i][v] = values[i].get (v, 0) + 1
45b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodcombined = {}
46b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodfor i,d in enumerate (data):
47b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	for u,v in d.items ():
48b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		if i == 2 and not u in combined:
49b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			continue
50b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		if not u in combined:
51b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			combined[u] = list (defaults)
52b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		combined[u][i] = v
53171f970e4f72d9fe1af30eab32b96906ee4a14f5Behdad Esfahbodcombined = {k:v for k,v in combined.items() if v[2] not in BLACKLISTED_BLOCKS}
54b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahboddata = combined
55b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahboddel combined
56b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodnum = len (data)
57b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
58d743ce78e10758b7dbaf0cfd191309e5ef646881Behdad Esfahbodfor u in [0x17CD, 0x17CE, 0x17CF, 0x17D0, 0x17D3]:
59d743ce78e10758b7dbaf0cfd191309e5ef646881Behdad Esfahbod	if data[u][0] == 'Other':
60d743ce78e10758b7dbaf0cfd191309e5ef646881Behdad Esfahbod		data[u][0] = "Vowel_Dependent"
61d743ce78e10758b7dbaf0cfd191309e5ef646881Behdad Esfahbod
62b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod# Move the outliers NO-BREAK SPACE and DOTTED CIRCLE out
63b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodsingles = {}
64b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodfor u in [0x00A0, 0x25CC]:
65b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	singles[u] = data[u]
66b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	del data[u]
67b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
68b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint "/* == Start of generated table == */"
69b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint "/*"
70b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint " * The following table is generated by running:"
71b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint " *"
72b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint " *   ./gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt"
73b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint " *"
74b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint " * on files with these headers:"
75b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint " *"
76b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodfor h in headers:
77b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	for l in h:
78b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		print " * %s" % (l.strip())
79b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint " */"
806d4016f1ba48d409800dc3281b93e5cd58c99d9fBehdad Esfahbodprint
813a83d33ec0b1be6f5992816ff5ebb0f43c8dff00Behdad Esfahbodprint '#include "hb-ot-shape-complex-indic-private.hh"'
826d4016f1ba48d409800dc3281b93e5cd58c99d9fBehdad Esfahbodprint
83b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
84b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod# Shorten values
85b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodshort = [{
86b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	"Bindu":		'Bi',
8789e4946929a8cd2359c7d76fa9272d5604243002Behdad Esfahbod	"Cantillation_Mark":	'Ca',
8889e4946929a8cd2359c7d76fa9272d5604243002Behdad Esfahbod	"Joiner":		'ZWJ',
8989e4946929a8cd2359c7d76fa9272d5604243002Behdad Esfahbod	"Non_Joiner":		'ZWNJ',
9089e4946929a8cd2359c7d76fa9272d5604243002Behdad Esfahbod	"Number":		'Nd',
91b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	"Visarga":		'Vs',
92b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	"Vowel":		'Vo',
9381426808020e2b88f008480bd63519aa68c579a7Behdad Esfahbod	"Vowel_Dependent":	'M',
9481426808020e2b88f008480bd63519aa68c579a7Behdad Esfahbod	"Other":		'x',
95b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod},{
9681426808020e2b88f008480bd63519aa68c579a7Behdad Esfahbod	"Not_Applicable":	'x',
97b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod}]
98f2ad86e6053fa87ab188c36edc3d98c92324c049Behdad Esfahbodall_shorts = [{},{}]
99b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
100b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod# Add some of the values, to make them more readable, and to avoid duplicates
101b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
102b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
103b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodfor i in range (2):
104b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	for v,s in short[i].items ():
105f2ad86e6053fa87ab188c36edc3d98c92324c049Behdad Esfahbod		all_shorts[i][s] = v
106b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
107b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodwhat = ["INDIC_SYLLABIC_CATEGORY", "INDIC_MATRA_CATEGORY"]
108b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodwhat_short = ["ISC", "IMC"]
109b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodfor i in range (2):
110b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	print
111b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	vv = values[i].keys ()
112b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	vv.sort ()
113b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	for v in vv:
114b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		v_no_and = v.replace ('_And_', '_')
115b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		if v in short[i]:
116b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			s = short[i][v]
117b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		else:
118b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			s = ''.join ([c for c in v_no_and if ord ('A') <= ord (c) <= ord ('Z')])
119b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			if s in all_shorts[i]:
120f2ad86e6053fa87ab188c36edc3d98c92324c049Behdad Esfahbod				raise Exception ("Duplicate short value alias", v, all_shorts[i][s])
121f2ad86e6053fa87ab188c36edc3d98c92324c049Behdad Esfahbod			all_shorts[i][s] = v
122b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			short[i][v] = s
123b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		print "#define %s_%s	%s_%s	%s/* %3d chars; %s */" % \
124b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			(what_short[i], s, what[i], v.upper (), \
125b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			'	'* ((48-1 - len (what[i]) - 1 - len (v)) / 8), \
126b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			values[i][v], v)
127b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint
128b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint "#define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)"
129b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint
130b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint
131b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
132cdc8b491a8e7cec5082ca2ad0346c1f41fdd5c92Behdad Esfahbodtotal = 0
133cdc8b491a8e7cec5082ca2ad0346c1f41fdd5c92Behdad Esfahbodused = 0
1340436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbodlast_block = None
135b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahboddef print_block (block, start, end, data):
1360436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod	global total, used, last_block
1370436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod	if block and block != last_block:
1380436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod		print
1390436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod		print
1400436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod		print "  /* %s */" % block
141b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	num = 0
142190a251479b3cfc68871ff1daf9a9d1abe3f86e6Behdad Esfahbod	assert start % 8 == 0
143190a251479b3cfc68871ff1daf9a9d1abe3f86e6Behdad Esfahbod	assert (end+1) % 8 == 0
144b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	for u in range (start, end+1):
145b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		if u % 8 == 0:
146b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			print
147b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			print "  /* %04X */" % u,
148b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		if u in data:
149b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			num += 1
150b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		d = data.get (u, defaults)
15181426808020e2b88f008480bd63519aa68c579a7Behdad Esfahbod		sys.stdout.write ("%9s" % ("_(%s,%s)," % (short[0][d[0]], short[1][d[1]])))
152b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
153cdc8b491a8e7cec5082ca2ad0346c1f41fdd5c92Behdad Esfahbod	total += end - start + 1
154cdc8b491a8e7cec5082ca2ad0346c1f41fdd5c92Behdad Esfahbod	used += num
1550436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod	if block:
1560436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod		last_block = block
157b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
158b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahboduu = data.keys ()
159b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahboduu.sort ()
160b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
161dcee838e89c2863c2fda4e8f098e720637e02335Behdad Esfahbodlast = -100000
162b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodnum = 0
163c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbodoffset = 0
164c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbodstarts = []
165c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbodends = []
166c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbodprint "static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {"
167b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodfor u in uu:
168b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	if u <= last:
169b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		continue
170b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	block = data[u][2]
1710436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod
1720436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod	start = u//8*8
1730436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod	end = start+1
17455abfbd2ac1626af16151298a0837b837d0796dfBehdad Esfahbod	while end in uu and block == data[end][2]:
1750436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod		end += 1
1760436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod	end = (end-1)//8*8 + 7
177b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
178b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	if start != last + 1:
1790436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod		if start - last <= 1+16*3:
1800436e1d50527497ebe5053b51a34ce6590276249Behdad Esfahbod			print_block (None, last+1, start-1, data)
181b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			last = start-1
182b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		else:
183b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			if last >= 0:
184c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbod				ends.append (last + 1)
185c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbod				offset += ends[-1] - starts[-1]
186c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbod			print
187c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbod			print
188c09a607a842fdd7b33e2c57e8af96d21ff091acdBehdad Esfahbod			print "#define indic_offset_0x%04xu %d" % (start, offset)
189c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbod			starts.append (start)
190b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
191b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	print_block (block, start, end, data)
192b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	last = end
193c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbodends.append (last + 1)
194c4a59de6d8c1e581b5c155319232be9e805e5cbaBehdad Esfahbodoffset += ends[-1] - starts[-1]
195b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint
196b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint
197cdc8b491a8e7cec5082ca2ad0346c1f41fdd5c92Behdad Esfahbodoccupancy = used * 100. / total
198a133e6067aaebc494c0156b5fac7f4a879e12dbeBehdad Esfahbodpage_bits = 12
19964442a3f4c5c7be08893454742cad6bfe73cb8d7Behdad Esfahbodprint "}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy)
200b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint
2013a83d33ec0b1be6f5992816ff5ebb0f43c8dff00Behdad Esfahbodprint "INDIC_TABLE_ELEMENT_TYPE"
2023a83d33ec0b1be6f5992816ff5ebb0f43c8dff00Behdad Esfahbodprint "hb_indic_get_categories (hb_codepoint_t u)"
203b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint "{"
204a133e6067aaebc494c0156b5fac7f4a879e12dbeBehdad Esfahbodprint "  switch (u >> %d)" % page_bits
20565ac2dae4f284f563b2dc476a21e2b5a48124de8Behdad Esfahbodprint "  {"
206a133e6067aaebc494c0156b5fac7f4a879e12dbeBehdad Esfahbodpages = set([u>>page_bits for u in starts+ends+singles.keys()])
207c2e113404640bf9b8bac469d0803ac946e77964fBehdad Esfahbodfor p in sorted(pages):
208c09a607a842fdd7b33e2c57e8af96d21ff091acdBehdad Esfahbod	print "    case 0x%0Xu:" % p
20965ac2dae4f284f563b2dc476a21e2b5a48124de8Behdad Esfahbod	for (start,end) in zip (starts, ends):
210a133e6067aaebc494c0156b5fac7f4a879e12dbeBehdad Esfahbod		if p not in [start>>page_bits, end>>page_bits]: continue
211c09a607a842fdd7b33e2c57e8af96d21ff091acdBehdad Esfahbod		offset = "indic_offset_0x%04xu" % start
2121aaa7d6799b42b392dd191d3c12011721ef99e74Behdad Esfahbod		print "      if (hb_in_range (u, 0x%04Xu, 0x%04Xu)) return indic_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset)
21365ac2dae4f284f563b2dc476a21e2b5a48124de8Behdad Esfahbod	for u,d in singles.items ():
214a133e6067aaebc494c0156b5fac7f4a879e12dbeBehdad Esfahbod		if p != u>>page_bits: continue
215c09a607a842fdd7b33e2c57e8af96d21ff091acdBehdad Esfahbod		print "      if (unlikely (u == 0x%04Xu)) return _(%s,%s);" % (u, short[0][d[0]], short[1][d[1]])
21665ac2dae4f284f563b2dc476a21e2b5a48124de8Behdad Esfahbod	print "      break;"
21765ac2dae4f284f563b2dc476a21e2b5a48124de8Behdad Esfahbod	print ""
21865ac2dae4f284f563b2dc476a21e2b5a48124de8Behdad Esfahbodprint "    default:"
21965ac2dae4f284f563b2dc476a21e2b5a48124de8Behdad Esfahbodprint "      break;"
22065ac2dae4f284f563b2dc476a21e2b5a48124de8Behdad Esfahbodprint "  }"
22181426808020e2b88f008480bd63519aa68c579a7Behdad Esfahbodprint "  return _(x,x);"
222b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint "}"
223b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint
224b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint "#undef _"
225b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodfor i in range (2):
226b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	print
227b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	vv = values[i].keys ()
228b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	vv.sort ()
229b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod	for v in vv:
230b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod		print "#undef %s_%s" % \
231b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod			(what_short[i], short[i][v])
232b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint
233b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodprint "/* == End of generated table == */"
234cdc8b491a8e7cec5082ca2ad0346c1f41fdd5c92Behdad Esfahbod
235cdc8b491a8e7cec5082ca2ad0346c1f41fdd5c92Behdad Esfahbod# Maintain at least 30% occupancy in the table */
236cdc8b491a8e7cec5082ca2ad0346c1f41fdd5c92Behdad Esfahbodif occupancy < 30:
237cdc8b491a8e7cec5082ca2ad0346c1f41fdd5c92Behdad Esfahbod	raise Exception ("Table too sparse, please investigate: ", occupancy)
238