xref: /aosp_15_r20/external/harfbuzz_ng/src/gen-os2-unicode-ranges.py (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*2d1272b8SAndroid Build Coastguard Worker
3*2d1272b8SAndroid Build Coastguard Worker"""Generates the code for a sorted unicode range array as used in hb-ot-os2-unicode-ranges.hh
4*2d1272b8SAndroid Build Coastguard WorkerInput is a tab separated list of unicode ranges from the otspec
5*2d1272b8SAndroid Build Coastguard Worker(https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ur).
6*2d1272b8SAndroid Build Coastguard Worker"""
7*2d1272b8SAndroid Build Coastguard Worker
8*2d1272b8SAndroid Build Coastguard Workerimport re
9*2d1272b8SAndroid Build Coastguard Workerimport sys
10*2d1272b8SAndroid Build Coastguard Worker
11*2d1272b8SAndroid Build Coastguard Worker
12*2d1272b8SAndroid Build Coastguard Workerprint ("""static OS2Range _hb_os2_unicode_ranges[] =
13*2d1272b8SAndroid Build Coastguard Worker{""")
14*2d1272b8SAndroid Build Coastguard Worker
15*2d1272b8SAndroid Build Coastguard Workerargs = sys.argv[1:]
16*2d1272b8SAndroid Build Coastguard Workerinput_file = args[0]
17*2d1272b8SAndroid Build Coastguard Worker
18*2d1272b8SAndroid Build Coastguard Workerwith open (input_file, mode="r", encoding="utf-8") as f:
19*2d1272b8SAndroid Build Coastguard Worker
20*2d1272b8SAndroid Build Coastguard Worker  all_ranges = []
21*2d1272b8SAndroid Build Coastguard Worker  current_bit = 0
22*2d1272b8SAndroid Build Coastguard Worker  while True:
23*2d1272b8SAndroid Build Coastguard Worker    line = f.readline().strip()
24*2d1272b8SAndroid Build Coastguard Worker    if not line:
25*2d1272b8SAndroid Build Coastguard Worker      break
26*2d1272b8SAndroid Build Coastguard Worker    fields = re.split(r'\t+', line)
27*2d1272b8SAndroid Build Coastguard Worker    if len(fields) == 3:
28*2d1272b8SAndroid Build Coastguard Worker      current_bit = fields[0]
29*2d1272b8SAndroid Build Coastguard Worker      fields = fields[1:]
30*2d1272b8SAndroid Build Coastguard Worker    elif len(fields) > 3:
31*2d1272b8SAndroid Build Coastguard Worker      raise Exception("bad input :(.")
32*2d1272b8SAndroid Build Coastguard Worker
33*2d1272b8SAndroid Build Coastguard Worker    name = fields[0]
34*2d1272b8SAndroid Build Coastguard Worker    ranges = re.split("-", fields[1])
35*2d1272b8SAndroid Build Coastguard Worker    if len(ranges) != 2:
36*2d1272b8SAndroid Build Coastguard Worker      raise Exception("bad input :(.")
37*2d1272b8SAndroid Build Coastguard Worker
38*2d1272b8SAndroid Build Coastguard Worker    v = tuple((int(ranges[0], 16), int(ranges[1], 16), int(current_bit), name))
39*2d1272b8SAndroid Build Coastguard Worker    all_ranges.append(v)
40*2d1272b8SAndroid Build Coastguard Worker
41*2d1272b8SAndroid Build Coastguard Workerall_ranges = sorted(all_ranges, key=lambda t: t[0])
42*2d1272b8SAndroid Build Coastguard Worker
43*2d1272b8SAndroid Build Coastguard Workerfor ranges in all_ranges:
44*2d1272b8SAndroid Build Coastguard Worker  start = ("0x%X" % ranges[0]).rjust(8)
45*2d1272b8SAndroid Build Coastguard Worker  end = ("0x%X" % ranges[1]).rjust(8)
46*2d1272b8SAndroid Build Coastguard Worker  bit = ("%s" % ranges[2]).rjust(3)
47*2d1272b8SAndroid Build Coastguard Worker
48*2d1272b8SAndroid Build Coastguard Worker  print ("  {%s, %s, %s}, // %s" % (start, end, bit, ranges[3]))
49*2d1272b8SAndroid Build Coastguard Worker
50*2d1272b8SAndroid Build Coastguard Workerprint ("""};""")
51