| 117 | |
| 118 | import bisect |
| 119 | class StringTable: |
| 120 | def __init__(self, lc, data): |
| 121 | self.offset = lc.string_table_offset |
| 122 | self.size = lc.string_table_size |
| 123 | self.content = data[self.offset : self.offset + self.size] |
| 124 | tmp_table = self.content.split(b'\0') |
| 125 | self.table = [] |
| 126 | str_offset = 0 |
| 127 | for s in tmp_table: |
| 128 | self.table.append((s, str_offset)) |
| 129 | str_offset += len(s) + 1 |
| 130 | self.str_off = [x[1] for x in self.table] |
| 131 | |
| 132 | def __getitem__(self, key): |
| 133 | i = bisect.bisect_left(self.str_off, key) |
| 134 | if i != len(self.str_off) and self.str_off[i] == key: |
| 135 | return self.table[i][0] |
| 136 | raise ValueError |
| 137 | |
| 138 | # def __str__(self): |
| 139 | # return (" StringTable: content {}".format(self.content)) |
| 140 | |
| 141 | |
| 142 | class DataInCode: |