Changeset 309 for pkpgcounter/trunk

Show
Ignore:
Timestamp:
02/07/06 16:34:35 (19 years ago)
Author:
jerome
Message:

Improved PCLXL parser with regard to undocumented PCLXL 3.0 tags

Files:
1 modified

Legend:

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

    r307 r309  
    219219            return unpack(self.endianness + "I", self.minfile[pos:posl])[0] 
    220220        else :     
    221             raise pdlparser.PDLParserError, "Error on array size at %s" % self.pos 
     221            raise pdlparser.PDLParserError, "Error on array size at %x" % self.pos 
    222222         
    223223    def array_16(self) :     
     
    240240            return 2 * unpack(self.endianness + "I", self.minfile[pos:posl])[0] 
    241241        else :     
    242             raise pdlparser.PDLParserError, "Error on array size at %s" % self.pos 
     242            raise pdlparser.PDLParserError, "Error on array size at %x" % self.pos 
    243243         
    244244    def array_32(self) :     
     
    261261            return 4 * unpack(self.endianness + "I", self.minfile[pos:posl])[0] 
    262262        else :     
    263             raise pdlparser.PDLParserError, "Error on array size at %s" % self.pos 
     263            raise pdlparser.PDLParserError, "Error on array size at %x" % self.pos 
    264264         
    265265    def embeddedDataSmall(self) : 
     
    297297        self.logdebug("PassThrough marker detected at %x" % self.pos) 
    298298        return 0 
     299         
     300    def x46_class3(self) :     
     301        """Undocumented class 3.0""" 
     302        self.logdebug("Undocumented tag 0x46 at %x" % self.pos) 
     303        pos = self.pos 
     304        minfile = self.minfile 
     305        while pos > 0 : # safety check : don't go back to far ! 
     306            val = ord(minfile[pos]) 
     307            if (val == 0xf8) and (ord(minfile[pos+1]) in (0x95, 0x96)) : 
     308                self.logdebug("Found !!!!!!!!!!") 
     309                pos += 2 
     310                datatype = self.minfile[pos] 
     311                if ord(datatype) == 0x46 : 
     312                    break 
     313                self.logdebug("0x%02x" % ord(datatype)) 
     314                pos += 1 
     315                length = self.tags[ord(datatype)] 
     316                self.logdebug("0x%02x" % length) 
     317                posl = pos + length 
     318                if length == 1 :     
     319                    toskip = unpack("B", self.minfile[pos:posl])[0] 
     320                elif length == 2 :     
     321                    toskip = unpack(self.endianness + "H", self.minfile[pos:posl])[0] 
     322                elif length == 4 :     
     323                    toskip = unpack(self.endianness + "I", self.minfile[pos:posl])[0] 
     324                else :     
     325                    raise pdlparser.PDLParserError, "Error on size at %x" % self.pos 
     326                self.logdebug("ToSkip : %s" % toskip)     
     327                return toskip  
     328            else :     
     329                pos = pos - 1 
     330        return 0     
    299331         
    300332    def escape(self) :     
     
    375407        self.tags[0x44] = self.endPage      # EndPage 
    376408        self.tags[0x45] = self.reservedForFutureUse # reserved 
    377         self.tags[0x46] = self.reservedForFutureUse # reserved 
     409        self.tags[0x46] = self.x46_class3  
    378410         
    379411        self.tags[0x4a] = self.reservedForFutureUse # reserved