Ebrahim Byagowi | 8d19907 | 2020-02-19 14:56:55 +0330 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Garret Rieger | ddc4f2b | 2018-02-26 15:59:32 -0800 | [diff] [blame] | 2 | |
Ebrahim Byagowi | 08f1d95 | 2020-05-28 15:01:15 +0430 | [diff] [blame] | 3 | """Generates the code for a sorted unicode range array as used in hb-ot-os2-unicode-ranges.hh |
luz paz | e2e3050 | 2022-01-16 07:00:53 -0500 | [diff] [blame] | 4 | Input is a tab separated list of unicode ranges from the otspec |
Ebrahim Byagowi | 08f1d95 | 2020-05-28 15:01:15 +0430 | [diff] [blame] | 5 | (https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ur). |
| 6 | """ |
Garret Rieger | ddc4f2b | 2018-02-26 15:59:32 -0800 | [diff] [blame] | 7 | |
Garret Rieger | ddc4f2b | 2018-02-26 15:59:32 -0800 | [diff] [blame] | 8 | import re |
| 9 | import sys |
| 10 | |
Garret Rieger | ddc4f2b | 2018-02-26 15:59:32 -0800 | [diff] [blame] | 11 | |
Behdad Esfahbod | 1dc601b | 2018-10-03 17:27:46 +0200 | [diff] [blame] | 12 | print ("""static OS2Range _hb_os2_unicode_ranges[] = |
Garret Rieger | f1c8fc3 | 2018-02-26 17:48:51 -0800 | [diff] [blame] | 13 | {""") |
Garret Rieger | ddc4f2b | 2018-02-26 15:59:32 -0800 | [diff] [blame] | 14 | |
| 15 | args = sys.argv[1:] |
| 16 | input_file = args[0] |
| 17 | |
Ebrahim Byagowi | ad87155 | 2020-05-29 00:11:19 +0430 | [diff] [blame] | 18 | with open (input_file, mode="r", encoding="utf-8") as f: |
Garret Rieger | ddc4f2b | 2018-02-26 15:59:32 -0800 | [diff] [blame] | 19 | |
Ebrahim Byagowi | 08f1d95 | 2020-05-28 15:01:15 +0430 | [diff] [blame] | 20 | all_ranges = [] |
Garret Rieger | ddc4f2b | 2018-02-26 15:59:32 -0800 | [diff] [blame] | 21 | current_bit = 0 |
| 22 | while True: |
| 23 | line = f.readline().strip() |
| 24 | if not line: |
| 25 | break |
| 26 | fields = re.split(r'\t+', line) |
| 27 | if len(fields) == 3: |
| 28 | current_bit = fields[0] |
| 29 | fields = fields[1:] |
| 30 | elif len(fields) > 3: |
cclauss | f4da28b | 2018-12-30 12:58:34 +0100 | [diff] [blame] | 31 | raise Exception("bad input :(.") |
Garret Rieger | ddc4f2b | 2018-02-26 15:59:32 -0800 | [diff] [blame] | 32 | |
| 33 | name = fields[0] |
| 34 | ranges = re.split("-", fields[1]) |
| 35 | if len(ranges) != 2: |
cclauss | f4da28b | 2018-12-30 12:58:34 +0100 | [diff] [blame] | 36 | raise Exception("bad input :(.") |
Garret Rieger | ddc4f2b | 2018-02-26 15:59:32 -0800 | [diff] [blame] | 37 | |
| 38 | v = tuple((int(ranges[0], 16), int(ranges[1], 16), int(current_bit), name)) |
| 39 | all_ranges.append(v) |
| 40 | |
| 41 | all_ranges = sorted(all_ranges, key=lambda t: t[0]) |
| 42 | |
| 43 | for ranges in all_ranges: |
| 44 | start = ("0x%X" % ranges[0]).rjust(8) |
| 45 | end = ("0x%X" % ranges[1]).rjust(8) |
| 46 | bit = ("%s" % ranges[2]).rjust(3) |
| 47 | |
Ebrahim Byagowi | cab2c2c | 2018-03-29 12:48:47 +0430 | [diff] [blame] | 48 | print (" {%s, %s, %s}, // %s" % (start, end, bit, ranges[3])) |
Garret Rieger | ddc4f2b | 2018-02-26 15:59:32 -0800 | [diff] [blame] | 49 | |
Ebrahim Byagowi | cab2c2c | 2018-03-29 12:48:47 +0430 | [diff] [blame] | 50 | print ("""};""") |