1*2d1272b8SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*2d1272b8SAndroid Build Coastguard Worker 3*2d1272b8SAndroid Build Coastguard Worker"""usage: ./gen-arabic-joining-table.py ArabicShaping.txt Scripts.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/Scripts.txt 8*2d1272b8SAndroid Build Coastguard Worker""" 9*2d1272b8SAndroid Build Coastguard Worker 10*2d1272b8SAndroid Build Coastguard Workerimport os.path, sys 11*2d1272b8SAndroid Build Coastguard Worker 12*2d1272b8SAndroid Build Coastguard Workerif len (sys.argv) != 3: 13*2d1272b8SAndroid Build Coastguard Worker sys.exit (__doc__) 14*2d1272b8SAndroid Build Coastguard Worker 15*2d1272b8SAndroid Build Coastguard Workerfiles = [open (x, encoding='utf-8') for x in sys.argv[1:]] 16*2d1272b8SAndroid Build Coastguard Worker 17*2d1272b8SAndroid Build Coastguard Workerheaders = [[f.readline (), f.readline ()] for f in files] 18*2d1272b8SAndroid Build Coastguard Workerwhile files[0].readline ().find ('##################') < 0: 19*2d1272b8SAndroid Build Coastguard Worker pass 20*2d1272b8SAndroid Build Coastguard Worker 21*2d1272b8SAndroid Build Coastguard Workerdef read (f): 22*2d1272b8SAndroid Build Coastguard Worker mapping = {} 23*2d1272b8SAndroid Build Coastguard Worker for line in f: 24*2d1272b8SAndroid Build Coastguard Worker 25*2d1272b8SAndroid Build Coastguard Worker j = line.find ('#') 26*2d1272b8SAndroid Build Coastguard Worker if j >= 0: 27*2d1272b8SAndroid Build Coastguard Worker line = line[:j] 28*2d1272b8SAndroid Build Coastguard Worker 29*2d1272b8SAndroid Build Coastguard Worker fields = [x.strip () for x in line.split (';')] 30*2d1272b8SAndroid Build Coastguard Worker if len (fields) == 1: 31*2d1272b8SAndroid Build Coastguard Worker continue 32*2d1272b8SAndroid Build Coastguard Worker 33*2d1272b8SAndroid Build Coastguard Worker uu = fields[0].split ('..') 34*2d1272b8SAndroid Build Coastguard Worker start = int (uu[0], 16) 35*2d1272b8SAndroid Build Coastguard Worker if len (uu) == 1: 36*2d1272b8SAndroid Build Coastguard Worker end = start 37*2d1272b8SAndroid Build Coastguard Worker else: 38*2d1272b8SAndroid Build Coastguard Worker end = int (uu[1], 16) 39*2d1272b8SAndroid Build Coastguard Worker 40*2d1272b8SAndroid Build Coastguard Worker t = fields[1] 41*2d1272b8SAndroid Build Coastguard Worker 42*2d1272b8SAndroid Build Coastguard Worker for u in range (start, end + 1): 43*2d1272b8SAndroid Build Coastguard Worker mapping[u] = t 44*2d1272b8SAndroid Build Coastguard Worker 45*2d1272b8SAndroid Build Coastguard Worker return mapping 46*2d1272b8SAndroid Build Coastguard Worker 47*2d1272b8SAndroid Build Coastguard Workerdef read_joining_uu (f): 48*2d1272b8SAndroid Build Coastguard Worker values = set () 49*2d1272b8SAndroid Build Coastguard Worker for line in f: 50*2d1272b8SAndroid Build Coastguard Worker 51*2d1272b8SAndroid Build Coastguard Worker if line[0] == '#': 52*2d1272b8SAndroid Build Coastguard Worker continue 53*2d1272b8SAndroid Build Coastguard Worker 54*2d1272b8SAndroid Build Coastguard Worker fields = [x.strip () for x in line.split (';')] 55*2d1272b8SAndroid Build Coastguard Worker if len (fields) == 1: 56*2d1272b8SAndroid Build Coastguard Worker continue 57*2d1272b8SAndroid Build Coastguard Worker if fields[2] in {'T', 'U'}: 58*2d1272b8SAndroid Build Coastguard Worker continue 59*2d1272b8SAndroid Build Coastguard Worker 60*2d1272b8SAndroid Build Coastguard Worker values.add (int (fields[0], 16)) 61*2d1272b8SAndroid Build Coastguard Worker 62*2d1272b8SAndroid Build Coastguard Worker return sorted (values) 63*2d1272b8SAndroid Build Coastguard Worker 64*2d1272b8SAndroid Build Coastguard Workerdef print_has_arabic_joining (scripts, joining_uu): 65*2d1272b8SAndroid Build Coastguard Worker 66*2d1272b8SAndroid Build Coastguard Worker print ("static bool") 67*2d1272b8SAndroid Build Coastguard Worker print ("has_arabic_joining (hb_script_t script)") 68*2d1272b8SAndroid Build Coastguard Worker print ("{") 69*2d1272b8SAndroid Build Coastguard Worker print (" /* List of scripts that have data in arabic-table. */") 70*2d1272b8SAndroid Build Coastguard Worker print (" switch ((int) script)") 71*2d1272b8SAndroid Build Coastguard Worker print (" {") 72*2d1272b8SAndroid Build Coastguard Worker 73*2d1272b8SAndroid Build Coastguard Worker for script in sorted ({scripts[u] for u in joining_uu if scripts[u] not in {'Common', 'Inherited'}}): 74*2d1272b8SAndroid Build Coastguard Worker print (" case HB_SCRIPT_{}:".format (script.upper ())) 75*2d1272b8SAndroid Build Coastguard Worker 76*2d1272b8SAndroid Build Coastguard Worker print (" return true;") 77*2d1272b8SAndroid Build Coastguard Worker print () 78*2d1272b8SAndroid Build Coastguard Worker print (" default:") 79*2d1272b8SAndroid Build Coastguard Worker print (" return false;") 80*2d1272b8SAndroid Build Coastguard Worker print (" }") 81*2d1272b8SAndroid Build Coastguard Worker print ("}") 82*2d1272b8SAndroid Build Coastguard Worker print () 83*2d1272b8SAndroid Build Coastguard Worker 84*2d1272b8SAndroid Build Coastguard Workerprint ("/* == Start of generated function == */") 85*2d1272b8SAndroid Build Coastguard Workerprint ("/*") 86*2d1272b8SAndroid Build Coastguard Workerprint (" * The following function is generated by running:") 87*2d1272b8SAndroid Build Coastguard Workerprint (" *") 88*2d1272b8SAndroid Build Coastguard Workerprint (" * ./gen-arabic-joining-list.py ArabicShaping.txt Scripts.txt") 89*2d1272b8SAndroid Build Coastguard Workerprint (" *") 90*2d1272b8SAndroid Build Coastguard Workerprint (" * on files with these headers:") 91*2d1272b8SAndroid Build Coastguard Workerprint (" *") 92*2d1272b8SAndroid Build Coastguard Workerfor h in headers: 93*2d1272b8SAndroid Build Coastguard Worker for l in h: 94*2d1272b8SAndroid Build Coastguard Worker print (" * %s" % (l.strip ())) 95*2d1272b8SAndroid Build Coastguard Workerprint (" */") 96*2d1272b8SAndroid Build Coastguard Workerprint () 97*2d1272b8SAndroid Build Coastguard Workerprint ("#ifndef HB_OT_SHAPER_ARABIC_JOINING_LIST_HH") 98*2d1272b8SAndroid Build Coastguard Workerprint ("#define HB_OT_SHAPER_ARABIC_JOINING_LIST_HH") 99*2d1272b8SAndroid Build Coastguard Workerprint () 100*2d1272b8SAndroid Build Coastguard Worker 101*2d1272b8SAndroid Build Coastguard Workerprint_has_arabic_joining (read (files[1]), read_joining_uu (files[0])) 102*2d1272b8SAndroid Build Coastguard Worker 103*2d1272b8SAndroid Build Coastguard Workerprint () 104*2d1272b8SAndroid Build Coastguard Workerprint ("#endif /* HB_OT_SHAPER_ARABIC_JOINING_LIST_HH */") 105*2d1272b8SAndroid Build Coastguard Workerprint () 106*2d1272b8SAndroid Build Coastguard Workerprint ("/* == End of generated function == */") 107