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