def __getitem__(self, item): while item >= len(self.cache): s = self.source[0] if s == '\x00': length = unsigned_int(self.source[1:5]) b = ":" + self.source[5:5 + length] self.source = self.source[5 + length:] elif s == '\x01': length = unsigned_int(self.source[1:5]) #<-- length? b = '"' + quote(self.source[5:5 + length]) + '"' self.source = self.source[5 + length:] if s == '\x80': length = ord(self.source[1]) b = ":" + self.source[2:2 + length] self.source = self.source[2 + length:] elif s == '\x81': length = ord(self.source[1]) #<-- length? b = '"' + quote(self.source[2:2 + length]) + '"' self.source = self.source[2 + length:] elif s == '\x02': b = d_double(self.source[1:9]) self.source = self.source[9:] elif s == '\x82': b = d_signed_int(self.source[1:4]) self.source = self.source[4:] elif s == '\x07': n = signed_long_int(self.source[1:9]) d = signed_long_int(self.source[9:17]) b = str(n) + '/' + str(d) self.source = self.source[17:] elif s == '\x87': n = signed_char(self.source[1]) d = ord(self.source[2]) b = str(n) + '/' + str(d) self.source = self.source[3:] self.cache.append(b) return self.cache[item]
def get_literals(code): i = 0 while i < len(code): s = code[i] if s == '\x00': length = unsigned_int(code[i+1:i+5]) yield "i" + code[i+5:i+5 + length] i += 5 + length elif s == '\x01': length = unsigned_int(code[i+1:i+5]) yield "s" + quote(code[i+5:i+5 + length]) i += 5 + length elif s == '\x80': length = ord(code[i+1]) yield "i" + code[i+2:i+2 + length] i += 1 + length elif s == '\x81': length = ord(code[i+1]) yield "s" + quote(code[i+2:i+2 + length]) i += 1 + length elif s == '\x02': yield 'n' + d_double(code[i+1:i+9]) i += 9 elif s == '\x82': yield 'n' + d_signed_int(code[i+1:i+4]) i += 4 elif s == '\x07': n = signed_long_int(code[i+1:i+9]) d = signed_long_int(code[i+9:i+17]) yield 'f' + str(n) + '/' + str(d) i += 17 elif s == '\x87': n = signed_char(code[i+1]) d = ord(code[i+2]) yield 'f' + str(n) + '/' + str(d) i += 3 i += 1