Ignore:
Timestamp:
Aug 1, 2014, 4:19:41 PM (5 years ago)
Author:
cameron
Message:

Convert character set definitions to use canonical list of range data structure.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/charsetcompiler/CC_compiler.py

    r3943 r3944  
    108108   
    109109
    110     def char_test_expr(self, ch):
    111             #return make_bit_test(ord(ch), 8)
    112             return self.bit_pattern_expr(ord(ch), self.mEncoding.mask) 
     110    def char_test_expr(self, chval):
     111            return self.bit_pattern_expr(chval, self.mEncoding.mask) 
    113112
    114113    def GE_Range(self, N, n):
     
    162161
    163162    def char_or_range_expr(self, charset_item):
    164             if len(charset_item) == 1:
    165                 return self.char_test_expr(charset_item[0])
    166             elif len(charset_item) == 3:
    167                 if charset_item[1] == '-' and ord(charset_item[0]) <= ord(charset_item[2]):
    168                      return self.Make_Range(ord(charset_item[0]), ord(charset_item[2]))
    169             raise Exception("Bad character set item %s" % charset_item)
     163            (lo, hi) = charset_item
     164            if lo == hi:
     165                return self.char_test_expr(lo)
     166            else:
     167                return self.Make_Range(lo, hi)
    170168
    171169    def charset_expr(self, chardef):
     
    175173                #If all of the charset items are single codepoints
    176174                #such that X0 == Y0, X1 == Y1 etc.
    177                 for i in range(1, len(chardef.items)):
    178                     if len(chardef.items[i]) == 3:
     175                for item in chardef.items:
     176                    if item[0] != item[1]:
    179177                        combine = False
    180178                        break
     
    184182                        curr_item = chardef.items[i]
    185183                        next_item = chardef.items[i+1]
    186                         if ord(curr_item) != ord(next_item) - 2:
     184                        if curr_item[0] != next_item[0] - 2:
    187185                            combine = False
    188186                            break
    189187                if combine == True:
    190                     first_item = ord(chardef.items[0])
    191                     last_item = ord(chardef.items[len(chardef.items)-1])
     188                    lo = chardef.items[0][0]
     189                    hi = chardef.items[-1][0]
    192190                    utf_temp = self.mEncoding.mask - 1
    193                     first_item &= utf_temp
    194                     last_item |= (self.mEncoding.mask ^ utf_temp)
    195                     return self.char_or_range_expr(chr(first_item) + '-' + chr(last_item))
     191                    lo &= utf_temp
     192                    hi |= (self.mEncoding.mask ^ utf_temp)
     193                    return self.char_or_range_expr((lo, hi))
    196194            e1 = self.char_or_range_expr(chardef.items[0])
    197195            for i in range(1, len(chardef.items)):   
Note: See TracChangeset for help on using the changeset viewer.