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