Exemple #1
0
 def getpos(self, objid):
     offset = 0
     found = False
     for objid_range in self.objid_ranges:
         if objid >= objid_range.get_start_id(
         ) and objid <= objid_range.get_end_id():
             offset += objid - objid_range.get_start_id()
             found = True
             break
         else:
             offset += objid_range.get_nobjs()
     if not found: raise KeyError(objid)
     i = self.entlen * offset
     ent = self.data[i:i + self.entlen]
     f1 = nunpack(ent[:self.fl1], 1)
     if f1 == 1:
         pos = nunpack(ent[self.fl1:self.fl1 + self.fl2])
         genno = nunpack(ent[self.fl1 + self.fl2:])
         return (None, pos)
     elif f1 == 2:
         objid = nunpack(ent[self.fl1:self.fl1 + self.fl2])
         index = nunpack(ent[self.fl1 + self.fl2:])
         return (objid, index)
     # this is a free object
     raise KeyError(objid)
Exemple #2
0
def test_nunpack():
    eq_(utils.nunpack(b'\x42'), 0x42)
    eq_(utils.nunpack(b'\x41\x42'), 0x4142)
    eq_(utils.nunpack(b'\x40\x41\x42'), 0x404142)
    eq_(utils.nunpack(b'\x39\x40\x41\x42'), 0x39404142)
    eq_(utils.nunpack(b'', default=42), 42)
    with raises(TypeError):
        utils.nunpack(b'\x42\x42\x42\x42\x42')
    # strings are correctly converted to bytes
    eq_(utils.nunpack('\x42\xfc'), 0x42fc)
Exemple #3
0
def test_nunpack():
    eq_(utils.nunpack(b'\x42'), 0x42)
    eq_(utils.nunpack(b'\x41\x42'), 0x4142)
    eq_(utils.nunpack(b'\x40\x41\x42'), 0x404142)
    eq_(utils.nunpack(b'\x39\x40\x41\x42'), 0x39404142)
    eq_(utils.nunpack(b'', default=42), 42)
    with raises(TypeError):
        utils.nunpack(b'\x42\x42\x42\x42\x42')
    # strings are correctly converted to bytes
    eq_(utils.nunpack('\x42\xfc'), 0x42fc)
Exemple #4
0
 def __init__(self, fp):
   self.fp = fp
   self.offsets = []
   (count, offsize) = unpack('>HB', self.fp.read(3))
   for i in xrange(count+1):
     self.offsets.append(nunpack(self.fp.read(offsize)))
   self.base = self.fp.tell()-1
   self.fp.seek(self.base+self.offsets[-1])
   return
Exemple #5
0
 def __init__(self, fp):
     self.fp = fp
     self.offsets = []
     (count, offsize) = unpack('>HB', self.fp.read(3))
     for i in xrange(count + 1):
         self.offsets.append(nunpack(self.fp.read(offsize)))
     self.base = self.fp.tell() - 1
     self.fp.seek(self.base + self.offsets[-1])
     return
Exemple #6
0
 def test_nunpack(self):
     """Test unpacking of 1 to 4 byte integers (big endian)"""
     self.assertEqual(0x26, nunpack('\x26'))
     self.assertEqual(0xa51f33, nunpack('\xa5\x1f\x33'))
     self.assertEqual(0x1151bb3e, nunpack('\x11\x51\xbb\x3e'))
     self.assertEqual(1234, nunpack('', default=1234))
     with self.assertRaises(TypeError):
         nunpack('\xa5\x1f\x33\x11\x51\xbb\x3e')
Exemple #7
0
 def test_nunpack(self):
     """Test unpacking of 1 to 4 byte integers (big endian)"""
     self.assertEqual(0x26, nunpack('\x26'))
     self.assertEqual(0xa51f33, nunpack('\xa5\x1f\x33'))
     self.assertEqual(0x1151bb3e, nunpack('\x11\x51\xbb\x3e'))
     self.assertEqual(1234, nunpack('', default=1234))
     with self.assertRaises(TypeError):
         nunpack('\xa5\x1f\x33\x11\x51\xbb\x3e')
