1*2d1272b8SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*2d1272b8SAndroid Build Coastguard Worker 3*2d1272b8SAndroid Build Coastguard Worker"""usage: ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt 4*2d1272b8SAndroid Build Coastguard Worker 5*2d1272b8SAndroid Build Coastguard WorkerInput files: 6*2d1272b8SAndroid Build Coastguard Worker* https://unicode.org/Public/UCD/latest/ucd/ArabicShaping.txt 7*2d1272b8SAndroid Build Coastguard Worker* https://unicode.org/Public/UCD/latest/ucd/UnicodeData.txt 8*2d1272b8SAndroid Build Coastguard Worker* https://unicode.org/Public/UCD/latest/ucd/Blocks.txt 9*2d1272b8SAndroid Build Coastguard Worker""" 10*2d1272b8SAndroid Build Coastguard Worker 11*2d1272b8SAndroid Build Coastguard Workerimport os.path, sys 12*2d1272b8SAndroid Build Coastguard Worker 13*2d1272b8SAndroid Build Coastguard Workerif len (sys.argv) != 4: 14*2d1272b8SAndroid Build Coastguard Worker sys.exit (__doc__) 15*2d1272b8SAndroid Build Coastguard Worker 16*2d1272b8SAndroid Build Coastguard Workerfiles = [open (x, encoding='utf-8') for x in sys.argv[1:]] 17*2d1272b8SAndroid Build Coastguard Worker 18*2d1272b8SAndroid Build Coastguard Workerheaders = [[files[0].readline (), files[0].readline ()], [files[2].readline (), files[2].readline ()]] 19*2d1272b8SAndroid Build Coastguard Workerheaders.append (["UnicodeData.txt does not have a header."]) 20*2d1272b8SAndroid Build Coastguard Workerwhile files[0].readline ().find ('##################') < 0: 21*2d1272b8SAndroid Build Coastguard Worker pass 22*2d1272b8SAndroid Build Coastguard Worker 23*2d1272b8SAndroid Build Coastguard Workerblocks = {} 24*2d1272b8SAndroid Build Coastguard Workerdef read_blocks(f): 25*2d1272b8SAndroid Build Coastguard Worker global blocks 26*2d1272b8SAndroid Build Coastguard Worker for line in f: 27*2d1272b8SAndroid Build Coastguard Worker 28*2d1272b8SAndroid Build Coastguard Worker j = line.find ('#') 29*2d1272b8SAndroid Build Coastguard Worker if j >= 0: 30*2d1272b8SAndroid Build Coastguard Worker line = line[:j] 31*2d1272b8SAndroid Build Coastguard Worker 32*2d1272b8SAndroid Build Coastguard Worker fields = [x.strip () for x in line.split (';')] 33*2d1272b8SAndroid Build Coastguard Worker if len (fields) == 1: 34*2d1272b8SAndroid Build Coastguard Worker continue 35*2d1272b8SAndroid Build Coastguard Worker 36*2d1272b8SAndroid Build Coastguard Worker uu = fields[0].split ('..') 37*2d1272b8SAndroid Build Coastguard Worker start = int (uu[0], 16) 38*2d1272b8SAndroid Build Coastguard Worker if len (uu) == 1: 39*2d1272b8SAndroid Build Coastguard Worker end = start 40*2d1272b8SAndroid Build Coastguard Worker else: 41*2d1272b8SAndroid Build Coastguard Worker end = int (uu[1], 16) 42*2d1272b8SAndroid Build Coastguard Worker 43*2d1272b8SAndroid Build Coastguard Worker t = fields[1] 44*2d1272b8SAndroid Build Coastguard Worker 45*2d1272b8SAndroid Build Coastguard Worker for u in range (start, end + 1): 46*2d1272b8SAndroid Build Coastguard Worker blocks[u] = t 47*2d1272b8SAndroid Build Coastguard Worker 48*2d1272b8SAndroid Build Coastguard Workerdef print_joining_table(f): 49*2d1272b8SAndroid Build Coastguard Worker 50*2d1272b8SAndroid Build Coastguard Worker values = {} 51*2d1272b8SAndroid Build Coastguard Worker for line in f: 52*2d1272b8SAndroid Build Coastguard Worker 53*2d1272b8SAndroid Build Coastguard Worker if line[0] == '#': 54*2d1272b8SAndroid Build Coastguard Worker continue 55*2d1272b8SAndroid Build Coastguard Worker 56*2d1272b8SAndroid Build Coastguard Worker fields = [x.strip () for x in line.split (';')] 57*2d1272b8SAndroid Build Coastguard Worker if len (fields) == 1: 58*2d1272b8SAndroid Build Coastguard Worker continue 59*2d1272b8SAndroid Build Coastguard Worker 60*2d1272b8SAndroid Build Coastguard Worker u = int (fields[0], 16) 61*2d1272b8SAndroid Build Coastguard Worker 62*2d1272b8SAndroid Build Coastguard Worker if fields[3] in ["ALAPH", "DALATH RISH"]: 63*2d1272b8SAndroid Build Coastguard Worker value = "JOINING_GROUP_" + fields[3].replace(' ', '_') 64*2d1272b8SAndroid Build Coastguard Worker else: 65*2d1272b8SAndroid Build Coastguard Worker value = "JOINING_TYPE_" + fields[2] 66*2d1272b8SAndroid Build Coastguard Worker values[u] = value 67*2d1272b8SAndroid Build Coastguard Worker 68*2d1272b8SAndroid Build Coastguard Worker short_value = {} 69*2d1272b8SAndroid Build Coastguard Worker for value in sorted (set ([v for v in values.values ()] + ['JOINING_TYPE_X'])): 70*2d1272b8SAndroid Build Coastguard Worker short = ''.join(x[0] for x in value.split('_')[2:]) 71*2d1272b8SAndroid Build Coastguard Worker assert short not in short_value.values() 72*2d1272b8SAndroid Build Coastguard Worker short_value[value] = short 73*2d1272b8SAndroid Build Coastguard Worker 74*2d1272b8SAndroid Build Coastguard Worker print () 75*2d1272b8SAndroid Build Coastguard Worker for value,short in short_value.items(): 76*2d1272b8SAndroid Build Coastguard Worker print ("#define %s %s" % (short, value)) 77*2d1272b8SAndroid Build Coastguard Worker 78*2d1272b8SAndroid Build Coastguard Worker uu = sorted(values.keys()) 79*2d1272b8SAndroid Build Coastguard Worker num = len(values) 80*2d1272b8SAndroid Build Coastguard Worker all_blocks = set([blocks[u] for u in uu]) 81*2d1272b8SAndroid Build Coastguard Worker 82*2d1272b8SAndroid Build Coastguard Worker last = -100000 83*2d1272b8SAndroid Build Coastguard Worker ranges = [] 84*2d1272b8SAndroid Build Coastguard Worker for u in uu: 85*2d1272b8SAndroid Build Coastguard Worker if u - last <= 1+16*5: 86*2d1272b8SAndroid Build Coastguard Worker ranges[-1][-1] = u 87*2d1272b8SAndroid Build Coastguard Worker else: 88*2d1272b8SAndroid Build Coastguard Worker ranges.append([u,u]) 89*2d1272b8SAndroid Build Coastguard Worker last = u 90*2d1272b8SAndroid Build Coastguard Worker 91*2d1272b8SAndroid Build Coastguard Worker print () 92*2d1272b8SAndroid Build Coastguard Worker print ("static const uint8_t joining_table[] =") 93*2d1272b8SAndroid Build Coastguard Worker print ("{") 94*2d1272b8SAndroid Build Coastguard Worker last_block = None 95*2d1272b8SAndroid Build Coastguard Worker offset = 0 96*2d1272b8SAndroid Build Coastguard Worker for start,end in ranges: 97*2d1272b8SAndroid Build Coastguard Worker 98*2d1272b8SAndroid Build Coastguard Worker print () 99*2d1272b8SAndroid Build Coastguard Worker print ("#define joining_offset_0x%04xu %d" % (start, offset)) 100*2d1272b8SAndroid Build Coastguard Worker 101*2d1272b8SAndroid Build Coastguard Worker for u in range(start, end+1): 102*2d1272b8SAndroid Build Coastguard Worker 103*2d1272b8SAndroid Build Coastguard Worker block = blocks.get(u, last_block) 104*2d1272b8SAndroid Build Coastguard Worker value = values.get(u, "JOINING_TYPE_X") 105*2d1272b8SAndroid Build Coastguard Worker 106*2d1272b8SAndroid Build Coastguard Worker if block != last_block or u == start: 107*2d1272b8SAndroid Build Coastguard Worker if u != start: 108*2d1272b8SAndroid Build Coastguard Worker print () 109*2d1272b8SAndroid Build Coastguard Worker if block in all_blocks: 110*2d1272b8SAndroid Build Coastguard Worker print ("\n /* %s */" % block) 111*2d1272b8SAndroid Build Coastguard Worker else: 112*2d1272b8SAndroid Build Coastguard Worker print ("\n /* FILLER */") 113*2d1272b8SAndroid Build Coastguard Worker last_block = block 114*2d1272b8SAndroid Build Coastguard Worker if u % 32 != 0: 115*2d1272b8SAndroid Build Coastguard Worker print () 116*2d1272b8SAndroid Build Coastguard Worker print (" /* %04X */" % (u//32*32), " " * (u % 32), end="") 117*2d1272b8SAndroid Build Coastguard Worker 118*2d1272b8SAndroid Build Coastguard Worker if u % 32 == 0: 119*2d1272b8SAndroid Build Coastguard Worker print () 120*2d1272b8SAndroid Build Coastguard Worker print (" /* %04X */ " % u, end="") 121*2d1272b8SAndroid Build Coastguard Worker print ("%s," % short_value[value], end="") 122*2d1272b8SAndroid Build Coastguard Worker print () 123*2d1272b8SAndroid Build Coastguard Worker 124*2d1272b8SAndroid Build Coastguard Worker offset += end - start + 1 125*2d1272b8SAndroid Build Coastguard Worker print () 126*2d1272b8SAndroid Build Coastguard Worker occupancy = num * 100. / offset 127*2d1272b8SAndroid Build Coastguard Worker print ("}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy)) 128*2d1272b8SAndroid Build Coastguard Worker print () 129*2d1272b8SAndroid Build Coastguard Worker 130*2d1272b8SAndroid Build Coastguard Worker page_bits = 12 131*2d1272b8SAndroid Build Coastguard Worker print () 132*2d1272b8SAndroid Build Coastguard Worker print ("static unsigned int") 133*2d1272b8SAndroid Build Coastguard Worker print ("joining_type (hb_codepoint_t u)") 134*2d1272b8SAndroid Build Coastguard Worker print ("{") 135*2d1272b8SAndroid Build Coastguard Worker print (" switch (u >> %d)" % page_bits) 136*2d1272b8SAndroid Build Coastguard Worker print (" {") 137*2d1272b8SAndroid Build Coastguard Worker pages = set([u>>page_bits for u in [s for s,e in ranges]+[e for s,e in ranges]]) 138*2d1272b8SAndroid Build Coastguard Worker for p in sorted(pages): 139*2d1272b8SAndroid Build Coastguard Worker print (" case 0x%0Xu:" % p) 140*2d1272b8SAndroid Build Coastguard Worker for (start,end) in ranges: 141*2d1272b8SAndroid Build Coastguard Worker if p not in [start>>page_bits, end>>page_bits]: continue 142*2d1272b8SAndroid Build Coastguard Worker offset = "joining_offset_0x%04xu" % start 143*2d1272b8SAndroid Build Coastguard Worker print (" if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return joining_table[u - 0x%04Xu + %s];" % (start, end, start, offset)) 144*2d1272b8SAndroid Build Coastguard Worker print (" break;") 145*2d1272b8SAndroid Build Coastguard Worker print ("") 146*2d1272b8SAndroid Build Coastguard Worker print (" default:") 147*2d1272b8SAndroid Build Coastguard Worker print (" break;") 148*2d1272b8SAndroid Build Coastguard Worker print (" }") 149*2d1272b8SAndroid Build Coastguard Worker print (" return X;") 150*2d1272b8SAndroid Build Coastguard Worker print ("}") 151*2d1272b8SAndroid Build Coastguard Worker print () 152*2d1272b8SAndroid Build Coastguard Worker for value,short in short_value.items(): 153*2d1272b8SAndroid Build Coastguard Worker print ("#undef %s" % (short)) 154*2d1272b8SAndroid Build Coastguard Worker print () 155*2d1272b8SAndroid Build Coastguard Worker 156*2d1272b8SAndroid Build Coastguard WorkerLIGATURES = ( 157*2d1272b8SAndroid Build Coastguard Worker 0xF2EE, 0xFC08, 0xFC0E, 0xFC12, 0xFC32, 0xFC3F, 0xFC40, 0xFC41, 0xFC42, 158*2d1272b8SAndroid Build Coastguard Worker 0xFC44, 0xFC4E, 0xFC5E, 0xFC60, 0xFC61, 0xFC62, 0xFC6A, 0xFC6D, 0xFC6F, 159*2d1272b8SAndroid Build Coastguard Worker 0xFC70, 0xFC73, 0xFC75, 0xFC86, 0xFC8F, 0xFC91, 0xFC94, 0xFC9C, 0xFC9D, 160*2d1272b8SAndroid Build Coastguard Worker 0xFC9E, 0xFC9F, 0xFCA1, 0xFCA2, 0xFCA3, 0xFCA4, 0xFCA8, 0xFCAA, 0xFCAC, 161*2d1272b8SAndroid Build Coastguard Worker 0xFCB0, 0xFCC9, 0xFCCA, 0xFCCB, 0xFCCC, 0xFCCD, 0xFCCE, 0xFCCF, 0xFCD0, 162*2d1272b8SAndroid Build Coastguard Worker 0xFCD1, 0xFCD2, 0xFCD3, 0xFCD5, 0xFCDA, 0xFCDB, 0xFCDC, 0xFCDD, 0xFD30, 163*2d1272b8SAndroid Build Coastguard Worker 0xFD88, 0xFEF5, 0xFEF6, 0xFEF7, 0xFEF8, 0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC, 164*2d1272b8SAndroid Build Coastguard Worker 0xF201, 0xF211, 0xF2EE, 165*2d1272b8SAndroid Build Coastguard Worker) 166*2d1272b8SAndroid Build Coastguard Worker 167*2d1272b8SAndroid Build Coastguard Workerdef print_shaping_table(f): 168*2d1272b8SAndroid Build Coastguard Worker 169*2d1272b8SAndroid Build Coastguard Worker shapes = {} 170*2d1272b8SAndroid Build Coastguard Worker ligatures = {} 171*2d1272b8SAndroid Build Coastguard Worker names = {} 172*2d1272b8SAndroid Build Coastguard Worker lines = f.readlines() 173*2d1272b8SAndroid Build Coastguard Worker lines += [ 174*2d1272b8SAndroid Build Coastguard Worker "F201;PUA ARABIC LIGATURE LELLAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 0644 0647;;;;N;;;;;", 175*2d1272b8SAndroid Build Coastguard Worker "F211;PUA ARABIC LIGATURE LAM WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062C;;;;N;;;;;", 176*2d1272b8SAndroid Build Coastguard Worker "F2EE;PUA ARABIC LIGATURE SHADDA WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B 0651;;;;N;;;;;", 177*2d1272b8SAndroid Build Coastguard Worker ] 178*2d1272b8SAndroid Build Coastguard Worker for line in lines: 179*2d1272b8SAndroid Build Coastguard Worker 180*2d1272b8SAndroid Build Coastguard Worker fields = [x.strip () for x in line.split (';')] 181*2d1272b8SAndroid Build Coastguard Worker if fields[5][0:1] != '<': 182*2d1272b8SAndroid Build Coastguard Worker continue 183*2d1272b8SAndroid Build Coastguard Worker 184*2d1272b8SAndroid Build Coastguard Worker items = fields[5].split (' ') 185*2d1272b8SAndroid Build Coastguard Worker shape, items = items[0][1:-1], tuple (int (x, 16) for x in items[1:]) 186*2d1272b8SAndroid Build Coastguard Worker c = int (fields[0], 16) 187*2d1272b8SAndroid Build Coastguard Worker 188*2d1272b8SAndroid Build Coastguard Worker if not shape in ['initial', 'medial', 'isolated', 'final']: 189*2d1272b8SAndroid Build Coastguard Worker continue 190*2d1272b8SAndroid Build Coastguard Worker 191*2d1272b8SAndroid Build Coastguard Worker if len (items) != 1: 192*2d1272b8SAndroid Build Coastguard Worker # Mark ligatures start with space and are in visual order, so we 193*2d1272b8SAndroid Build Coastguard Worker # remove the space and reverse the items. 194*2d1272b8SAndroid Build Coastguard Worker if items[0] == 0x0020: 195*2d1272b8SAndroid Build Coastguard Worker items = items[:0:-1] 196*2d1272b8SAndroid Build Coastguard Worker shape = None 197*2d1272b8SAndroid Build Coastguard Worker # We only care about a subset of ligatures 198*2d1272b8SAndroid Build Coastguard Worker if c not in LIGATURES: 199*2d1272b8SAndroid Build Coastguard Worker continue 200*2d1272b8SAndroid Build Coastguard Worker 201*2d1272b8SAndroid Build Coastguard Worker # Save ligature 202*2d1272b8SAndroid Build Coastguard Worker names[c] = fields[1] 203*2d1272b8SAndroid Build Coastguard Worker if items not in ligatures: 204*2d1272b8SAndroid Build Coastguard Worker ligatures[items] = {} 205*2d1272b8SAndroid Build Coastguard Worker ligatures[items][shape] = c 206*2d1272b8SAndroid Build Coastguard Worker else: 207*2d1272b8SAndroid Build Coastguard Worker # Save shape 208*2d1272b8SAndroid Build Coastguard Worker if items[0] not in names: 209*2d1272b8SAndroid Build Coastguard Worker names[items[0]] = fields[1] 210*2d1272b8SAndroid Build Coastguard Worker else: 211*2d1272b8SAndroid Build Coastguard Worker names[items[0]] = os.path.commonprefix ([names[items[0]], fields[1]]).strip () 212*2d1272b8SAndroid Build Coastguard Worker if items[0] not in shapes: 213*2d1272b8SAndroid Build Coastguard Worker shapes[items[0]] = {} 214*2d1272b8SAndroid Build Coastguard Worker shapes[items[0]][shape] = c 215*2d1272b8SAndroid Build Coastguard Worker 216*2d1272b8SAndroid Build Coastguard Worker print () 217*2d1272b8SAndroid Build Coastguard Worker print ("static const uint16_t shaping_table[][4] =") 218*2d1272b8SAndroid Build Coastguard Worker print ("{") 219*2d1272b8SAndroid Build Coastguard Worker 220*2d1272b8SAndroid Build Coastguard Worker keys = shapes.keys () 221*2d1272b8SAndroid Build Coastguard Worker min_u, max_u = min (keys), max (keys) 222*2d1272b8SAndroid Build Coastguard Worker for u in range (min_u, max_u + 1): 223*2d1272b8SAndroid Build Coastguard Worker s = [shapes[u][shape] if u in shapes and shape in shapes[u] else 0 224*2d1272b8SAndroid Build Coastguard Worker for shape in ['initial', 'medial', 'final', 'isolated']] 225*2d1272b8SAndroid Build Coastguard Worker value = ', '.join ("0x%04Xu" % c for c in s) 226*2d1272b8SAndroid Build Coastguard Worker print (" {%s}, /* U+%04X %s */" % (value, u, names[u] if u in names else "")) 227*2d1272b8SAndroid Build Coastguard Worker 228*2d1272b8SAndroid Build Coastguard Worker print ("};") 229*2d1272b8SAndroid Build Coastguard Worker print () 230*2d1272b8SAndroid Build Coastguard Worker print ("#define SHAPING_TABLE_FIRST 0x%04Xu" % min_u) 231*2d1272b8SAndroid Build Coastguard Worker print ("#define SHAPING_TABLE_LAST 0x%04Xu" % max_u) 232*2d1272b8SAndroid Build Coastguard Worker print () 233*2d1272b8SAndroid Build Coastguard Worker 234*2d1272b8SAndroid Build Coastguard Worker ligas_2 = {} 235*2d1272b8SAndroid Build Coastguard Worker ligas_3 = {} 236*2d1272b8SAndroid Build Coastguard Worker ligas_mark_2 = {} 237*2d1272b8SAndroid Build Coastguard Worker for key in ligatures.keys (): 238*2d1272b8SAndroid Build Coastguard Worker for shape in ligatures[key]: 239*2d1272b8SAndroid Build Coastguard Worker c = ligatures[key][shape] 240*2d1272b8SAndroid Build Coastguard Worker if len(key) == 3: 241*2d1272b8SAndroid Build Coastguard Worker if shape == 'isolated': 242*2d1272b8SAndroid Build Coastguard Worker liga = (shapes[key[0]]['initial'], shapes[key[1]]['medial'], shapes[key[2]]['final']) 243*2d1272b8SAndroid Build Coastguard Worker elif shape == 'final': 244*2d1272b8SAndroid Build Coastguard Worker liga = (shapes[key[0]]['medial'], shapes[key[1]]['medial'], shapes[key[2]]['final']) 245*2d1272b8SAndroid Build Coastguard Worker elif shape == 'initial': 246*2d1272b8SAndroid Build Coastguard Worker liga = (shapes[key[0]]['initial'], shapes[key[1]]['medial'], shapes[key[2]]['medial']) 247*2d1272b8SAndroid Build Coastguard Worker else: 248*2d1272b8SAndroid Build Coastguard Worker raise Exception ("Unexpected shape", shape) 249*2d1272b8SAndroid Build Coastguard Worker if liga[0] not in ligas_3: 250*2d1272b8SAndroid Build Coastguard Worker ligas_3[liga[0]] = [] 251*2d1272b8SAndroid Build Coastguard Worker ligas_3[liga[0]].append ((liga[1], liga[2], c)) 252*2d1272b8SAndroid Build Coastguard Worker elif len(key) == 2: 253*2d1272b8SAndroid Build Coastguard Worker if shape is None: 254*2d1272b8SAndroid Build Coastguard Worker liga = key 255*2d1272b8SAndroid Build Coastguard Worker if liga[0] not in ligas_mark_2: 256*2d1272b8SAndroid Build Coastguard Worker ligas_mark_2[liga[0]] = [] 257*2d1272b8SAndroid Build Coastguard Worker ligas_mark_2[liga[0]].append ((liga[1], c)) 258*2d1272b8SAndroid Build Coastguard Worker continue 259*2d1272b8SAndroid Build Coastguard Worker elif shape == 'isolated': 260*2d1272b8SAndroid Build Coastguard Worker liga = (shapes[key[0]]['initial'], shapes[key[1]]['final']) 261*2d1272b8SAndroid Build Coastguard Worker elif shape == 'final': 262*2d1272b8SAndroid Build Coastguard Worker liga = (shapes[key[0]]['medial'], shapes[key[1]]['final']) 263*2d1272b8SAndroid Build Coastguard Worker elif shape == 'initial': 264*2d1272b8SAndroid Build Coastguard Worker liga = (shapes[key[0]]['initial'], shapes[key[1]]['medial']) 265*2d1272b8SAndroid Build Coastguard Worker else: 266*2d1272b8SAndroid Build Coastguard Worker raise Exception ("Unexpected shape", shape) 267*2d1272b8SAndroid Build Coastguard Worker if liga[0] not in ligas_2: 268*2d1272b8SAndroid Build Coastguard Worker ligas_2[liga[0]] = [] 269*2d1272b8SAndroid Build Coastguard Worker ligas_2[liga[0]].append ((liga[1], c)) 270*2d1272b8SAndroid Build Coastguard Worker else: 271*2d1272b8SAndroid Build Coastguard Worker raise Exception ("Unexpected number of ligature components", key) 272*2d1272b8SAndroid Build Coastguard Worker max_i = max (len (ligas_2[l]) for l in ligas_2) 273*2d1272b8SAndroid Build Coastguard Worker print () 274*2d1272b8SAndroid Build Coastguard Worker print ("static const struct ligature_set_t {") 275*2d1272b8SAndroid Build Coastguard Worker print (" uint16_t first;") 276*2d1272b8SAndroid Build Coastguard Worker print (" struct ligature_pairs_t {") 277*2d1272b8SAndroid Build Coastguard Worker print (" uint16_t components[1];") 278*2d1272b8SAndroid Build Coastguard Worker print (" uint16_t ligature;") 279*2d1272b8SAndroid Build Coastguard Worker print (" } ligatures[%d];" % max_i) 280*2d1272b8SAndroid Build Coastguard Worker print ("} ligature_table[] =") 281*2d1272b8SAndroid Build Coastguard Worker print ("{") 282*2d1272b8SAndroid Build Coastguard Worker for first in sorted (ligas_2.keys ()): 283*2d1272b8SAndroid Build Coastguard Worker 284*2d1272b8SAndroid Build Coastguard Worker print (" { 0x%04Xu, {" % (first)) 285*2d1272b8SAndroid Build Coastguard Worker for liga in ligas_2[first]: 286*2d1272b8SAndroid Build Coastguard Worker print (" { {0x%04Xu}, 0x%04Xu }, /* %s */" % (liga[0], liga[1], names[liga[1]])) 287*2d1272b8SAndroid Build Coastguard Worker print (" }},") 288*2d1272b8SAndroid Build Coastguard Worker 289*2d1272b8SAndroid Build Coastguard Worker print ("};") 290*2d1272b8SAndroid Build Coastguard Worker print () 291*2d1272b8SAndroid Build Coastguard Worker 292*2d1272b8SAndroid Build Coastguard Worker max_i = max (len (ligas_mark_2[l]) for l in ligas_mark_2) 293*2d1272b8SAndroid Build Coastguard Worker print () 294*2d1272b8SAndroid Build Coastguard Worker print ("static const struct ligature_mark_set_t {") 295*2d1272b8SAndroid Build Coastguard Worker print (" uint16_t first;") 296*2d1272b8SAndroid Build Coastguard Worker print (" struct ligature_pairs_t {") 297*2d1272b8SAndroid Build Coastguard Worker print (" uint16_t components[1];") 298*2d1272b8SAndroid Build Coastguard Worker print (" uint16_t ligature;") 299*2d1272b8SAndroid Build Coastguard Worker print (" } ligatures[%d];" % max_i) 300*2d1272b8SAndroid Build Coastguard Worker print ("} ligature_mark_table[] =") 301*2d1272b8SAndroid Build Coastguard Worker print ("{") 302*2d1272b8SAndroid Build Coastguard Worker for first in sorted (ligas_mark_2.keys ()): 303*2d1272b8SAndroid Build Coastguard Worker 304*2d1272b8SAndroid Build Coastguard Worker print (" { 0x%04Xu, {" % (first)) 305*2d1272b8SAndroid Build Coastguard Worker for liga in ligas_mark_2[first]: 306*2d1272b8SAndroid Build Coastguard Worker print (" { {0x%04Xu}, 0x%04Xu }, /* %s */" % (liga[0], liga[1], names[liga[1]])) 307*2d1272b8SAndroid Build Coastguard Worker print (" }},") 308*2d1272b8SAndroid Build Coastguard Worker 309*2d1272b8SAndroid Build Coastguard Worker print ("};") 310*2d1272b8SAndroid Build Coastguard Worker print () 311*2d1272b8SAndroid Build Coastguard Worker 312*2d1272b8SAndroid Build Coastguard Worker max_i = max (len (ligas_3[l]) for l in ligas_3) 313*2d1272b8SAndroid Build Coastguard Worker print () 314*2d1272b8SAndroid Build Coastguard Worker print ("static const struct ligature_3_set_t {") 315*2d1272b8SAndroid Build Coastguard Worker print (" uint16_t first;") 316*2d1272b8SAndroid Build Coastguard Worker print (" struct ligature_triplets_t {") 317*2d1272b8SAndroid Build Coastguard Worker print (" uint16_t components[2];") 318*2d1272b8SAndroid Build Coastguard Worker print (" uint16_t ligature;") 319*2d1272b8SAndroid Build Coastguard Worker print (" } ligatures[%d];" % max_i) 320*2d1272b8SAndroid Build Coastguard Worker print ("} ligature_3_table[] =") 321*2d1272b8SAndroid Build Coastguard Worker print ("{") 322*2d1272b8SAndroid Build Coastguard Worker for first in sorted (ligas_3.keys ()): 323*2d1272b8SAndroid Build Coastguard Worker 324*2d1272b8SAndroid Build Coastguard Worker print (" { 0x%04Xu, {" % (first)) 325*2d1272b8SAndroid Build Coastguard Worker for liga in ligas_3[first]: 326*2d1272b8SAndroid Build Coastguard Worker print (" { {0x%04Xu, 0x%04Xu}, 0x%04Xu}, /* %s */" % (liga[0], liga[1], liga[2], names[liga[2]])) 327*2d1272b8SAndroid Build Coastguard Worker print (" }},") 328*2d1272b8SAndroid Build Coastguard Worker 329*2d1272b8SAndroid Build Coastguard Worker print ("};") 330*2d1272b8SAndroid Build Coastguard Worker print () 331*2d1272b8SAndroid Build Coastguard Worker 332*2d1272b8SAndroid Build Coastguard Worker 333*2d1272b8SAndroid Build Coastguard Worker 334*2d1272b8SAndroid Build Coastguard Workerprint ("/* == Start of generated table == */") 335*2d1272b8SAndroid Build Coastguard Workerprint ("/*") 336*2d1272b8SAndroid Build Coastguard Workerprint (" * The following table is generated by running:") 337*2d1272b8SAndroid Build Coastguard Workerprint (" *") 338*2d1272b8SAndroid Build Coastguard Workerprint (" * ./gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt") 339*2d1272b8SAndroid Build Coastguard Workerprint (" *") 340*2d1272b8SAndroid Build Coastguard Workerprint (" * on files with these headers:") 341*2d1272b8SAndroid Build Coastguard Workerprint (" *") 342*2d1272b8SAndroid Build Coastguard Workerfor h in headers: 343*2d1272b8SAndroid Build Coastguard Worker for l in h: 344*2d1272b8SAndroid Build Coastguard Worker print (" * %s" % (l.strip())) 345*2d1272b8SAndroid Build Coastguard Workerprint (" */") 346*2d1272b8SAndroid Build Coastguard Workerprint () 347*2d1272b8SAndroid Build Coastguard Workerprint ("#ifndef HB_OT_SHAPER_ARABIC_TABLE_HH") 348*2d1272b8SAndroid Build Coastguard Workerprint ("#define HB_OT_SHAPER_ARABIC_TABLE_HH") 349*2d1272b8SAndroid Build Coastguard Workerprint () 350*2d1272b8SAndroid Build Coastguard Worker 351*2d1272b8SAndroid Build Coastguard Workerread_blocks (files[2]) 352*2d1272b8SAndroid Build Coastguard Workerprint_joining_table (files[0]) 353*2d1272b8SAndroid Build Coastguard Workerprint_shaping_table (files[1]) 354*2d1272b8SAndroid Build Coastguard Worker 355*2d1272b8SAndroid Build Coastguard Workerprint () 356*2d1272b8SAndroid Build Coastguard Workerprint ("#endif /* HB_OT_SHAPER_ARABIC_TABLE_HH */") 357*2d1272b8SAndroid Build Coastguard Workerprint () 358*2d1272b8SAndroid Build Coastguard Workerprint ("/* == End of generated table == */") 359