home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1027 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  3.9 KB  |  90 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __license__ = 'GPL v3'
  5. __copyright__ = '2009, John Schember <john@nachtimwald.com>'
  6. __docformat__ = 'restructuredtext en'
  7. import re
  8. import struct
  9. import time
  10.  
  11. class PdbHeaderReader(object):
  12.     
  13.     def __init__(self, stream):
  14.         self.stream = stream
  15.         self.ident = self.identity()
  16.         self.num_sections = self.section_count()
  17.         self.title = self.name()
  18.  
  19.     
  20.     def identity(self):
  21.         self.stream.seek(60)
  22.         ident = self.stream.read(8)
  23.         return ident
  24.  
  25.     
  26.     def section_count(self):
  27.         self.stream.seek(76)
  28.         return struct.unpack('>H', self.stream.read(2))[0]
  29.  
  30.     
  31.     def name(self):
  32.         self.stream.seek(0)
  33.         return re.sub('[^-A-Za-z0-9 ]+', '_', self.stream.read(32).replace('\x00', ''))
  34.  
  35.     
  36.     def full_section_info(self, number):
  37.         if number not in range(0, self.num_sections):
  38.             raise ValueError('Not a valid section number %i' % number)
  39.         number not in range(0, self.num_sections)
  40.         self.stream.seek(78 + number * 8)
  41.         (offset, a1, a2, a3, a4) = struct.unpack('>LBBBB', self.stream.read(8))[0]
  42.         flags = a1
  43.         val = a2 << 16 | a3 << 8 | a4
  44.         return (offset, flags, val)
  45.  
  46.     
  47.     def section_offset(self, number):
  48.         if number not in range(0, self.num_sections):
  49.             raise ValueError('Not a valid section number %i' % number)
  50.         number not in range(0, self.num_sections)
  51.         self.stream.seek(78 + number * 8)
  52.         return struct.unpack('>LBBBB', self.stream.read(8))[0]
  53.  
  54.     
  55.     def section_data(self, number):
  56.         if number not in range(0, self.num_sections):
  57.             raise ValueError('Not a valid section number %i' % number)
  58.         number not in range(0, self.num_sections)
  59.         start = self.section_offset(number)
  60.         if number == self.num_sections - 1:
  61.             self.stream.seek(0, 2)
  62.             end = self.stream.tell()
  63.         else:
  64.             end = self.section_offset(number + 1)
  65.         self.stream.seek(start)
  66.         return self.stream.read(end - start)
  67.  
  68.  
  69.  
  70. class PdbHeaderBuilder(object):
  71.     
  72.     def __init__(self, identity, title):
  73.         self.identity = identity.ljust(3, '\x00')[:8]
  74.         self.title = '%s\x00' % re.sub('[^-A-Za-z0-9 ]+', '_', title).ljust(31, '\x00')[:31].encode('ascii', 'replace')
  75.  
  76.     
  77.     def build_header(self, section_lengths, out_stream):
  78.         now = int(time.time())
  79.         nrecords = len(section_lengths)
  80.         out_stream.write(self.title + struct.pack('>HHIIIIII', 0, 0, now, now, 0, 0, 0, 0))
  81.         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))
  85.             offset += record
  86.         
  87.         out_stream.write('\x00\x00')
  88.  
  89.  
  90.