Changeset 2604 for proto/PDF


Ignore:
Timestamp:
Nov 1, 2012, 4:06:02 PM (7 years ago)
Author:
bhull
Message:

Added token output

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/PDF/pdf_demo.py

    r2589 r2604  
    3939        RBracket = 0
    4040        LBracket = 0
     41        Hash = 0
     42        CR = 0
     43        LF = 0
     44        Special = 0
    4145       
    4246class Escaped_Callouts ():
    4347        UELParen = 0
    4448        UERParen = 0
     49        escapes = 0
    4550
    4651class Comments_Callouts() :
     
    5055        starts = 0
    5156        ends = 0
     57        escapes = 0
     58        carriage_returns = 0
    5259        mask = 0
    5360        error = 0
     
    5966        starts = 0
    6067        follows = 0
     68        escapes = 0
    6169
    6270class HexStrings_Callouts() :
     
    6472        ends = 0
    6573        error = 0
     74        hex = 0
    6675
    6776class Numeric_Callouts() :
     
    7483        ends = 0
    7584       
    76 class Arrays_Callouts() :
     85class SpecialChars_Callouts() :
    7786        starts = 0
    78         ends = 0
     87        follows = 0
    7988
    8089class WS_Or_Comment () :
     
    170179        lex.Hex = (temp68 | temp71)
    171180        lex.Regular = ~lex.Delimiter&~lex.WS
     181       
     182        #TEMPORARY!
     183        lex.Special = lex.LParen | lex.RParen | lex.Backslash | lex.LAngle | lex.RAngle | lex.RBracket | lex.LBracket
     184        lex.Hash = lex.Period
    172185
    173186def simd_const_4(hexdigit, EOF_mask):
     
    186199        even_final = pablo.ScanThru(even_start, lex.Backslash)
    187200        escape = even_final & odd
    188    
     201        escape_char = even & pablo.SpanUpTo(even_start, even_final)
     202       
    189203        odd_start = start & odd
    190204        odd_final = pablo.ScanThru(odd_start, lex.Backslash)
    191205        escape = escape | (odd_final & even)
    192                    
     206        escape_char |= odd & pablo.SpanUpTo(odd_start, odd_final)
     207       
     208        escaped_Callouts.escapes = escape_char
    193209        escaped_Callouts.UELParen = lex.LParen &~ escape
    194210        escaped_Callouts.UERParen = lex.RParen &~ escape
     
    290306                                        cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
    291307                                       
    292         #if (depth>0):
    293                 #error
     308
    294309        comments_Callouts.mask = pablo.SpanUpTo(comment_starts, comment_ends)
    295         literalStrings_Callouts.mask = pablo.SpanUpTo(literalStrings_Callouts.starts,literalStrings_Callouts.ends)
     310        literalStrings_Callouts.mask = pablo.InclusiveSpan(literalStrings_Callouts.starts,literalStrings_Callouts.ends)
     311        literalStrings_Callouts.escapes = escaped_Callouts.escapes & literalStrings_Callouts.mask
     312        literalStrings_Callouts.carriage_returns = lex.CR & literalStrings_Callouts.mask &~ literalStrings_Callouts.escapes
    296313        marker.mask = comments_Callouts.mask | literalStrings_Callouts.mask
    297314
    298315def Parse_Names(lex, marker, names_Callouts) :
    299         names_Callouts.starts = pablo.Advance(lex.Slash&~marker.mask)
    300         names_Callouts.follows = pablo.ScanThru(names_Callouts.starts, lex.Regular)
    301         marker.mask |=names_Callouts.starts
     316        names_Callouts.starts =lex.Slash&~marker.mask
     317        firstCharacter = pablo.Advance(names_Callouts.starts)
     318        names_Callouts.follows = pablo.ScanThru(firstCharacter, lex.Regular)
     319        names_Callouts.escapes = (pablo.Advance(pablo.Advance(lex.Hash))&pablo.Advance(lex.Hex)&lex.Hex)&pablo.SpanUpTo(names_Callouts.starts, names_Callouts.follows)
     320        marker.mask |=firstCharacter&~names_Callouts.follows
    302321
    303322def Parse_HexStrings(lex, marker, hexStrings_Callouts) :
     
    306325        hexStrings_Callouts.ends = pablo.ScanThru(pablo.Advance(hexStrings_Callouts.starts),lex.Hex|lex.WS)
    307326        hexStrings_Callouts.error = hexStrings_Callouts.ends &~ lex.RAngle
    308         marker.mask |= pablo.SpanUpTo(hexStrings_Callouts.starts,hexStrings_Callouts.ends)
     327        mask = pablo.InclusiveSpan(hexStrings_Callouts.starts,hexStrings_Callouts.ends)
     328        hexStrings_Callouts.hex = lex.Hex & mask
     329        marker.mask |= mask
    309330
    310331def Parse_Numeric(lex, marker, numeric_Callouts) :
     
    325346        keywords_Callouts.follows = pablo.ScanThru(keywords_Callouts.starts, lex.Regular)
    326347       
    327 def Parse_Arrays(lex, marker, arrays_Callouts) :
    328         arrays_Callouts.starts =  lex.LBracket &~ marker.mask
    329         arrays_Callouts.ends = lex.RBracket &~ marker.mask
    330 
     348def Parse_SpecialChars(lex, marker, specialChars_Callouts) :
     349        specialChars_Callouts.starts =  (lex.Special) &~ marker.mask
     350        specialChars_Callouts.follows = pablo.Advance(specialChars_Callouts.starts)
     351
     352def NextPos(stream, curpos) :
     353        curpos = curpos+1
     354        while (stream >> curpos > 0) :
     355                if stream >> curpos & 1 == 1:
     356                        return curpos
     357                else :
     358                        curpos+=1
     359        return -1
     360def FirstPos(stream) :
     361        return NextPos(stream, -1)
     362       
     363def IsNumberStart(character) :
     364        return (ord(character) >= ord('0') and ord(character) <=ord('9')) or character=='-' or character=='+' or character=='.'
     365def IsHex(character) :
     366        return (ord(character) >= ord('0') and ord(character) <=ord('9')) or (ord(character) >=ord('a') and ord(character) <=ord('f')) or (ord(character) >=ord('A') and ord(character) <= ord('F'))
     367def HexValue(character) :
     368        if (ord(character) >= ord('0') and ord(character) <=ord('9')):
     369                return ord(character) -ord('0')
     370        elif (ord(character) >=ord('a') and ord(character) <=ord('f')):
     371                return ord(character)-ord('a')+10
     372        elif (ord(character) >=ord('A') and ord(character) <= ord('F')):
     373                return ord(character)-ord('A')+10
     374        else:
     375                return -1
     376
     377def LexName(stream) :
     378        global position
     379        global data
     380        outstring = ''
     381        startpos = position
     382        position = NextPos(stream, position)
     383        while IsHex(data[position]):
     384                outstring +=data[startpos+1:position-2]
     385                value = HexValue(data[position-1])*16 + HexValue(data[position])
     386                outstring+=chr(value)
     387                startpos=position
     388                position = NextPos(stream, position)
     389        followpos = position
     390        position-=1
     391        outstring +=data[startpos+1:followpos]
     392       
     393        #Check length if needed
     394        #if (mp_doc && mp_doc->m_pdfa_check) {
     395        #       if (sz>127) {
     396        #               mp_doc->m_pdfa_err.Add(__CZ::e_PDFA1_12_3); // Name with more than 127 bytes
     397        #       }
     398        #}
     399        return outstring
     400       
     401def LexNumber(stream) :
     402        global position
     403        global data
     404        startpos = position
     405        position = NextPos(stream, position)
     406        followpos = position
     407        position-=1
     408        numstring = data[startpos:followpos]
     409       
     410        #Convert to numeric value and check value if needed
     411        #assert(Filters::FilterReader::m_read_proc);
     412        #if (Filters::FilterReader::m_read_proc(&m_tmp_buffer.front(), &num)) {
     413        #       if (mp_doc && mp_doc->m_pdfa_check) {
     414        #               if (num == floor(num) && (num>2147483647.0 || num<-2147483648.0)) {
     415        #                       mp_doc->m_pdfa_err.Add(__CZ::e_PDFA1_12_3); // Contains an integer value outside of the allowed range [-2^31, 2^31-1],
     416        #               }
     417        #       }
     418        #}
     419        #else {
     420        #       num = 0;
     421        #       if (mp_doc && mp_doc->m_pdfa_check) {
     422        #               mp_doc->m_pdfa_err.Add(__CZ::e_PDFA1_12_3); // Bad number
     423        #       }
     424        #}
     425        return numstring
     426       
     427       
     428       
     429def LexLiteralString(stream) :
     430        global position
     431        global data
     432        outstring = ''
     433        startpos = position
     434        position = NextPos(stream, position)
     435        while position > 0 and data[position]!=')':
     436                outstring +=data[startpos+1:position]
     437                if data[position]=='\\':
     438                        next_char = data[position+1]
     439                        if next_char=='n':
     440                                outstring+=chr(0x0A) #linefeed
     441                        elif next_char=='r':
     442                                outstring+=chr(0x0D) #carriage return
     443                        elif next_char=='t':
     444                                outstring+=chr(0x09) #horizontal tab
     445                        elif next_char=='b':
     446                                outstring+=chr(0x08) #backspace
     447                        elif next_char=='f':
     448                                outstring+=chr(0x0C) #form-feed
     449                        elif ord(next_char) >= ord('0') and ord(next_char) <= ord('8'):
     450                                val = ord(next_char)-ord('0')
     451                                if ord(data[position+2]) >= ord('0') and ord(data[position+2]) <= ord('8'):
     452                                        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
     457                                val = val & 0xFF
     458                                outstring+=chr(val)
     459                        elif ord(next_char)==13: #CR
     460                                if ord(data[position+2]) == 10: #LF
     461                                        position+=1
     462                        elif ord(next_char)==10: #LF
     463                                #do nothing.  hack so that the intended c structure is preserved
     464                                position=position
     465                        else:
     466                                #moved (, ), and \ into default case
     467                                outstring+=next_char
     468                        position+=1
     469                else:
     470                        outstring+=chr(0x0A)
     471                        if data[position+1]==chr(0x0A):
     472                                position+=1
     473                startpos=position
     474                position = NextPos(stream, position)
     475       
     476        if position <0:
     477                return 'Corrupt string'
     478                #BASE_ASSERT(false, "Corrupt string");
     479       
     480        followpos = position
     481        position-=1
     482        outstring +=data[startpos+1:followpos]
     483       
     484        #if outstring>=65536:
     485                #BASE_WARNING(false, "The implementation limit for the length of string was exceeded");
     486       
     487        #StringDecrypt(m_tmp_buffer);
     488        return outstring
     489       
     490def LexHexString(stream):
     491        #Is it worth scanning through whitespace for this?
     492        global position
     493        global data
     494        outstring = ''
     495        position = NextPos(stream, position)
     496        while (IsHex(data[position])):
     497                val = HexValue(data[position])*16
     498                position = NextPos(stream, position)
     499                if IsHex(data[position]):
     500                        val += HexValue(data[position])
     501                        position=NextPos(stream, position)
     502                #else:
     503                        #if (mp_doc && mp_doc->m_pdfa_check) {
     504                        #       mp_doc->m_pdfa_err.Add(__CZ::e_PDFA1_6_1); // Invalid hexadecimal strings used
     505                        #}
     506                outstring+=chr(val)
     507        if data[position]!='>':
     508                return "Bad String"
     509                #BASE_ASSERT(false, "Bad String");
     510        #StringDecrypt(m_tmp_buffer);
     511        return outstring
     512       
     513def LexDefault(stream) :
     514        global position
     515        global data
     516        startpos = position
     517        position = NextPos(stream, position)
     518        outstring = data[startpos:position]
     519        position-=1
     520        if outstring == 'null':
     521                return 'NULL OBJECT'
     522        elif outstring == 'true':
     523                return 'TRUE OBJECT'
     524        elif outstring == 'false':
     525                return 'FALSE OBJECT'
     526        else:
     527                return 'RETURN FALSE:'+outstring
     528               
     529       
     530       
     531def GetPrintableString(input):
     532        outstring =''
     533        i=0
     534        while i < len(input):
     535                if ord(input[i]) >=32 and ord(input[i])<=126:
     536                        outstring+=input[i]
     537                else:
     538                        char_string = str(ord(input[i]))
     539                        while len(char_string)<3:
     540                                char_string='0'+char_string
     541                        outstring+='&'+char_string
     542                i+=1
     543        return outstring
    331544#def Parse_GetObj(lex, marker) :
    332545#       cursor = ( (lex.WS &~ marker.mask) | () )
    333        
     546
    334547basis_bits = Basis_bits()
    335548lex = Lex()
     
    341554numeric_Callouts = Numeric_Callouts()
    342555keywords_Callouts = Keywords_Callouts()
    343 arrays_Callouts = Arrays_Callouts()
     556specialChars_Callouts = SpecialChars_Callouts()
    344557marker = Marker()
    345558
     
    355568                option_parser.print_usage()
    356569                sys.exit()
    357 
    358         input_file = args[0]
     570        else:
     571                input_file = args[0]
     572        global data
    359573        data = pablo.readfile(input_file)
    360574
     
    369583        Parse_Numeric(lex, marker, numeric_Callouts)
    370584        Parse_Keywords(lex, marker, keywords_Callouts)
    371         Parse_Arrays(lex, marker, arrays_Callouts)
     585        Parse_SpecialChars(lex, marker, specialChars_Callouts)
     586       
     587        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
     589        global position
     590        position = FirstPos(startsStream)
     591        while position >= 0:
     592                if data[position] == '/':
     593                        print 'LexName:'+GetPrintableString(LexName(othersStream))
     594                elif data[position]=='(':
     595                        print 'LexLiteralString:'+GetPrintableString(LexLiteralString(othersStream))
     596                elif IsNumberStart(data[position]):
     597                        print 'LexNumber:'+LexNumber(othersStream)
     598                elif data[position]=='<':
     599                        print 'LexHexString:'+GetPrintableString(LexHexString(othersStream))
     600                elif data[position]==')':
     601                        print 'Error: ) not matched'
     602                        #BASE_ASSERT(false, "\')\' is not matched");
     603                elif data[position]=='[':
     604                        print 'Array Start'
     605                        #Call LexArray
     606                else :
     607                        print 'LexDefault:'+LexDefault(othersStream)
     608                if position >0:
     609                        position = NextPos(startsStream, position)
    372610               
    373 #               print "data:" + " "*(16-5) + data
    374 #               print "literal starts" + " "*(16-14) + pablo.bitstream2string(literalStrings_Callouts.starts, lgth+1)
    375 #               print "literal ends" + " "*(16-12) + pablo.bitstream2string(literalStrings_Callouts.ends, lgth+1)
    376 #               print "names starts"+ " "*(16-12) + pablo.bitstream2string(names_Callouts.starts, lgth+1)
    377 #               print "names follows"+ " "*(16-13) + pablo.bitstream2string(names_Callouts.follows, lgth+1)
    378 #               print "hex starts"+ " "*(16-10) + pablo.bitstream2string(hexStrings_Callouts.starts, lgth+1)
    379 #               print "hex ends"+ " "*(16-8) + pablo.bitstream2string(hexStrings_Callouts.ends, lgth+1)
    380 #               print "num starts"+ " "*(16-10) + pablo.bitstream2string(numeric_Callouts.starts, lgth+1)
    381 #               print "num follows"+ " "*(16-11) + pablo.bitstream2string(numeric_Callouts.follows, lgth+1)
    382 #               print "key starts"+ " "*(16-10) + pablo.bitstream2string(keywords_Callouts.starts, lgth+1)
    383 #               print "key follows"+ " "*(16-11) + pablo.bitstream2string(keywords_Callouts.follows, lgth+1)
    384 #               print "array starts"+ " "*(16-12) + pablo.bitstream2string(arrays_Callouts.starts, lgth+1)
    385 #               print "array ends"+ " "*(16-10) + pablo.bitstream2string(arrays_Callouts.ends, lgth+1)
    386 #               print "errors" + " "*(16-6) + pablo.bitstream2string(literalStrings_Callouts.error|hexStrings_Callouts.error | numeric_Callouts.error, lgth+1)
    387 
     611               
    388612        if (options.debug ):
    389613                pablo.print_aligned_streams([('Input Data', data),
     614                        ('Regular', pablo.bitstream2string(lex.Regular, lgth+1)),
    390615                        ('String Starts', pablo.bitstream2string(literalStrings_Callouts.starts, lgth+1)),
     616                        ('String Escapes', pablo.bitstream2string(literalStrings_Callouts.escapes, lgth+1)),
     617                        ('String Carriage Returns', pablo.bitstream2string(literalStrings_Callouts.carriage_returns, lgth+1)),
    391618                        ('String Ends', pablo.bitstream2string(literalStrings_Callouts.ends, lgth+1)),
    392619                        ('Names Starts', pablo.bitstream2string(names_Callouts.starts, lgth+1)),                             
     620                        ('Names Escapes', pablo.bitstream2string(names_Callouts.escapes, lgth+1)),                           
    393621                        ('Names Follows', pablo.bitstream2string(names_Callouts.follows, lgth+1)),
    394622                        ('Hex Strings Starts', pablo.bitstream2string(hexStrings_Callouts.starts, lgth+1)),
     623                        ('Hex Strings Hex', pablo.bitstream2string(hexStrings_Callouts.hex, lgth+1)),
    395624                        ('Hex Strings Ends', pablo.bitstream2string(hexStrings_Callouts.ends, lgth+1)),                       
    396625                        ('Numeric Starts', pablo.bitstream2string(numeric_Callouts.starts, lgth+1)),
     
    398627                        ('Keyword Starts', pablo.bitstream2string(keywords_Callouts.starts, lgth+1)),                         
    399628                        ('Keyword Follows', pablo.bitstream2string(keywords_Callouts.follows, lgth+1)),
    400                         ('Arrays Starts', pablo.bitstream2string(arrays_Callouts.starts, lgth+1)),
    401                         ('Arrays Ends', pablo.bitstream2string(arrays_Callouts.ends, lgth+1)),                       
     629                        ('Special Chars Starts', pablo.bitstream2string(specialChars_Callouts.starts, lgth+1)),
     630                        ('Special Chars Follows', pablo.bitstream2string(specialChars_Callouts.follows, lgth+1)),                             
    402631                        ('Errors', pablo.bitstream2string(literalStrings_Callouts.error | hexStrings_Callouts.error | numeric_Callouts.error, lgth+1))])
    403632        else:
     
    412641                print pablo.bitstream2string(keywords_Callouts.starts, lgth+1)
    413642                print pablo.bitstream2string(keywords_Callouts.follows, lgth+1)
    414                 print pablo.bitstream2string(arrays_Callouts.starts, lgth+1)
    415                 print pablo.bitstream2string(arrays_Callouts.ends, lgth+1)
     643                print pablo.bitstream2string(specialChars_Callouts.starts, lgth+1)
     644                print pablo.bitstream2string(specialChars_Callouts.follows, lgth+1)
    416645                print pablo.bitstream2string(literalStrings_Callouts.error|hexStrings_Callouts.error | numeric_Callouts.error, lgth+1)
    417646       
Note: See TracChangeset for help on using the changeset viewer.