1
# -*- coding: utf-8 -*-
3
Read the header data from a pdb file.
7
__copyright__ = '2009, John Schember <john@nachtimwald.com>'
8
__docformat__ = 'restructuredtext en'
14
class PdbHeaderReader(object):
16
def __init__(self, stream):
18
self.ident = self.identity()
19
self.num_sections = self.section_count()
20
self.title = self.name()
24
ident = self.stream.read(8)
27
def section_count(self):
29
return struct.unpack('>H', self.stream.read(2))[0]
33
return self.stream.read(32).replace('\x00', '')
35
def full_section_info(self, number):
36
if number not in range(0, self.num_sections):
37
raise ValueError('Not a valid section number %i' % number)
39
self.stream.seek(78 + number * 8)
40
offset, a1, a2, a3, a4 = struct.unpack('>LBBBB', self.stream.read(8))[0]
41
flags, val = a1, a2 << 16 | a3 << 8 | a4
42
return (offset, flags, val)
44
def section_offset(self, number):
45
if number not in range(0, self.num_sections):
46
raise ValueError('Not a valid section number %i' % number)
48
self.stream.seek(78 + number * 8)
49
return struct.unpack('>LBBBB', self.stream.read(8))[0]
51
def section_data(self, number):
52
if number not in range(0, self.num_sections):
53
raise ValueError('Not a valid section number %i' % number)
55
start = self.section_offset(number)
56
if number == self.num_sections -1:
57
self.stream.seek(0, 2)
58
end = self.stream.tell()
60
end = self.section_offset(number + 1)
61
self.stream.seek(start)
62
return self.stream.read(end - start)
65
class PdbHeaderBuilder(object):
67
def __init__(self, identity, title):
68
self.identity = identity.ljust(3, '\x00')[:8]
69
self.title = '%s\x00' % re.sub('[^-A-Za-z0-9 ]+', '_', title).ljust(31, '\x00')[:31].encode('ascii', 'replace')
71
def build_header(self, section_lengths, out_stream):
73
section_lengths = Lenght of each section in file.
76
now = int(time.time())
77
nrecords = len(section_lengths)
79
out_stream.write(self.title + struct.pack('>HHIIIIII', 0, 0, now, now, 0, 0, 0, 0))
80
out_stream.write(self.identity + struct.pack('>IIH', nrecords, 0, nrecords))
82
offset = 78 + (8 * nrecords) + 2
83
for id, record in enumerate(section_lengths):
84
out_stream.write(struct.pack('>LBBBB', long(offset), 0, 0, 0, 0))
86
out_stream.write('\x00\x00')