Exemple #8
0
 def getpos(self, objid):
   offset = 0
   found = False
   for objid_range in self.objid_ranges:
     if objid >= objid_range.get_start_id() and objid <= objid_range.get_end_id():
       offset += objid - objid_range.get_start_id()
       found = True
       break
     else:
       offset += objid_range.get_nobjs()
   if not found: raise KeyError(objid)
   i = self.entlen * offset
   ent = self.data[i:i+self.entlen]
   f1 = nunpack(ent[:self.fl1], 1)
   if f1 == 1:
     pos = nunpack(ent[self.fl1:self.fl1+self.fl2])
     genno = nunpack(ent[self.fl1+self.fl2:])
     return (None, pos)
   elif f1 == 2:
     objid = nunpack(ent[self.fl1:self.fl1+self.fl2])
     index = nunpack(ent[self.fl1+self.fl2:])
     return (objid, index)
   # this is a free object
   raise KeyError(objid)
Exemple #9
0
  def do_keyword(self, pos, token):
    name = token.name
    if name == 'begincmap':
      self.in_cmap = True
      self.popall()
      return
    elif name == 'endcmap':
      self.in_cmap = False
      return
    if not self.in_cmap: return
    #
    if name == 'def':
      try:
        ((_,k),(_,v)) = self.pop(2)
        self.cmap.attrs[literal_name(k)] = v
      except PSSyntaxError:
        pass
      return
    
    if name == 'usecmap':
      try:
        ((_,cmapname),) = self.pop(1)
        self.cmap.copycmap(CMapDB.get_cmap(literal_name(cmapname)))
      except PSSyntaxError:
        pass
      return
      
    if name == 'begincodespacerange':
      self.popall()
      return
    if name == 'endcodespacerange':
      self.popall()
      return
    
    if name == 'begincidrange':
      self.popall()
      return
    if name == 'endcidrange':
      objs = [ obj for (_,obj) in self.popall() ]
      for (s,e,cid) in choplist(3, objs):
        if (not isinstance(s, str) or not isinstance(e, str) or
            not isinstance(cid, int) or len(s) != len(e)): continue
        sprefix = s[:-4]
        eprefix = e[:-4]
        if sprefix != eprefix: continue
        svar = s[-4:]
        evar = e[-4:]
        s1 = nunpack(svar)
        e1 = nunpack(evar)
        vlen = len(svar)
        #assert s1 <= e1
        for i in xrange(e1-s1+1):
          x = sprefix+pack('>L',s1+i)[-vlen:]
          self.cmap.register_code2cid(x, cid+i)
      return
    
    if name == 'begincidchar':
      self.popall()
      return
    if name == 'endcidchar':
      objs = [ obj for (_,obj) in self.popall() ]
      for (cid,code) in choplist(2, objs):
        if isinstance(code, str) and isinstance(cid, str):
          self.cmap.register_code2cid(code, nunpack(cid))
      return
        
    if name == 'beginbfrange':
      self.popall()
      return
    if name == 'endbfrange':
      objs = [ obj for (_,obj) in self.popall() ]
      for (s,e,code) in choplist(3, objs):
        if (not isinstance(s, str) or not isinstance(e, str) or
            len(s) != len(e)): continue
        s1 = nunpack(s)
        e1 = nunpack(e)
        #assert s1 <= e1
        if isinstance(code, list):
          for i in xrange(e1-s1+1):
            self.cmap.register_cid2code(s1+i, code[i])
        else:
          var = code[-4:]
          base = nunpack(var)
          prefix = code[:-4]
          vlen = len(var)
          for i in xrange(e1-s1+1):
            x = prefix+pack('>L',base+i)[-vlen:]
            self.cmap.register_cid2code(s1+i, x)
      return
        
    if name == 'beginbfchar':
      self.popall()
      return
    if name == 'endbfchar':
      objs = [ obj for (_,obj) in self.popall() ]
      for (cid,code) in choplist(2, objs):
        if isinstance(cid, str) and isinstance(code, str):
          self.cmap.register_cid2code(nunpack(cid), code)
      return
        
    if name == 'beginnotdefrange':
      self.popall()
      return
    if name == 'endnotdefrange':
      self.popall()
      return

    self.push((pos, token))
    return
