Show
Ignore:
Timestamp:
09/13/06 10:45:42 (18 years ago)
Author:
jerome
Message:

First attempt at a work SPL1 parser.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • pkpgcounter/trunk/pkpgpdls/spl1.py

    r408 r409  
    6363    def escape(self, nextpos) :     
    6464        """Handles the ESC code.""" 
     65        self.isbitmap = False 
    6566        pos = endpos = nextpos 
    6667        minfile = self.minfile 
     
    8384        # NB : First time will be at page 0 (i.e. **before** page 1) ! 
    8485        stuff = self.escapedStuff.setdefault(self.pagecount, []) 
    85         stuff.append(minfile[pos-1 : endpos]) 
    86         self.logdebug("Escaped datas : [%s]" % repr(minfile[pos : endpos])) 
     86        datas = minfile[pos-1 : endpos] 
     87        stuff.append(datas) 
     88        if datas.endswith("$PJL BITMAP START\r\n") : 
     89            self.isbitmap = True 
     90        self.logdebug("Escaped datas : [%s]" % repr(datas)) 
    8791        return endpos - pos + 1 
    8892         
     
    9397        """ 
    9498        infileno = self.infile.fileno() 
    95         self.minfile = mmap.mmap(infileno, os.fstat(infileno)[6], prot=mmap.PROT_READ, flags=mmap.MAP_SHARED) 
     99        self.minfile = minfile = mmap.mmap(infileno, os.fstat(infileno)[6], prot=mmap.PROT_READ, flags=mmap.MAP_SHARED) 
    96100        self.pagecount = 0 
    97101        self.escapedStuff = {}   # For escaped datas, mostly PJL commands 
    98102        self.bigEndian() 
    99103         
     104        self.isbitmap = False 
    100105        pos = 0 
    101         tags = self.tags 
    102106        try : 
    103107            try : 
    104108                while 1 : 
    105                     tag = self.minfile[pos] 
     109                    tag = minfile[pos] 
    106110                    if tag in ESCAPECHARS : 
    107111                        pos += self.escape(pos+1) 
    108112                    else :     
    109                         offset = unpack(self.unpackLong, self.minfile[pos:pos+4])[0] 
    110                         sequencenum = unpack(self.unpackShort, self.minfile[pos+4:pos+6])[0] 
    111                         codesop = " ".join([ "%02x" % ord(v) for v in self.minfile[pos+6:pos+12]]) 
    112                         self.logdebug("Sequence Number : %04x" % sequencenum) 
    113                         self.logdebug("%08x  ====>  %s" % (pos+6, codesop)) 
     113                        if not self.isbitmap : 
     114                            raise pdlparser.PDLParserError, "Unfortunately this file format is incompletely recognized. Parsing aborted." 
     115                        offset = unpack(self.unpackLong, minfile[pos:pos+4])[0] 
     116                        sequencenum = unpack(self.unpackShort, minfile[pos+4:pos+6])[0] 
     117                        codesop = " ".join([ "%02x" % ord(v) for v in minfile[pos+6:pos+12]]) 
     118                        if codesop != "06 00 00 80 13 40" : 
     119                            raise pdlparser.PDLParserError, "Unfortunately this file format is incompletely recognized. Parsing aborted." 
     120                        self.logdebug("%08x   ==>   %04x   ==>   %s" % (pos, sequencenum, codesop))     
     121                        if not sequencenum : 
     122                            self.pagecount += 1 
    114123                        pos += 4 + offset 
    115                         self.logdebug("New position : %08x" % pos) 
    116124            except IndexError : # EOF ?             
    117125                pass 
    118126        finally : 
    119             self.minfile.close() 
     127            minfile.close() 
    120128        return self.pagecount 
    121129