Changeset 2617 for proto/PDF


Ignore:
Timestamp:
Nov 7, 2012, 12:13:14 PM (6 years ago)
Author:
bhull
Message:

Prototype changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/PDF/pdf_demo.py

    r2604 r2617  
    321321
    322322def Parse_HexStrings(lex, marker, hexStrings_Callouts) :
    323         #Haven't confirmed that this is the correct behaviour with bad input
    324323        hexStrings_Callouts.starts = lex.LAngle &~marker.mask
    325324        hexStrings_Callouts.ends = pablo.ScanThru(pablo.Advance(hexStrings_Callouts.starts),lex.Hex|lex.WS)
     
    350349        specialChars_Callouts.follows = pablo.Advance(specialChars_Callouts.starts)
    351350
    352 def NextPos(stream, curpos) :
    353         curpos = curpos+1
    354         while (stream >> curpos > 0) :
    355                 if stream >> curpos & 1 == 1:
    356                         return curpos
     351def scan_to_next(stream) :
     352        global position
     353        global lgth
     354
     355        while (stream >>position > 0) :
     356                if stream  & 1<<position >0:
     357                        return stream&~ 1<<position
    357358                else :
    358                         curpos+=1
    359         return -1
    360 def FirstPos(stream) :
    361         return NextPos(stream, -1)
     359                        position+=1
     360        position = -1
     361        return stream
     362def is_done() :
     363        if position == -1:
     364                return True
     365        else:
     366                return False
     367
    362368       
    363369def IsNumberStart(character) :
     
    375381                return -1
    376382
    377 def LexName(stream) :
     383def LexName() :
     384        #Stream marks any escapes and the follow position
     385        #Escapes are marked at the second hex value following the escape character
    378386        global position
    379387        global data
     388        global stream
    380389        outstring = ''
    381390        startpos = position
    382         position = NextPos(stream, position)
     391        stream = scan_to_next(stream)
    383392        while IsHex(data[position]):
    384393                outstring +=data[startpos+1:position-2]
     
    386395                outstring+=chr(value)
    387396                startpos=position
    388                 position = NextPos(stream, position)
    389         followpos = position
    390         position-=1
    391         outstring +=data[startpos+1:followpos]
     397                stream = scan_to_next(stream)
     398
     399        outstring +=data[startpos+1:position]
    392400       
    393401        #Check length if needed
     
    399407        return outstring
    400408       
    401 def LexNumber(stream) :
     409def LexNumber() :
     410        #Error handling done using PDFTron's number parser
    402411        global position
    403412        global data
     413        global stream
    404414        startpos = position
    405         position = NextPos(stream, position)
    406         followpos = position
    407         position-=1
    408         numstring = data[startpos:followpos]
     415        stream = scan_to_next(stream)
     416        numstring = data[startpos:position]
    409417       
    410418        #Convert to numeric value and check value if needed
     
    427435       
    428436       
    429 def LexLiteralString(stream) :
     437def LexLiteralString() :
     438        #Stream marks any escapes, any carriage returns, and the end position
     439       
    430440        global position
    431441        global data
     442        global stream
    432443        outstring = ''
    433444        startpos = position
    434         position = NextPos(stream, position)
    435         while position > 0 and data[position]!=')':
     445        stream = scan_to_next(stream)
     446        while is_done()==False and data[position]!=')':
    436447                outstring +=data[startpos+1:position]
    437                 if data[position]=='\\':
     448                startpos = position
     449                if data[position]=='\\': #escape
    438450                        next_char = data[position+1]
    439451                        if next_char=='n':
     
    447459                        elif next_char=='f':
    448460                                outstring+=chr(0x0C) #form-feed
    449                         elif ord(next_char) >= ord('0') and ord(next_char) <= ord('8'):
     461                        elif ord(next_char) >= ord('0') and ord(next_char) <= ord('8'): #Octal character code
    450462                                val = ord(next_char)-ord('0')
    451463                                if ord(data[position+2]) >= ord('0') and ord(data[position+2]) <= ord('8'):
    452464                                        val = val*8 + ord(data[position+2])-ord('0')
    453                                         position+=1
    454                                         if ord(data[position+2]) >= ord('0') and ord(data[position+2]) <= ord('8'):
    455                                                 val = val*8 + ord(data[position+2])-ord('0')
    456                                                 position+=1
     465                                        startpos+=1
     466                                        if ord(data[position+3]) >= ord('0') and ord(data[position+3]) <= ord('8'):
     467                                                val = val*8 + ord(data[position+3])-ord('0')
     468                                                startpos+=1
    457469                                val = val & 0xFF
    458470                                outstring+=chr(val)
    459                         elif ord(next_char)==13: #CR
     471                        elif ord(next_char)==13: #CR.  Don't output either the CR or the CRLF
    460472                                if ord(data[position+2]) == 10: #LF
    461                                         position+=1
    462                         elif ord(next_char)==10: #LF
     473                                        startpos+=1
     474                        elif ord(next_char)==10: #LF.  Don't output.
    463475                                #do nothing.  hack so that the intended c structure is preserved
    464476                                position=position
     
    466478                                #moved (, ), and \ into default case
    467479                                outstring+=next_char
    468                         position+=1
     480                        startpos+=1
    469481                else:
     482                        #This position is a carriage return.  Convert CR or CRLF to LF.
    470483                        outstring+=chr(0x0A)
    471484                        if data[position+1]==chr(0x0A):
    472                                 position+=1
     485                                startpos+=1
    473486                startpos=position
    474                 position = NextPos(stream, position)
    475        
    476         if position <0:
     487                stream = scan_to_next(stream)
     488       
     489        if is_done():
    477490                return 'Corrupt string'
    478491                #BASE_ASSERT(false, "Corrupt string");
    479492       
    480         followpos = position
    481         position-=1
    482         outstring +=data[startpos+1:followpos]
     493
     494        outstring +=data[startpos+1:position]
    483495       
    484496        #if outstring>=65536:
     
    488500        return outstring
    489501       
    490 def LexHexString(stream):
    491         #Is it worth scanning through whitespace for this?
     502def LexHexString():
     503        #Stream marks all hex characters in the string as well as the end position
     504        #Is it worth actually marking the hex characters if whitespace is rare?
    492505        global position
    493506        global data
     507        global stream
    494508        outstring = ''
    495         position = NextPos(stream, position)
     509        stream = scan_to_next(stream)
    496510        while (IsHex(data[position])):
    497511                val = HexValue(data[position])*16
    498                 position = NextPos(stream, position)
     512                stream = scan_to_next(stream)
    499513                if IsHex(data[position]):
    500514                        val += HexValue(data[position])
    501                         position=NextPos(stream, position)
     515                        stream = scan_to_next(stream)
    502516                #else:
    503517                        #if (mp_doc && mp_doc->m_pdfa_check) {
     
    505519                        #}
    506520                outstring+=chr(val)
    507         if data[position]!='>':
    508                 return "Bad String"
     521        if data[position]!='>': #The end character might not be a proper closer
     522                return 'BASE_ASSERT(false, "Bad String");'
    509523                #BASE_ASSERT(false, "Bad String");
    510524        #StringDecrypt(m_tmp_buffer);
    511525        return outstring
    512526       
    513 def LexDefault(stream) :
     527def LexDefault() :
     528        #Handles keywords and some special characters (excluding '(', '[', '<'.  also excluding ')' and '>' that end strings)
    514529        global position
    515530        global data
     531        global stream
    516532        startpos = position
    517         position = NextPos(stream, position)
     533        stream = scan_to_next(stream)
    518534        outstring = data[startpos:position]
    519         position-=1
    520535        if outstring == 'null':
    521536                return 'NULL OBJECT'
     
    529544       
    530545       
     546def GenerateOutput(input,options):
     547        if options.debug:
     548                return GetPrintableString(input)
     549        else:
     550                return input
    531551def GetPrintableString(input):
    532552        outstring =''
     
    573593        data = pablo.readfile(input_file)
    574594
     595        global lgth
    575596        lgth = len(data)
    576597
     
    584605        Parse_Keywords(lex, marker, keywords_Callouts)
    585606        Parse_SpecialChars(lex, marker, specialChars_Callouts)
     607
     608       
     609       
    586610       
    587611        startsStream = literalStrings_Callouts.starts | names_Callouts.starts | hexStrings_Callouts.starts | numeric_Callouts.starts | keywords_Callouts.starts | specialChars_Callouts.starts
    588         othersStream = hexStrings_Callouts.hex | literalStrings_Callouts.carriage_returns|literalStrings_Callouts.escapes | names_Callouts.escapes | literalStrings_Callouts.ends | names_Callouts.follows | hexStrings_Callouts.ends | numeric_Callouts.follows | keywords_Callouts.follows | specialChars_Callouts.follows
     612        global stream
     613        stream = hexStrings_Callouts.hex | literalStrings_Callouts.carriage_returns|literalStrings_Callouts.escapes | names_Callouts.escapes | literalStrings_Callouts.ends | names_Callouts.follows | hexStrings_Callouts.ends | numeric_Callouts.follows | keywords_Callouts.follows | specialChars_Callouts.follows
    589614        global position
    590         position = FirstPos(startsStream)
    591         while position >= 0:
     615        position = 0
     616        startsStream=scan_to_next(startsStream)
     617        while is_done()==False:
    592618                if data[position] == '/':
    593                         print 'LexName:'+GetPrintableString(LexName(othersStream))
     619                        print GenerateOutput('LexName:'+LexName(),options)
    594620                elif data[position]=='(':
    595                         print 'LexLiteralString:'+GetPrintableString(LexLiteralString(othersStream))
     621                        print GenerateOutput('LexLiteralString:'+LexLiteralString(),options)
    596622                elif IsNumberStart(data[position]):
    597                         print 'LexNumber:'+LexNumber(othersStream)
     623                        print GenerateOutput('LexNumber:'+LexNumber(),options)
    598624                elif data[position]=='<':
    599                         print 'LexHexString:'+GetPrintableString(LexHexString(othersStream))
     625                        print GenerateOutput('LexHexString:'+LexHexString(),options)
    600626                elif data[position]==')':
    601                         print 'Error: ) not matched'
     627                        print GenerateOutput('BASE_ASSERT(false, "\')\' is not matched");',options)
    602628                        #BASE_ASSERT(false, "\')\' is not matched");
    603629                elif data[position]=='[':
    604                         print 'Array Start'
     630                        print GenerateOutput('Array Start',options)
     631                        stream = scan_to_next(stream) #to clear the end position. should probably change the bitstreams instead
    605632                        #Call LexArray
    606633                else :
    607                         print 'LexDefault:'+LexDefault(othersStream)
    608                 if position >0:
    609                         position = NextPos(startsStream, position)
     634                        print GenerateOutput('LexDefault:'+LexDefault(),options)
     635                if is_done()==False:
     636                        startsStream = scan_to_next(startsStream)
    610637               
    611638               
     
    632659        else:
    633660                print pablo.bitstream2string(literalStrings_Callouts.starts, lgth+1)
     661                print pablo.bitstream2string(literalStrings_Callouts.escapes, lgth+1)
     662                print pablo.bitstream2string(literalStrings_Callouts.carriage_returns, lgth+1)
    634663                print pablo.bitstream2string(literalStrings_Callouts.ends, lgth+1)
    635664                print pablo.bitstream2string(names_Callouts.starts, lgth+1)
     665                print pablo.bitstream2string(names_Callouts.escapes, lgth+1)
    636666                print pablo.bitstream2string(names_Callouts.follows, lgth+1)
    637667                print pablo.bitstream2string(hexStrings_Callouts.starts, lgth+1)
     668                print pablo.bitstream2string(hexStrings_Callouts.hex, lgth+1)
    638669                print pablo.bitstream2string(hexStrings_Callouts.ends, lgth+1)
    639670                print pablo.bitstream2string(numeric_Callouts.starts, lgth+1)
     
    643674                print pablo.bitstream2string(specialChars_Callouts.starts, lgth+1)
    644675                print pablo.bitstream2string(specialChars_Callouts.follows, lgth+1)
    645                 print pablo.bitstream2string(literalStrings_Callouts.error|hexStrings_Callouts.error | numeric_Callouts.error, lgth+1)
    646        
    647        
    648 
     676       
     677       
     678
Note: See TracChangeset for help on using the changeset viewer.