Exemple #10
0
    def do_keyword(self, pos, token):
        name = token.name
        if name == 'begincmap':
            self.in_cmap = True
            self.popall()
            return
        elif name == 'endcmap':
            self.in_cmap = False
            return
        if not self.in_cmap: return
        #
        if name == 'def':
            try:
                ((_, k), (_, v)) = self.pop(2)
                self.cmap.attrs[literal_name(k)] = v
            except PSSyntaxError:
                pass
            return

        if name == 'usecmap':
            try:
                ((_, cmapname), ) = self.pop(1)
                self.cmap.copycmap(CMapDB.get_cmap(literal_name(cmapname)))
            except PSSyntaxError:
                pass
            return

        if name == 'begincodespacerange':
            self.popall()
            return
        if name == 'endcodespacerange':
            self.popall()
            return

        if name == 'begincidrange':
            self.popall()
            return
        if name == 'endcidrange':
            objs = [obj for (_, obj) in self.popall()]
            for (s, e, cid) in choplist(3, objs):
                if (not isinstance(s, str) or not isinstance(e, str)
                        or not isinstance(cid, int) or len(s) != len(e)):
                    continue
                sprefix = s[:-4]
                eprefix = e[:-4]
                if sprefix != eprefix: continue
                svar = s[-4:]
                evar = e[-4:]
                s1 = nunpack(svar)
                e1 = nunpack(evar)
                vlen = len(svar)
                #assert s1 <= e1
                for i in xrange(e1 - s1 + 1):
                    x = sprefix + pack('>L', s1 + i)[-vlen:]
                    self.cmap.register_code2cid(x, cid + i)
            return

        if name == 'begincidchar':
            self.popall()
            return
        if name == 'endcidchar':
            objs = [obj for (_, obj) in self.popall()]
            for (cid, code) in choplist(2, objs):
                if isinstance(code, str) and isinstance(cid, str):
                    self.cmap.register_code2cid(code, nunpack(cid))
            return

        if name == 'beginbfrange':
            self.popall()
            return
        if name == 'endbfrange':
            objs = [obj for (_, obj) in self.popall()]
            for (s, e, code) in choplist(3, objs):
                if (not isinstance(s, str) or not isinstance(e, str)
                        or len(s) != len(e)):
                    continue
                s1 = nunpack(s)
                e1 = nunpack(e)
                #assert s1 <= e1
                if isinstance(code, list):
                    for i in xrange(e1 - s1 + 1):
                        self.cmap.register_cid2code(s1 + i, code[i])
                else:
                    var = code[-4:]
                    base = nunpack(var)
                    prefix = code[:-4]
                    vlen = len(var)
                    for i in xrange(e1 - s1 + 1):
                        x = prefix + pack('>L', base + i)[-vlen:]
                        self.cmap.register_cid2code(s1 + i, x)
            return

        if name == 'beginbfchar':
            self.popall()
            return
        if name == 'endbfchar':
            objs = [obj for (_, obj) in self.popall()]
            for (cid, code) in choplist(2, objs):
                if isinstance(cid, str) and isinstance(code, str):
                    self.cmap.register_cid2code(nunpack(cid), code)
            return

        if name == 'beginnotdefrange':
            self.popall()
            return
        if name == 'endnotdefrange':
            self.popall()
            return

        self.push((pos, token))
        return