def get_unicode_hex(self): flag = 1 val = 0 for i in range(4): ch = current_char(self) if ch >= '0' and ch <= '9': ch0 = ch val = 16 * val + (ch0 - 48) skip_char(self) elif ch >= 'a' and ch <= 'f': ch0 = ch val = 16 * val + (ch0 - 87) skip_char(self) elif ch >= 'A' and ch <= 'F': ch0 = ch val = 16 * val + (ch0 - 55) skip_char(self) else: flag = 0 break if flag: return PyUnicode_FromOrdinal(val) else: errors.error( self, 'Invalid unicode character %r' % self.line[self.pos - 4:self.pos + 1])
def get_unicode_hex(self): flag = 1 val = 0 for i in range(4): ch = current_char(self) if ch >= '0' and ch <= '9': ch0 = ch val = 16*val + (ch0 - 48) skip_char(self) elif ch >= 'a' and ch <= 'f': ch0 = ch val = 16*val + (ch0 - 87) skip_char(self) elif ch >= 'A' and ch <= 'F': ch0 = ch val = 16*val + (ch0 - 55) skip_char(self) else: flag = 0 break if flag: return PyUnicode_FromOrdinal(val) else: errors.error(self, 'Invalid unicode character %r' % self.line[self.pos-4:self.pos+1])
def get_base64(self): text = None ch = next_char(self) pos0 = self.pos while 1: if ch >= '0' and ch <= '9': ch = next_char(self) elif ch >= 'a' and ch <= 'z': ch = next_char(self) elif ch >= 'A' and ch <= 'Z': ch = next_char(self) elif ch == '+' or ch == '/': ch = next_char(self) elif ch <= ' ': if text is None: text = get_chunk(self, pos0) else: text += get_chunk(self, pos0) self.skip_spaces() if self.eof: errors.error(self, 'MIME Base64 string is not finished') pos0 = self.pos ch = self.line[pos0] elif ch == '=': ch = next_char(self) if ch == '=': ch = next_char(self) if text is None: text = get_chunk(self, pos0) else: text += get_chunk(self, pos0) return self.sbuilder.create_binary(text) else: raise errors.error( self, 'Invalid character %r in MIME Base64 string' % ch)
def get_base64(self): text = None ch = next_char(self) pos0 = self.pos while 1: if ch >= '0' and ch <= '9': ch = next_char(self) elif ch >= 'a' and ch <= 'z': ch = next_char(self) elif ch >= 'A' and ch <= 'Z': ch = next_char(self) elif ch == '+' or ch == '/': ch = next_char(self) elif ch <= ' ': if text is None: text = get_chunk(self, pos0) else: text += get_chunk(self, pos0) self.skip_spaces() if self.eof: errors.error(self, 'MIME Base64 string is not finished') pos0 = self.pos ch = self.line[pos0] elif ch == '=': ch = next_char(self) if ch == '=': ch = next_char(self) if text is None: text = get_chunk(self, pos0) else: text += get_chunk(self, pos0) return self.sbuilder.create_binary(text) else: raise errors.error(self, 'Invalid character %r in MIME Base64 string' % ch)
def get_value(self, idn, idn0): ch = current_char(self) if ch == '#': self.skip_comments() ch = current_char(self) if (ch <= '9' and ch >= '0'): val = self.get_number() return val if ch == '-': ch = c_unicode_char(self.line, self.pos+1) if ch.isdigit(): return self.get_number() else: skip_char(self) return self.get_negative_constant() elif ch == '"': text = self.get_string(ch) ch = self.skip_spaces() if ch == ':': errors.error_unexpected_keyval() else: return text elif ch == '{': self.bc += 1 skip_char(self) return self.get_dict_value() elif ch == '[': self.bs += 1 skip_char(self) return self.get_list_value() elif ch == '(': self.bq += 1 skip_char(self) return self.get_tuple_value() elif ch == '^': skip_char(self) return self.get_date_time() elif ch.isalpha() or ch == '_': name = self.get_name() val = reserved_name_dict.get(name, c_undefined) if val is not c_undefined: return val ch = self.skip_spaces() return self.get_named(name, idn, idn0) elif ch == '`': return self.get_string(ch) elif ch == "'": name = self.get_string(ch) self.skip_spaces() return self.get_named(name, idn, idn0) elif ch == '|': return self.get_base64() elif ch == '∞': # \U221E ch = next_char(self) if ch == 'D' or ch == 'd' or ch == '$': skip_char(self) return self.sbuilder.create_decimal_inf() else: return self.sbuilder.create_inf() elif ch == '?': ch = next_char(self) if ch == 'D' or ch == 'd' or ch == '$': skip_char(self) return self.sbuilder.create_decimal_nan() else: return self.sbuilder.create_nan() elif ch == '*': skip_char(self) label = self.get_label() #if self.eof: # errors.error_unexpected_end(self) if label is None: errors.error_expected_label(self) else: return self.labeled_objects.get(label, c_undefined) elif ch == '&': #pos0 = self.pos skip_char(self) label = self.get_label() if label is None: errors.error_expected_label(self) self.skip_spaces() val = self.get_value(idn, idn0) self.labeled_objects[label] = val return val elif ch == '$': skip_char(self) name = self.get_name() val = self.c_constants.get(name, c_undefined) if val is c_undefined: errors.error(self, "Undefined name %r" % name) return val elif ch == '∅': skip_char(self) return set() else: errors.error_unexpected_value(self, 'Unexpected value')
def get_string(self, endch): text = None ch = next_char(self) pos0 = self.pos while 1: if ch == endch: if text is None: text = get_chunk(self, pos0) else: text += get_chunk(self, pos0) skip_char(self) return text elif ch == '\n' or ch == '\r': if text is None: text = get_chunk(self, pos0) else: text += get_chunk(self, pos0) text += '\n' self.next_line() if self.eof: errors.error_unexpected_end_string(self) #self.skip_whitespace() pos0 = self.pos ch = current_char(self) elif ch == '\\': if text is None: text = get_chunk(self, pos0) else: text += get_chunk(self, pos0) ch = next_char(self) if ch == endch: if endch == "'": text += "'" elif endch == '"': text += '"' elif endch == '`': text += '`' else: raise errors.error(self, "String error") skip_char(self) elif ch == '\n' or ch == '\r': if text is None: text = get_chunk(self, pos0) else: text += get_chunk(self, pos0) self.next_line() if self.eof: errors.error_unexpected_end_string(self) # elif ch == 'n': # text += "\n" # skip_char(self) # elif ch == 'r': # text += "\r" # skip_char(self) # elif ch == 't': # text += "\t" # skip_char(self) # elif ch == 'u' or ch == 'U': # skip_char(self) # text += self.get_unicode_hex() else: text += '\\' pos0 = self.pos ch = current_char(self) else: ch = next_char(self)
def _check_pairs(self): if self.bc > 0: errors.error(self, 'Missed closing }') elif self.bc < 0: errors.error(self, 'Extra closing }') if self.bs > 0: errors.error(self, 'Missed closing ]') elif self.bs < 0: errors.error(self, 'Extra closing ]') if self.bq > 0: errors.error(self, 'Missed closing )') elif self.bq < 0: errors.error(self, 'Extra closing )') if self.ba > 0: errors.error(self, 'Missed closing >') elif self.ba < 0: errors.error(self, 'Extra closing >')
def get_list_value(self): is_odict = 0 ch = self.skip_spaces() if ch == '#': self.skip_comments() ch = current_char(self) if self.eof: if is_odict: errors.error_unexpected_end_odict(self) else: errors.error_unexpected_end_list(self) if ch == ']': skip_char(self) self.bs -= 1 return [] if ch == ':': ch = next_char(self) if ch == ']': skip_char(self) self.bs -= 1 return c_new_odict([]) else: errors.error(self, "Invalid empty ordered dict") val = self.get_keyval_or_value() if type(val) is KeyVal: is_odict = 1 mapping = c_new_odict([]) mapping[self.keyval.key] = self.keyval.val else: sequence = [val] ch = self.skip_spaces() while 1: if self.eof: if is_odict: errors.error_unexpected_end_odict(self) else: errors.error_unexpected_end_list(self) if ch == '#': self.skip_comments() ch = current_char(self) if ch == ']': skip_char(self) self.bs -= 1 if is_odict: return mapping else: return sequence if is_odict: self.get_keyval_odict(mapping) else: sequence.append(self.get_value(0, 0)) ch = self.skip_spaces()
def get_value(self, idn, idn0): ch = current_char(self) if ch == '#': self.skip_comments() ch = current_char(self) if (ch <= '9' and ch >= '0'): val = self.get_number() return val if ch == '-': ch = c_unicode_char(self.line, self.pos + 1) if ch.isdigit(): return self.get_number() else: skip_char(self) return self.get_negative_constant() elif ch == '"': text = self.get_string(ch) ch = self.skip_spaces() if ch == ':': errors.error_unexpected_keyval() else: return text elif ch == '{': self.bc += 1 skip_char(self) return self.get_dict_value() elif ch == '[': self.bs += 1 skip_char(self) return self.get_list_value() elif ch == '(': self.bq += 1 skip_char(self) return self.get_tuple_value() elif ch == '^': skip_char(self) return self.get_date_time() elif ch.isalpha() or ch == '_': name = self.get_name() val = reserved_name_dict.get(name, c_undefined) if val is not c_undefined: return val ch = self.skip_spaces() return self.get_named(name, idn, idn0) elif ch == '`': return self.get_string(ch) elif ch == "'": name = self.get_string(ch) self.skip_spaces() return self.get_named(name, idn, idn0) elif ch == '|': return self.get_base64() elif ch == '∞': # \U221E ch = next_char(self) if ch == 'D' or ch == 'd' or ch == '$': skip_char(self) return self.sbuilder.create_decimal_inf() else: return self.sbuilder.create_inf() elif ch == '?': ch = next_char(self) if ch == 'D' or ch == 'd' or ch == '$': skip_char(self) return self.sbuilder.create_decimal_nan() else: return self.sbuilder.create_nan() elif ch == '*': skip_char(self) label = self.get_label() #if self.eof: # errors.error_unexpected_end(self) if label is None: errors.error_expected_label(self) else: return self.labeled_objects.get(label, c_undefined) elif ch == '&': #pos0 = self.pos skip_char(self) label = self.get_label() if label is None: errors.error_expected_label(self) self.skip_spaces() val = self.get_value(idn, idn0) self.labeled_objects[label] = val return val elif ch == '$': skip_char(self) name = self.get_name() val = self.c_constants.get(name, c_undefined) if val is c_undefined: errors.error(self, "Undefined name %r" % name) return val elif ch == '∅': skip_char(self) return set() else: errors.error_unexpected_value(self, 'Unexpected value')