Changeset 4632 for proto/charsetcompiler


Ignore:
Timestamp:
Jul 2, 2015, 4:52:54 PM (4 years ago)
Author:
nmedfort
Message:

Modifications to UCD property object generator.

Location:
proto/charsetcompiler/UCD
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • proto/charsetcompiler/UCD/UCD_parser.py

    r4462 r4632  
    1818trivial_name_char_re = re.compile('[-_\s]')
    1919def canonicalize(property_string):
    20    return trivial_name_char_re.sub('', property_string.lower())
     20    return trivial_name_char_re.sub('', property_string.lower())
    2121
    2222#
     
    8686    lines = f.readlines()
    8787    for t in lines:
    88         if UCD_skip.match(t): 
     88        if UCD_skip.match(t):
    8989            m = UCD_property_value_missing_regexp.match(t)
    9090            if m:
     
    146146#
    147147def union_of_all(uset_list):
    148    if uset_list == []: return empty_uset()
    149    else:
    150      accum_set = uset_list[0]
    151      for s in uset_list[1:]:
    152         accum_set = uset_union(accum_set, s)
    153      return accum_set
     148    if uset_list == []: return empty_uset()
     149    else:
     150        accum_set = uset_list[0]
     151        for s in uset_list[1:]:
     152            accum_set = uset_union(accum_set, s)
     153        return accum_set
    154154
    155155#
     
    170170            m = UCD_missing_regexp1.match(t)
    171171            if m:
    172               if default_value != None:
    173                 raise Exception("Default value already specified, extraneous @missing spec: %s" % t)
    174               (missing_lo, missing_hi, default_value) = (int(m.group(1), 16), int(m.group(2), 16), m.group(3))
    175               default_value = canonicalize(default_value)
    176               if not canon_map.has_key(default_value):  raise Exception("Unknown default property value name '%s'" % default_value)
    177               if missing_lo != 0 or missing_hi != 0x10FFFF: raise Exception("Unexpected missing data range '%x, %x'" % (missing_lo, missing_hi))
    178               default_value = canon_map[default_value]
     172                if default_value != None:
     173                    raise Exception("Default value already specified, extraneous @missing spec: %s" % t)
     174                (missing_lo, missing_hi, default_value) = (int(m.group(1), 16), int(m.group(2), 16), m.group(3))
     175                default_value = canonicalize(default_value)
     176                if not canon_map.has_key(default_value):  raise Exception("Unknown default property value name '%s'" % default_value)
     177                if missing_lo != 0 or missing_hi != 0x10FFFF: raise Exception("Unexpected missing data range '%x, %x'" % (missing_lo, missing_hi))
     178                default_value = canon_map[default_value]
    179179            continue  # skip comment and blank lines
    180180        m = UCD_point_name_regexp.match(t)
     
    182182            (codepoint, name) = (int(m.group(1), 16), m.group(2))
    183183            newset = singleton_uset(codepoint)
    184         else: 
     184        else:
    185185            m = UCD_range_name_regexp.match(t)
    186186            if not m: raise Exception("Unknown syntax: %s" % t)
     
    206206        name_list_order = ['LC', 'L', 'M', 'N', 'P', 'S', 'Z', 'C']+ name_list_order
    207207    for v in vlist:
    208         if not v in name_list_order: 
     208        if not v in name_list_order:
    209209            #raise Exception("Property %s value %s missing" % (self.full_name_map[property_code], v))
    210210            #print("Warning: property %s has no instance of value %s" % (property_code, v))
     
    217217        if value_map.has_key(default_value):
    218218            value_map[default_value] = uset_union(value_map[default_value], need_default_value)
    219         else: 
     219        else:
    220220            value_map[default_value] = need_default_value
    221221            name_list_order.append(default_value)
     
    234234        scx_items = scx_list.split(" ")
    235235        for scx in scx_items:
    236             #sc = canonical_property_value_map[canonicalize(scx)]
     236            # sc = canonical_property_value_map[canonicalize(scx)]
    237237            sc = scx
    238             if value_map.has_key(sc): 
    239                value_map[sc] = uset_union(value_map[sc], scx_set_map[scx_list])
     238            if value_map.has_key(sc):
     239                value_map[sc] = uset_union(value_map[sc], scx_set_map[scx_list])
    240240            else: value_map[sc] = scx_set_map[scx_list]
    241241        explicitly_defined_set = uset_union(explicitly_defined_set, scx_set_map[scx_list])
    242     for v in scripts: 
     242    for v in scripts:
    243243        if value_map.has_key(v):
    244244            value_map[v] = uset_union(value_map[v], uset_difference(script_map[v], explicitly_defined_set))
     
    250250
    251251def parse_UCD_codepoint_name_map(mapfile, canon_map = None):
    252    value_map = {}
    253    name_list_order = []
    254    f = open(UCD_dir + "/" + mapfile)
    255    lines = f.readlines()
    256    for t in lines:
    257       if UCD_skip.match(t):
    258         continue  # skip comment and blank lines
    259       m = UCD_point_name_regexp.match(t)
    260       if m:
    261         (codepoint, name) = (int(m.group(1), 16), m.group(2))
    262         newset = singleton_uset(codepoint)
    263       else:
    264         m = UCD_range_name_regexp.match(t)
    265         if not m: raise Exception("Unknown syntax: %s" % t)
    266         (cp_lo, cp_hi, name) = (int(m.group(1), 16), int(m.group(2), 16), m.group(3))
    267         newset = range_uset(cp_lo, cp_hi)
    268       if not canon_map == None:
    269         cname = canonicalize(name)
    270         if not canon_map.has_key(cname):  raise Exception("Unknown property or property value name '%s'" % cname)
    271         name = canon_map[cname]
    272       if not value_map.has_key(name):
    273         value_map[name] = newset
    274         name_list_order.append(name)
    275       else: value_map[name] = uset_union(value_map[name], newset)
    276    return (name_list_order, value_map)
    277 
    278 
     252    value_map = {}
     253    name_list_order = []
     254    f = open(UCD_dir + "/" + mapfile)
     255    lines = f.readlines()
     256    for t in lines:
     257        if UCD_skip.match(t):
     258            continue  # skip comment and blank lines
     259        m = UCD_point_name_regexp.match(t)
     260        if m:
     261            (codepoint, name) = (int(m.group(1), 16), m.group(2))
     262            newset = singleton_uset(codepoint)
     263        else:
     264            m = UCD_range_name_regexp.match(t)
     265            if not m: raise Exception("Unknown syntax: %s" % t)
     266            (cp_lo, cp_hi, name) = (int(m.group(1), 16), int(m.group(2), 16), m.group(3))
     267            newset = range_uset(cp_lo, cp_hi)
     268        if not canon_map == None:
     269            cname = canonicalize(name)
     270            if not canon_map.has_key(cname):
     271                raise Exception("Unknown property or property value name '%s'" % cname)
     272            name = canon_map[cname]
     273        if not value_map.has_key(name):
     274            value_map[name] = newset
     275            name_list_order.append(name)
     276        else: value_map[name] = uset_union(value_map[name], newset)
     277    return (name_list_order, value_map)
     278
     279
  • proto/charsetcompiler/UCD/UCD_properties.py

    r4619 r4632  
    1818PropertyAliases_template = r"""
    1919namespace UCD {
    20   enum property_t {
    21 %s
    22   };
    23   const std::vector<std::string> property_enum_name = {
    24 %s
    25   };
    26   const std::vector<std::string> property_full_name = {
    27 %s
    28   };
    29   const std::unordered_map<std::string, property_t> alias_map = {
    30 %s
    31   };
     20    enum property_t {
     21        %s};
     22    const static std::vector<std::string> property_enum_name = {
     23        %s};
     24    const static std::vector<std::string> property_full_name = {
     25        %s};
     26    static std::unordered_map<std::string, int> alias_map {{
     27        %s}};
    3228}
    3329"""
    3430
    3531EnumeratedProperty_template = r"""
    36   namespace %s_ns {
    37     enum value_t {
    38       %s};
    39     const std::vector<std::string> enum_names = {
    40       %s};
    41     const std::vector<std::string> value_names = {
    42       %s};
    43     const std::unordered_map<std::string, int> aliases_only_map = std::unordered_map<std::string, int> {
    44       %s};
    45   }
     32    namespace %s_ns {
     33        enum value_t {
     34            %s};
     35        const static std::vector<std::string> enum_names = {
     36            %s};
     37        const static std::vector<std::string> value_names = {
     38            %s};
     39        static std::unordered_map<std::string, int> aliases_only_map {{
     40            %s}};
     41    }
    4642"""
    4743
     
    5955    def generate_PropertyAliases_h(self):
    6056        f = cformat.open_header_file_for_write('PropertyAliases')
    61         cformat.write_imports(f, ["<string>", "<vector>", "<unordered_map>"])
    62         enum_text = cformat.multiline_fill(self.property_enum_name_list, ',')
    63         enum_text2 = cformat.multiline_fill(['"%s"' % e for e in self.property_enum_name_list], ',')
    64         full_name_text = cformat.multiline_fill(['"%s"' % self.full_name_map[e] for e in self.property_enum_name_list], ',')
    65         map_text = cformat.multiline_fill(['{"%s", %s}' % (k, self.property_lookup_map[k]) for k in sorted(self.property_lookup_map.keys())], ',')
     57        cformat.write_imports(f, ["<string>", "<unordered_map>", "<vector>"])
     58        enum_text = cformat.multiline_fill(self.property_enum_name_list, ',', 8)
     59        enum_text2 = cformat.multiline_fill(['"%s"' % e for e in self.property_enum_name_list], ',', 8)
     60        full_name_text = cformat.multiline_fill(['"%s"' % self.full_name_map[e] for e in self.property_enum_name_list], ',', 8)
     61        map_text = cformat.multiline_fill(['{"%s", %s}' % (k, self.property_lookup_map[k]) for k in sorted(self.property_lookup_map.keys())], ',', 8)
    6662        f.write(PropertyAliases_template % (enum_text, enum_text2, full_name_text, map_text))
    6763        cformat.close_header_file(f)
     
    7369    def generate_PropertyValueAliases_h(self):
    7470        f = cformat.open_header_file_for_write('PropertyValueAliases')
    75         cformat.write_imports(f, ["<string>", "<unordered_map>", '"PropertyAliases.h"'])
     71        cformat.write_imports(f, ['"PropertyAliases.h"', "<vector>", "<unordered_map>", "<string>"])
    7672        f.write("namespace UCD {\n")
    7773        #  Generate the aliases for all Binary properties.
    78         enum_text = cformat.multiline_fill(['N', 'Y'], ',', 6)
    79         enum_names = cformat.multiline_fill(['"N"', '"Y"'], ',', 6)
    80         full_name_text = cformat.multiline_fill(['"No"', '"Yes"'], ',', 6)
    81         binary_map_text = cformat.multiline_fill(['{"n", N}', '{"y", Y}', '{"no", N}', '{"yes", Y}', '{"f", N}', '{"t", Y}', '{"false", N}', '{"true", Y}'], ',', 6)
     74        enum_text = cformat.multiline_fill(['N', 'Y'], ',', 12)
     75        enum_names = cformat.multiline_fill(['"N"', '"Y"'], ',', 12)
     76        full_name_text = cformat.multiline_fill(['"No"', '"Yes"'], ',', 12)
     77        binary_properties = ['{"n", N}', '{"y", Y}', '{"no", N}', '{"yes", Y}', '{"f", N}', '{"t", Y}', '{"false", N}', '{"true", Y}']
     78        binary_map_text = cformat.multiline_fill(binary_properties, ',', 12)
    8279        f.write(EnumeratedProperty_template % ('Binary', enum_text, enum_names, full_name_text, binary_map_text))
    8380        #
     
    8582           if self.property_value_list.has_key(p):
    8683              if not self.property_kind_map[p] == 'Binary':
    87                   enum_text = cformat.multiline_fill(self.property_value_list[p], ',', 6)
    88                   enum_names = cformat.multiline_fill(['"%s"' % s for s in self.property_value_list[p]], ',', 6)
     84                  enum_text = cformat.multiline_fill(self.property_value_list[p], ',', 12)
     85                  enum_names = cformat.multiline_fill(['"%s"' % s for s in self.property_value_list[p]], ',', 12)
    8986                  if p == 'ccc': # Special case: add numeric value information for ccc.
    9087                      enum_text += r"""
    9188        };
    92         const uint8_t enum_val[] = {
     89        const uint16_t enum_val[] = {
    9390    """
    94                       enum_text += "      " + cformat.multiline_fill(["%s" % (self.property_value_enum_integer[p][e]) for e in self.property_value_list['ccc']], ',', 6)
     91                      enum_text += "      " + cformat.multiline_fill(["%s" % (self.property_value_enum_integer[p][e]) for e in self.property_value_list['ccc']], ',', 12)
    9592                  full_names = [self.property_value_full_name_map[p][e] for e in self.property_value_list[p]]
    96                   full_name_text = cformat.multiline_fill(['"%s"' % name for name in full_names], ',', 6)
     93                  full_name_text = cformat.multiline_fill(['"%s"' % name for name in full_names], ',', 12)
    9794                  canon_full_names = [canonicalize(name) for name in full_names]
    9895                  canon_enums = [canonicalize(e) for e in self.property_value_list[p]]
    9996                  canon_keys = [canonicalize(k) for k in self.property_value_lookup_map[p].keys()]
    10097                  aliases_only = [k for k in canon_keys if not k in canon_enums + canon_full_names]
    101                   map_text = cformat.multiline_fill(['{"%s", %s_ns::%s}' % (k, p.upper(), self.property_value_lookup_map[p][k]) for k in sorted(aliases_only)], ',', 6)
     98                  map_text = cformat.multiline_fill(['{"%s", %s_ns::%s}' % (k, p.upper(), self.property_value_lookup_map[p][k]) for k in sorted(aliases_only)], ',', 12)
    10299                  f.write(EnumeratedProperty_template % (p.upper(), enum_text, enum_names, full_name_text, map_text))
    103100        f.write("}\n")
     
    113110        cformat.write_imports(f, ['"PropertyObjects.h"', '"PropertyValueAliases.h"', '"unicode_set.h"'])
    114111        f.write("\nnamespace UCD {\n")
    115         f.write("  namespace %s_ns {\n" % property_code.upper())
     112        f.write("    namespace %s_ns {\n" % property_code.upper())
    116113        for v in self.property_value_list[property_code]:
     114            f.write("    /** Code Point Ranges for %s\n    " % v)
     115            f.write(cformat.multiline_fill(['[%s, %s]' % (lo, hi) for (lo, hi) in uset_to_range_list(value_map[v])], ',', 4))
     116            f.write("**/\n")
    117117            f.write("    const UnicodeSet %s_Set \n" % v.lower())
    118             f.write(value_map[v].showC(6) + ";\n")
     118            f.write(value_map[v].showC(8) + ";\n")
    119119        print "%s: %s bytes" % (basename, sum([value_map[v].bytes() for v in value_map.keys()]))
    120         set_list = ['%s_Set' % v.lower() for v in self.property_value_list[property_code]]
     120        set_list = ['&%s_Set' % v.lower() for v in self.property_value_list[property_code]]
    121121        f.write("    static EnumeratedPropertyObject property_object\n")
    122         f.write("      {%s,\n" % property_code)
    123         f.write("       %s_ns::enum_names,\n" % property_code.upper())
    124         f.write("       %s_ns::value_names,\n" % property_code.upper())
    125         f.write("       %s_ns::aliases_only_map,\n" % property_code.upper())
    126         f.write("       {")
     122        f.write("        {%s,\n" % property_code)
     123        f.write("         %s_ns::enum_names,\n" % property_code.upper())
     124        f.write("         %s_ns::value_names,\n" % property_code.upper())
     125        f.write("         %s_ns::aliases_only_map,\n" % property_code.upper())
     126        f.write("         {")
    127127        f.write(cformat.multiline_fill(set_list, ',', 8))
    128         f.write("\n       }};\n  }\n}\n")
     128        f.write("\n         }};\n    }\n}\n")
    129129        cformat.close_header_file(f)
    130130        self.supported_props.append(property_code)
     
    139139        cformat.write_imports(f, ['"PropertyObjects.h"', '"PropertyValueAliases.h"', '"unicode_set.h"'])
    140140        f.write("\nnamespace UCD {\n")
    141         f.write("  namespace SCX_ns {\n")
     141        f.write("    namespace SCX_ns {\n")
    142142        for v in self.property_value_list['sc']:
    143             f.write("    const UnicodeSet %s_Ext \n" % v.lower())
    144             f.write(value_map[v].showC(6) + ";\n")
    145         print "%s: %s bytes" % (basename, sum([value_map[v].bytes() for v in value_map.keys()]))
    146         set_list = ['%s_Ext' % v.lower() for v in self.property_value_list['sc']]
    147         f.write("    static EnumeratedPropertyObject property_object\n")
    148         f.write("      {%s,\n" % property_code)
    149         f.write("       SC_ns::enum_names,\n")
    150         f.write("       SC_ns::value_names,\n")
    151         f.write("       SC_ns::aliases_only_map,\n")
     143            f.write("        /** Code Point Ranges for %s\n        " % v)
     144            f.write(cformat.multiline_fill(['[%s, %s]' % (lo, hi) for (lo, hi) in uset_to_range_list(value_map[v])], ',', 8))
     145            f.write("**/\n")
     146            f.write("        const UnicodeSet %s_Ext \n" % v.lower())
     147            f.write(value_map[v].showC(12) + ";\n")
     148        set_list = ['&%s_Ext' % v.lower() for v in self.property_value_list['sc']]
     149        f.write("        static EnumeratedPropertyObject property_object\n")
     150        f.write("       {%s,\n" % property_code)
     151        f.write("        SCX_ns::enum_names,\n")
     152        f.write("        SCX_ns::value_names,\n")
     153        f.write("        SCX_ns::aliases_only_map,\n")
    152154        f.write("       {")
    153155        f.write(cformat.multiline_fill(set_list, ',', 8))
    154         f.write("\n       }};\n  }\n}\n")
    155         cformat.close_header_file(f)
    156         self.supported_props.append('property_code')
     156        f.write("\n        }};\n    }\n}\n")
     157        cformat.close_header_file(f)
     158        print "%s: %s bytes" % (basename, sum([value_map[v].bytes() for v in value_map.keys()]))
     159        self.supported_props.append(property_code)
    157160        self.property_data_headers.append(basename)
    158161
     
    163166        cformat.write_imports(f, ['"PropertyAliases.h"', '"unicode_set.h"', "<vector>"])
    164167        f.write("\nnamespace UCD {\n")
     168        for p in sorted(props):
     169            # f.write("  namespace %s_ns {\n    const UnicodeSet codepoint_set \n" % p.upper())
     170            # f.write(prop_map[p].showC(12) + ";\n")
     171            # f.write("    static BinaryPropertyObject property_object{%s, codepoint_set};\n  }\n" % p)
     172            f.write("    namespace %s_ns {\n" % p.upper())
     173            f.write("        /** Code Point Ranges for %s\n        " % p)
     174            f.write(cformat.multiline_fill(['[%s, %s]' % (lo, hi) for (lo, hi) in uset_to_range_list(prop_map[p])], ',', 8))
     175            f.write("**/\n")
     176            f.write("        const UnicodeSet codepoint_set \n")
     177            f.write(prop_map[p].showC(12) + ";\n")
     178            f.write("        static BinaryPropertyObject property_object{%s, codepoint_set};\n    }\n" % p)
     179        f.write("}\n\n")
     180        cformat.close_header_file(f)
    165181        print "%s: %s bytes" % (basename, sum([prop_map[p].bytes() for p in prop_map.keys()]))
    166         for p in sorted(props):
    167             f.write("  namespace %s_ns {\n    const UnicodeSet codepoint_set \n" % p.upper())
    168             f.write(prop_map[p].showC(6) + ";\n")
    169             f.write("    static BinaryPropertyObject property_object{%s, codepoint_set};\n  }\n" % p)
    170         f.write("}\n\n")
    171         cformat.close_header_file(f)
    172182        self.supported_props += props
    173183        self.property_data_headers.append(basename)
     
    181191        for p in self.property_enum_name_list:
    182192            k = self.property_kind_map[p]
    183             if (k == 'Enumerated' or k == 'Catalog') and p in self.supported_props:
     193            if p in self.supported_props:
    184194                objlist.append("&%s_ns::property_object" % p.upper())
    185195            elif k == 'String':
     
    188198                else:
    189199                    objlist.append("new UnsupportedPropertyObject(%s, PropertyObject::ClassTypeId::StringProperty)" % p)
    190             elif k == 'Binary' and p in self.supported_props:
    191                 objlist.append("&%s_ns::property_object" % p.upper())
    192200            else:
    193201                objlist.append("new UnsupportedPropertyObject(%s, PropertyObject::ClassTypeId::%sProperty)" % (p, k))
  • proto/charsetcompiler/UCD/cformat.py

    r4428 r4632  
    4545
    4646def write_imports(f, import_list):
    47    for i in import_list: f.write("#include %s\n" % i)
    48 
     47   for i in sorted(import_list): f.write("#include %s\n" % i)
    4948
    5049def multiline_fill(item_list, separator = ",", indent = 4, max_line_length = 75):
  • proto/charsetcompiler/UCD/unicode_set.py

    r4619 r4632  
    7171      setrep += (" " * indent) + " {"
    7272      setrep += cformat.multiline_fill(formatted_quads, ',', indent+2)
    73       setrep += '}}\n'
     73      setrep += '}}'
    7474      return setrep
    7575
Note: See TracChangeset for help on using the changeset viewer.