Beispiel #1
0
 def get_pos(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)
Beispiel #2
0
 def get_pos(self, objid):
     offset = 0
     found = False
     for objid_range in self.objid_ranges:
         if objid_range.get_start_id() <= 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)
Beispiel #3
0
 def getpos(self, objid):
   if objid < self.objid0 or self.objid1 <= objid:
     raise IndexError(objid)
   i = self.entlen * (objid-self.objid0)
   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)
Beispiel #4
0
 def getpos(self, objid):
   if objid < self.objid_first or self.objid_last < objid:
     raise KeyError(objid)
   i = self.entlen * (objid-self.objid_first)
   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)
Beispiel #5
0
 def __init__(self, fp):
     self.fp = fp
     self.offsets = []
     (count, offsize) = struct.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])
Beispiel #6
0
 def __init__(self, fp):
     self.fp = fp
     self.offsets = []
     (count, offsize) = struct.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
Beispiel #7
0
 def get_objids(self):
     for (start, nobjs) in self.ranges:
         for i in xrange(nobjs):
             offset = self.entlen * i
             ent = self.data[offset:offset+self.entlen]
             f1 = nunpack(ent[:self.fl1], 1)
             if f1 == 1 or f1 == 2:
                 yield start+i
     return
Beispiel #8
0
 def get_pos(self, objid):
     index = 0
     for (start, nobjs) in self.ranges:
         if start <= objid and objid < start + nobjs:
             index += objid - start
         else:
             index += nobjs
     else:
         raise KeyError(objid)
     offset = self.entlen * index
     ent = self.data[offset:offset + self.entlen]
     f1 = nunpack(ent[:self.fl1], 1)
     f2 = nunpack(ent[self.fl1:self.fl1 + self.fl2])
     f3 = nunpack(ent[self.fl1 + self.fl2:])
     if f1 == 1:
         return (None, f2, f3)
     elif f1 == 2:
         return (f2, f3, 0)
     else:
         # this is a free object
         raise KeyError(objid)
Beispiel #9
0
 def get_pos(self, objid):
     index = 0
     for (start,nobjs) in self.ranges:
         if start <= objid and objid < start+nobjs:
             index += objid - start
         else:
             index += nobjs
     else:
         raise KeyError(objid)
     offset = self.entlen * index
     ent = self.data[offset:offset+self.entlen]
     f1 = nunpack(ent[:self.fl1], 1)
     f2 = nunpack(ent[self.fl1:self.fl1+self.fl2])
     f3 = nunpack(ent[self.fl1+self.fl2:])
     if f1 == 1:
         return (None, f2, f3)
     elif f1 == 2:
         return (f2, f3, 0)
     else:
         # this is a free object
         raise KeyError(objid)
    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.set_attr(literal_name(k), v)
            except PSSyntaxError:
                pass
            return

        if name == 'usecmap':
            try:
                ((_, cmapname), ) = self.pop(1)
                self.cmap.use_cmap(CMapDB.get_cmap(literal_name(cmapname)))
            except PSSyntaxError:
                pass
            except CMapDB.CMapNotFound:
                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 + struct.pack('>L', s1 + i)[-vlen:]
                    self.cmap.add_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.add_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.add_cid2unichr(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 + struct.pack('>L', base + i)[-vlen:]
                        self.cmap.add_cid2unichr(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.add_cid2unichr(nunpack(cid), code)
            return

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

        self.push((pos, token))
        return
Beispiel #11
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.set_attr(literal_name(k), v)
            except PSSyntaxError:
                pass
            return

        if name == 'usecmap':
            try:
                ((_,cmapname),) = self.pop(1)
                self.cmap.use_cmap(CMapDB.get_cmap(literal_name(cmapname)))
            except PSSyntaxError:
                pass
            except CMapDB.CMapNotFound:
                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+struct.pack('>L',s1+i)[-vlen:]
                    self.cmap.add_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.add_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.add_cid2unichr(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+struct.pack('>L',base+i)[-vlen:]
                        self.cmap.add_cid2unichr(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.add_cid2unichr(nunpack(cid), code)
            return

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

        self.push((pos, token))
        return