Show
Ignore:
Timestamp:
09/08/06 13:44:32 (18 years ago)
Author:
jerome
Message:

Much improved parser, now skips HPGL2.

Files:
1 modified

Legend:

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

    r395 r396  
    3232import pjl 
    3333 
    34 FORMFEED = chr(12) 
    35 ESCAPE = chr(27) 
     34NUL = chr(0x00) 
     35FORMFEED = chr(0x0c) 
     36ESCAPE = chr(0x1b) 
     37ASCIILIMIT = chr(0x80) 
    3638 
    3739class Parser(pdlparser.PDLParser) : 
     
    99101            return False 
    100102         
    101     def setPageDict(self, pages, number, attribute, value) : 
     103    def setPageDict(self, attribute, value) : 
    102104        """Initializes a page dictionnary.""" 
    103         dic = pages.setdefault(number, { "copies" : 1, "mediasource" : "Main", "mediasize" : "Default", "mediatype" : "Plain", "orientation" : "Portrait", "escaped" : "", "duplex": 0}) 
     105        dic = self.pages.setdefault(self.pagecount, { "copies" : 1, "mediasource" : "Main", "mediasize" : "Default", "mediatype" : "Plain", "orientation" : "Portrait", "escaped" : "", "duplex": 0}) 
    104106        dic[attribute] = value 
    105107         
     
    107109        """Reads a byte from the input stream.""" 
    108110        tag = ord(self.minfile[self.pos]) 
    109         #self.logdebug("%08x  ===>  %02x" % (self.pos, tag)) 
     111        if tag == 0x0c : 
     112            self.logdebug("%08x ====> %02x %02x %02x %02x" % 
     113                 (self.pos, 
     114                 ord(self.minfile[self.pos-2]), 
     115                 ord(self.minfile[self.pos-1]), 
     116                 ord(self.minfile[self.pos-0]), 
     117                 ord(self.minfile[self.pos+1]))) 
    110118        self.pos += 1 
    111119        return tag 
     
    113121    def endPage(self) :     
    114122        """Handle the FF marker.""" 
    115         self.logdebug("FORMFEED %i" % self.pagecount) 
     123        self.logdebug("FORMFEED %i at %08x" % (self.pagecount, self.pos-1)) 
    116124        self.pagecount += 1 
    117125         
     
    119127        """Handles the ESC% sequence.""" 
    120128        if self.minfile[self.pos : self.pos+7] == r"-12345X" : 
    121             self.logdebug("Generic ESCAPE sequence at %08x" % self.pos) 
     129            #self.logdebug("Generic ESCAPE sequence at %08x" % self.pos) 
    122130            self.pos += 7 
     131            buffer = [] 
     132            quotes = 0 
     133            char = chr(self.readByte()) 
     134            while ((char < ASCIILIMIT) or (quotes % 2)) and (char not in (FORMFEED, ESCAPE, NUL)) :   
     135                buffer.append(char) 
     136                if char == '"' : 
     137                    quotes += 1 
     138                char = chr(self.readByte()) 
     139            self.setPageDict("escaped", "".join(buffer)) 
     140            #self.logdebug("ESCAPED : %s" % "".join(buffer)) 
     141            self.pos -= 1   # Adjust position 
     142        else :     
     143            while 1 : 
     144                (value, end) = self.getInteger() 
     145                if end == 'B' : 
     146                    self.enterHPGL2() 
     147                    while self.minfile[self.pos] != ESCAPE : 
     148                        self.pos += 1 
     149                    self.pos -= 1     
     150                    return  
     151                elif end == 'A' :     
     152                    self.exitHPGL2() 
     153                    return 
     154         
     155    def enterHPGL2(self) :     
     156        """Enters HPGL2 mode.""" 
     157        self.logdebug("ENTERHPGL2 %08x" % self.pos) 
     158        self.hpgl2 = True 
     159         
     160    def exitHPGL2(self) :     
     161        """Exits HPGL2 mode.""" 
     162        self.logdebug("EXITHPGL2 %08x" % self.pos) 
     163        self.hpgl2 = False 
    123164         
    124165    def handleTag(self, tagtable) :     
     
    165206                mediasource = self.mediasources.get(value, str(value)) 
    166207                self.mediasourcesvalues.append(mediasource) 
    167                 self.logdebug("MEDIASOURCE %s" % mediasource) 
     208                self.setPageDict("mediasource", mediasource) 
     209                #self.logdebug("MEDIASOURCE %s" % mediasource) 
    168210            elif end in ('a', 'A') : 
    169211                mediasize = self.mediasizes.get(value, str(value)) 
    170212                self.mediasizesvalues.append(mediasize) 
    171                 self.logdebug("MEDIASIZE %s" % mediasize) 
     213                self.setPageDict("mediasize", mediasize) 
     214                #self.logdebug("MEDIASIZE %s" % mediasize) 
    172215            elif end in ('o', 'O') : 
    173216                orientation = self.orientations.get(value, str(value)) 
    174217                self.orientationsvalues.append(orientation) 
    175                 self.logdebug("ORIENTATION %s" % orientation) 
     218                self.setPageDict("orientation", orientation) 
     219                #self.logdebug("ORIENTATION %s" % orientation) 
    176220            elif end in ('m', 'M') : 
    177221                mediatype = self.mediatypes.get(value, str(value)) 
    178222                self.mediatypesvalues.append(mediatype) 
    179                 self.logdebug("MEDIATYPE %s" % mediatype) 
     223                self.setPageDict("mediatype", mediatype) 
     224                #self.logdebug("MEDIATYPE %s" % mediatype) 
    180225            elif end == 'X' : 
    181226                self.copies.append(value) 
    182                 self.logdebug("COPIES %i" % value) 
     227                self.setPageDict("copies", value) 
     228                #self.logdebug("COPIES %i" % value) 
    183229                 
    184230    def escAmpa(self) :     
     
    189235                return 
    190236            if end == 'G' :     
    191                 self.logdebug("BACKSIDES %i" % value) 
     237                #self.logdebug("BACKSIDES %i" % value) 
    192238                self.backsides.append(value) 
     239                self.setPageDict("duplex", value) 
    193240                 
    194241    def escAmpb(self) :     
     
    272319                elif end in ('B', 'C') :         
    273320                    #self.logdebug("EndGFX") 
    274                     if not self.startgfx : 
    275                         self.logdebug("EndGFX found before StartGFX, ignored.") 
     321                    if self.startgfx : 
     322                        self.endgfx.append(1) 
    276323                    else :     
    277                         self.endgfx.append(1) 
     324                        #self.logdebug("EndGFX found before StartGFX, ignored.") 
     325                        pass 
    278326            if end == 'A' and (0 <= value <= 3) : 
    279327                #self.logdebug("StartGFX %i" % value) 
     
    303351        while 1 : 
    304352            char = chr(self.readByte()) 
    305             if char in (ESCAPE, FORMFEED) : 
     353            if char in (NUL, ESCAPE, FORMFEED, ASCIILIMIT) : 
    306354                self.pos -= 1 # Adjust position 
    307355                return (None, None) 
     
    315363            else :     
    316364                value = ((value or 0) * 10) + int(char)     
     365         
     366    def skipByte(self) :     
     367        """Skips a byte.""" 
     368        #self.logdebug("SKIPBYTE %08x ===> %02x" % (self.pos, ord(self.minfile[self.pos]))) 
     369        self.pos += 1 
    317370         
    318371    def getJobSize(self) :      
     
    336389        infileno = self.infile.fileno() 
    337390        self.minfile = minfile = mmap.mmap(infileno, os.fstat(infileno)[6], prot=mmap.PROT_READ, flags=mmap.MAP_SHARED) 
     391        self.pages = {} 
    338392        self.pagecount = 0 
    339393        self.resets = 0 
     
    346400        self.startgfx = [] 
    347401        self.endgfx = [] 
     402        self.hpgl2 = False 
    348403         
    349404        tags = [ lambda : None] * 256 
    350405        tags[ord(FORMFEED)] = self.endPage 
    351406        tags[ord(ESCAPE)] = self.escape 
     407        tags[ord(ASCIILIMIT)] = self.skipByte 
    352408         
    353409        self.esctags = [ lambda : None ] * 256