xref: /aosp_15_r20/external/harfbuzz_ng/src/gen-arabic-joining-list.py (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
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