xref: /illumos-gate/usr/src/data/locale/tools/mkwidths.py (revision 66582b606a8194f7f3ba5b3a3a6dca5b0d346361)
1#!/bin/python
2"""
3
4This file and its contents are supplied under the terms of the
5Common Development and Distribution License ("CDDL"), version 1.0.
6You may only use this file in accordance with the terms of version
71.0 of the CDDL.
8
9A full copy of the text of the CDDL should have accompanied this
10source.  A copy of the CDDL is also available via the Internet at
11http://www.illumos.org/license/CDDL.
12
13Copyright 2013 DEY Storage Systems, Inc.
14
15Scratch script to produce the widths.cm content from the widths text
16files.  It converts numeric unicode to symbolic forms.
17"""
18
19# Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
20
21from __future__ import print_function
22
23SYMBOLS = {}
24
25
26def u8_str(val):
27    """
28    Convert a numeric value to a string representing the UTF-8 encoding
29    of the numeric value, which should be a valid Unicode code point.
30    """
31    u8str = unichr(val).encode('utf-8')
32    idx = 0
33    out = ""
34    while idx < len(u8str):
35        out += "\\x%X" % ord(u8str[idx])
36        idx += 1
37    return out
38
39
40def load_utf8():
41    """
42    This function loads the UTF-8 character map file, loading the symbols
43    and the numeric values.  The result goes into the global SYMBOLS array.
44    """
45    lines = open("UTF-8.cm").readlines()
46    for line in lines:
47        items = line.split()
48        if (len(items) != 2) or items[0].startswith("#"):
49            continue
50        (sym, val) = (items[0], items[1])
51        SYMBOLS[val] = sym
52
53
54def do_width_file(width, filename):
55    """
56    This function takes a file pairs of unicode values (hex), each of
57    which is a range of unicode values, that all have the given width.
58    """
59    for line in open(filename).readlines():
60        if line.startswith("#"):
61            continue
62        vals = line.split()
63        while len(vals) > 1:
64            start = int(vals[0], 16)
65            end = int(vals[1], 16)
66            val = start
67            while val <= end:
68                key = u8_str(val)
69                val += 1
70                sym = SYMBOLS.get(key, None)
71                if sym == None:
72                    continue
73                print("%s\t%d" % (sym, width))
74            vals = vals[2:]
75
76
77if __name__ == "__main__":
78    print("WIDTH")
79    load_utf8()
80    do_width_file(0, "widths-0.txt")
81    do_width_file(2, "widths-2.txt")
82    print("END WIDTH")
83