Fix decoding of trailing data entries

This commit is contained in:
Kovid Goyal 2011-07-31 15:16:40 -06:00
parent cf3184d8cd
commit 8721d5aa23
2 changed files with 19 additions and 12 deletions

View File

@ -1377,7 +1377,7 @@ class MOBIFile(object): # {{{
self.index_header, self.cncx)
self.indexing_record_nums = set(xrange(pir,
pir+2+self.index_header.num_of_cncx_blocks))
self.secondary_index_record = self.secondary_index_record = None
self.secondary_index_record = self.secondary_index_header = None
sir = self.mobi_header.secondary_index_record
if sir != 0xffffffff:
self.secondary_index_header = SecondaryIndexHeader(self.records[sir])

View File

@ -169,18 +169,25 @@ def get_trailing_data(record, extra_data_flags):
:return: Trailing data, record - trailing data
'''
data = OrderedDict()
for i in xrange(16, -1, -1):
flag = 1 << i # 2**i
if flag & extra_data_flags:
if i == 0:
flags = extra_data_flags >> 1
num = 0
while flags:
num += 1
if flags & 0b1:
sz, consumed = decint(record, forward=False)
if sz > consumed:
data[num] = record[-sz:-consumed]
record = record[:-sz]
flags >>= 1
# Read multibyte chars if any
if extra_data_flags & 0b1:
# Only the first two bits are used for the size since there can
# never be more than 3 trailing multibyte chars
sz = (ord(record[-1]) & 0b11) + 1
consumed = 1
else:
sz, consumed = decint(record, forward=False)
if sz > consumed:
data[i] = record[-sz:-consumed]
data[0] = record[-sz:-consumed]
record = record[:-sz]
return data, record