source: proto/PDF/cb_pablo.py @ 2899

Last change on this file since 2899 was 2899, checked in by lindanl, 7 years ago

Add octal processing

File size: 14.0 KB
Line 
1
2class Basis_bits():
3    bit_0 = 0
4    bit_1 = 0
5    bit_2 = 0
6    bit_3 = 0
7    bit_4 = 0
8    bit_5 = 0
9    bit_6 = 0
10    bit_7 = 0
11
12class Lex ():
13        pdf_mod_bit_1 = 0
14        pdf_mod_bit_2 = 0
15        pdf_mod_bit_3 = 0
16        pdf_mod_bit_4 = 0
17        pdf_mod_bit_5 = 0
18        pdf_mod_bit_6 = 0
19        pdf_mod_bit_7 = 0
20        LParen = 0
21        RParen = 0
22        Backslash = 0
23        Special = 0
24        Percent = 0
25        Period = 0
26        LAngle = 0
27        RAngle = 0
28        LBracket = 0
29        RBracket = 0
30        Slash = 0
31        EOL = 0
32        WS = 0
33        Digit = 0
34        Sign = 0
35        Hex = 0
36        Hash = 0
37        CR = 0
38        LF = 0
39        Oct = 0
40        Nonoct = 0
41        Regular = 0
42       
43class Parity():
44        odd = 0
45        even = 0
46       
47class Escape_Callouts():
48    UELParen = 0
49    UERParen = 0
50    Oct1 = 0
51    Oct2 = 0
52    Oct3 = 0
53    Nonoct = 0
54
55
56class Out_Callouts():
57    zeromask = 0
58    delmask = 0
59    hexString_mask = 0
60    names_escapes = 0
61    bit_0 = 0
62    bit_1 = 0
63    bit_2 = 0
64    bit_3 = 0
65    bit_4 = 0
66    bit_5 = 0
67    bit_6 = 0
68    bit_7 = 0
69   
70class marker():
71    hex_opener = 0
72    name_starts = 0
73    numeric_starts = 0
74   
75   
76
77def Classify_bytes(basis_bits, lex):
78        temp1 = (basis_bits.bit_1 &~ basis_bits.bit_0)
79        temp2 = (basis_bits.bit_2 &~ basis_bits.bit_3)
80        temp3 = (temp1 & temp2)
81        temp4 = (basis_bits.bit_6 &~ basis_bits.bit_7)
82        temp5 = (basis_bits.bit_4 | basis_bits.bit_5)
83        temp6 = (basis_bits.bit_5 &~ basis_bits.bit_4)
84        temp7 = (temp5 &~ temp6)
85        temp8 = (basis_bits.bit_4 & basis_bits.bit_5)
86        temp9 = (temp7 &~ temp8)
87        temp10 = (temp4 &~ temp9)
88        temp11 = (temp3 & temp10)
89        temp12 = (basis_bits.bit_2 & basis_bits.bit_3)
90        temp13 = (temp1 & temp12)
91        temp14 = (temp4 &~ temp5)
92        temp15 = (temp13 & temp14)
93        temp16 = (temp11 | temp15)
94        temp17 = (basis_bits.bit_6 | basis_bits.bit_7)
95        temp18 = (temp6 &~ temp17)
96        temp19 = (temp13 & temp18)
97        lex.pdf_mod_bit_1 = (temp16 | temp19)
98        lex.pdf_mod_bit_2 = (temp16 | temp19)
99        temp20 = (temp14 | temp18)
100        lex.pdf_mod_bit_3 = (temp13 & temp20)
101        temp21 = (temp4 &~ temp7)
102        temp22 = (temp3 & temp21)
103        temp23 = (temp22 | temp15)
104        lex.pdf_mod_bit_4 = (temp23 | temp19)
105        temp24 = (temp8 & temp4)
106        temp25 = (temp3 & temp24)
107        temp26 = (temp25 | temp15)
108        lex.pdf_mod_bit_5 = (temp26 | temp19)
109        lex.pdf_mod_bit_6 = (temp22 | temp15)
110        lex.pdf_mod_bit_7 = (temp13 & temp20)
111        temp27 = (basis_bits.bit_0 | basis_bits.bit_1)
112        temp28 = (temp2 &~ temp27)
113        temp29 = (basis_bits.bit_4 &~ basis_bits.bit_5)
114        temp30 = (temp29 &~ temp17)
115        lex.LParen = (temp28 & temp30)
116        temp31 = (basis_bits.bit_7 &~ basis_bits.bit_6)
117        temp32 = (temp29 & temp31)
118        lex.RParen = (temp28 & temp32)
119        temp33 = (basis_bits.bit_3 &~ basis_bits.bit_2)
120        temp34 = (temp1 & temp33)
121        temp35 = (temp8 &~ temp17)
122        lex.Backslash = (temp34 & temp35)
123        temp36 = (temp17 &~ temp31)
124        temp37 = (temp29 &~ temp36)
125        temp38 = (temp28 & temp37)
126        temp39 = (temp12 &~ temp27)
127        temp40 = (temp39 & temp35)
128        temp41 = (temp38 | temp40)
129        temp42 = (temp39 & temp24)
130        temp43 = (temp41 | temp42)
131        temp44 = (basis_bits.bit_6 & basis_bits.bit_7)
132        temp45 = (temp29 & temp44)
133        temp46 = (temp34 & temp45)
134        temp47 = (temp43 | temp46)
135        temp48 = (temp8 & temp31)
136        temp49 = (temp34 & temp48)
137        temp50 = (temp47 | temp49)
138        temp51 = (temp13 & temp45)
139        temp52 = (temp50 | temp51)
140        temp53 = (temp13 & temp48)
141        temp54 = (temp52 | temp53)
142        temp55 = (temp6 & temp31)
143        temp56 = (temp28 & temp55)
144        temp57 = (temp54 | temp56)
145        temp58 = (temp8 & temp44)
146        temp59 = (temp28 & temp58)
147        lex.Special = (temp57 | temp59)
148        lex.Percent = (temp28 & temp55)
149        lex.Period = (temp28 & temp24)
150        lex.LAngle = (temp39 & temp35)
151        lex.RAngle = (temp39 & temp24)
152        lex.LBracket = (temp34 & temp45)
153        lex.RBracket = (temp34 & temp48)
154        lex.Slash = (temp28 & temp58)
155        temp60 = (basis_bits.bit_2 | basis_bits.bit_3)
156        temp61 = (temp27 | temp60)
157        temp62 = (temp29 & temp4)
158        temp63 = (temp48 | temp62)
159        lex.EOL = (temp63 &~ temp61)
160        temp64 = (temp5 | temp17)
161        temp65 = (temp61 | temp64)
162        temp66 = (temp35 &~ temp61)
163        temp67 = (temp65 &~ temp66)
164        temp68 = (temp48 &~ temp61)
165        temp69 = (temp67 &~ temp68)
166        temp70 = (temp62 &~ temp61)
167        temp71 = (temp69 &~ temp70)
168        temp72 = (temp32 &~ temp61)
169        temp73 = (temp71 &~ temp72)
170        temp74 = (temp28 &~ temp64)
171        temp75 = (temp73 &~ temp74)
172        lex.WS = (~temp75)
173        temp76 = (basis_bits.bit_5 | basis_bits.bit_6)
174        temp77 = (basis_bits.bit_4 & temp76)
175        lex.Digit = (temp39 &~ temp77)
176        temp78 = (temp48 | temp45)
177        lex.Sign = (temp28 & temp78)
178        temp79 = (temp1 &~ temp60)
179        temp80 = (temp79 &~ basis_bits.bit_4)
180        temp81 = (~temp44)
181        temp82 = ((basis_bits.bit_5 & temp81)|(~(basis_bits.bit_5) & temp17))
182        temp83 = (temp80 & temp82)
183        temp84 = (lex.Digit | temp83)
184        temp85 = (temp3 &~ basis_bits.bit_4)
185        temp86 = (temp85 & temp82)
186        lex.Hex = (temp84 | temp86)
187        temp87 = (temp44 &~ temp5)
188        lex.Hash = (temp28 & temp87)
189        lex.CR = (temp48 &~ temp61)
190        lex.LF = (temp62 &~ temp61)
191        lex.Oct = (temp39 &~ basis_bits.bit_4)
192        lex.Nonoct = (temp16 | temp19)
193        lex.Regular = ~ (lex.Special & lex.WS)
194
195       
196def Parse_Escaped(lex, parity, escape_Callouts, out_Callouts):
197
198        odd = parity.odd
199        even = parity.even
200
201        start = lex.Backslash &~ pablo.Advance(lex.Backslash)
202       
203        even_start = start & even       
204        even_final = pablo.ScanThru(even_start, lex.Backslash) 
205        escape = even_final & odd
206        escape_char = even & pablo.SpanUpTo(even_start, even_final)
207       
208        odd_start = start & odd
209        odd_final = pablo.ScanThru(odd_start, lex.Backslash)
210        escape = escape | (odd_final & even)
211        escape_char |= (odd & pablo.SpanUpTo(odd_start, odd_final))
212
213        escape_Callouts.UELParen = lex.LParen &~ escape
214        escape_Callouts.UERParen = lex.RParen &~ escape
215        escape_Callouts.Nonoct = lex.Nonoct & escape   
216        escape_Callouts.Oct1 = lex.Oct & escape
217        escape_Callouts.Oct2 = escape_Callouts.Oct1 & pablo.Lookahead(lex.Oct)
218        escape_Callouts.Oct1 &= ~escape_Callouts.Oct2
219        escape_Callouts.Oct3 = escape_Callouts.Oct2 & pablo.Lookahead(lex.Oct, 2)
220        escape_Callouts.Oct2 &= ~escape_Callouts.Oct3
221        out_Callouts.delmask = escape_char
222
223#def Parse_CommentsLiteralStrings(lex, escaped_Callouts, marker, comments_Callouts, literalStrings_Callouts) :
224        ##not entirely sure this code is correct once compiled
225        #depth = 0
226        #comment_starts=0
227        #comment_ends=0
228        #marker.starts = 0
229        #marker.others = 0
230        #literalStrings_Callouts.starts = 0
231        #literalStrings_Callouts.ends = 0
232
233        #scan_characters = escaped_Callouts.UELParen | escaped_Callouts.UERParen | lex.Percent
234        #cursor = pablo.ScanToFirst(scan_characters)
235        #while pablo.inFile(cursor) :
236                #comment_cursor = cursor & lex.Percent
237                #string_cursor = cursor & (escaped_Callouts.UELParen|escaped_Callouts.UERParen)
238                #if comment_cursor :
239                        #comment_starts |=comment_cursor
240                        #comment_cursor = pablo.ScanTo(comment_cursor, lex.EOL)
241                        #comment_ends |=comment_cursor
242                        #cursor = pablo.ScanTo(pablo.Advance(comment_cursor), scan_characters)
243               
244                #if string_cursor :
245                        ##There should be a better way to do this
246                        #if (string_cursor & escaped_Callouts.UELParen) :
247                                #if is_zero():
248                                        #literalStrings_Callouts.starts|=string_cursor
249
250                                #inc()
251                        #if (string_cursor & escaped_Callouts.UELParen) :
252                                #cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
253                        #if (string_cursor & escaped_Callouts.UERParen) :
254                                #dec()
255                        #if (string_cursor & escaped_Callouts.UERParen) :
256                                #if is_zero():
257                                        #literalStrings_Callouts.ends|=string_cursor
258                                        #cursor = pablo.ScanTo(pablo.Advance(string_cursor), scan_characters)
259                                #if lt_zero():
260                                        #literalStrings_Callouts.error|=string_cursor
261                                        #cursor = pablo.ScanTo(pablo.Advance(string_cursor), scan_characters)
262                                #if ~(is_zero() | lt_zero()):
263                                        #cursor = pablo.ScanTo(pablo.Advance(string_cursor), escaped_Callouts.UELParen | escaped_Callouts.UERParen)
264                                       
265
266        #comments_Callouts.mask = pablo.SpanUpTo(comment_starts, comment_ends)
267        #literalStrings_Callouts.mask = pablo.InclusiveSpan(literalStrings_Callouts.starts,literalStrings_Callouts.ends)
268        #literalStrings_Callouts.escapes = escaped_Callouts.escapes & literalStrings_Callouts.mask
269        #literalStrings_Callouts.carriage_returns = lex.CR & literalStrings_Callouts.mask &~ escaped_Callouts.escaped
270        #marker.mask = comments_Callouts.mask | literalStrings_Callouts.mask
271
272       
273def Parse_HexStrings(lex, marker, out_Callouts) :
274        hexString_starts = lex.LAngle #&~marker.mask
275        hexString_ends = pablo.ScanThru(pablo.Advance(hexString_starts),lex.Hex|lex.WS)
276        #error = hexString_ends &~ lex.RAngle
277        out_Callouts.hexString_mask = pablo.InclusiveSpan(hexString_starts,hexString_ends)
278        marker.hex_opener = hexString_starts
279
280def Parse_Names(lex, marker, out_Callouts) :
281        name_starts =lex.Slash #&~marker.mask
282        names_follows = pablo.ScanThru(pablo.Advance(name_starts), lex.Regular)
283        out_Callouts.names_escapes = lex.Hash & pablo.Lookahead(lex.Hex) & pablo.Lookahead(lex.Hex,2)
284        marker.name_starts = name_starts
285       
286def Parse_Numeric(lex, marker, out_Callouts) :
287        numeric_characters = (lex.Digit | lex.Period | lex.Sign)
288        numeric_starts = (numeric_characters &~ pablo.Advance(lex.Regular)) #&~ marker.mask
289        numeric_follows = pablo.ScanThru(numeric_starts, lex.Regular)
290        marker.numeric_starts = numeric_starts 
291
292       
293def Prepare_content_buffer(basis_bits, lex, escape_Callouts, out_Callouts):
294
295    out_Callouts.bit_0 = basis_bits.bit_0
296    out_Callouts.bit_1 = basis_bits.bit_1
297    out_Callouts.bit_2 = basis_bits.bit_2
298    out_Callouts.bit_3 = basis_bits.bit_3
299    out_Callouts.bit_4 = basis_bits.bit_4
300    out_Callouts.bit_5 = basis_bits.bit_5
301    out_Callouts.bit_6 = basis_bits.bit_6
302    out_Callouts.bit_7 = basis_bits.bit_7
303   
304    names_escapes_scope1 = pablo.Advance(out_Callouts.names_escapes)
305    names_escapes_scope2 = pablo.Advance(names_escapes_scope1)
306    out_Callouts.hexString_mask |= names_escapes_scope1 | names_escapes_scope2
307   
308    if out_Callouts.hexString_mask:
309     
310        out_Callouts.delmask |= out_Callouts.hexString_mask & lex.WS
311       
312        NondigitHexString = lex.Hex &~ lex.Digit
313        out_Callouts.bit_0 &= ~out_Callouts.hexString_mask
314        out_Callouts.bit_1 &= ~out_Callouts.hexString_mask
315        out_Callouts.bit_2 &= ~out_Callouts.hexString_mask
316        out_Callouts.bit_3 &= ~out_Callouts.hexString_mask
317        out_Callouts.bit_4 |= (out_Callouts.hexString_mask & NondigitHexString)
318        carry7 = out_Callouts.bit_7 & NondigitHexString & out_Callouts.hexString_mask
319        out_Callouts.bit_7 ^= NondigitHexString & out_Callouts.hexString_mask
320        carry6 = out_Callouts.bit_6 & carry7
321        out_Callouts.bit_6 ^= carry7
322        out_Callouts.bit_5 ^= carry6
323       
324
325    if escape_Callouts.Nonoct:       
326        out_Callouts.bit_1 ^= ( lex.pdf_mod_bit_1 & escape_Callouts.Nonoct)
327        out_Callouts.bit_2 ^= ( lex.pdf_mod_bit_2 & escape_Callouts.Nonoct)
328        out_Callouts.bit_3 ^= ( lex.pdf_mod_bit_3 & escape_Callouts.Nonoct)
329        out_Callouts.bit_4 ^= ( lex.pdf_mod_bit_4 & escape_Callouts.Nonoct)
330        out_Callouts.bit_5 ^= ( lex.pdf_mod_bit_5 & escape_Callouts.Nonoct)
331        out_Callouts.bit_6 ^= ( lex.pdf_mod_bit_6 & escape_Callouts.Nonoct)
332        out_Callouts.bit_7 ^= ( lex.pdf_mod_bit_7 & escape_Callouts.Nonoct)
333       
334    if out_Callouts.names_escapes:
335        out_Callouts.delmask |= out_Callouts.names_escapes | names_escapes_scope1
336        out_Callouts.bit_0 = (out_Callouts.bit_0 &~ names_escapes_scope2) 
337        out_Callouts.bit_1 = (out_Callouts.bit_1 &~ names_escapes_scope2)
338        out_Callouts.bit_2 = (out_Callouts.bit_2 &~ names_escapes_scope2) 
339        out_Callouts.bit_3 = (out_Callouts.bit_3 &~ names_escapes_scope2) 
340        out_Callouts.bit_0 |= pablo.Advance(out_Callouts.bit_4 & names_escapes_scope1)
341        out_Callouts.bit_1 |= pablo.Advance(out_Callouts.bit_5 & names_escapes_scope1)
342        out_Callouts.bit_2 |= pablo.Advance(out_Callouts.bit_6 & names_escapes_scope1)
343        out_Callouts.bit_3 |= pablo.Advance(out_Callouts.bit_7 & names_escapes_scope1) 
344       
345    if escape_Callouts.Oct1:
346        out_Callouts.bit_0 = (out_Callouts.bit_0 &~ escape_Callouts.Oct1) 
347        out_Callouts.bit_1 = (out_Callouts.bit_1 &~ escape_Callouts.Oct1)
348        out_Callouts.bit_2 = (out_Callouts.bit_2 &~ escape_Callouts.Oct1) 
349        out_Callouts.bit_3 = (out_Callouts.bit_3 &~ escape_Callouts.Oct1) 
350     
351    if escape_Callouts.Oct2:
352        out_Callouts.delmask |= escape_Callouts.Oct2
353        Oct2_scope1 = pablo.Advance(escape_Callouts.Oct2)
354        out_Callouts.bit_2 = (out_Callouts.bit_2 &~ Oct2_scope1) | pablo.Advance(out_Callouts.bit_5 & escape_Callouts.Oct2)
355        out_Callouts.bit_3 = (out_Callouts.bit_3 &~ Oct2_scope1) | pablo.Advance(out_Callouts.bit_6 & escape_Callouts.Oct2)
356        out_Callouts.bit_4 = (out_Callouts.bit_4 &~ Oct2_scope1) | pablo.Advance(out_Callouts.bit_7 & escape_Callouts.Oct2)
357       
358    if escape_Callouts.Oct3:
359        Oct3_scope1 = pablo.Advance(escape_Callouts.Oct3)
360        Oct3_scope2 = pablo.Advance(Oct3_scope1)
361        out_Callouts.delmask |= escape_Callouts.Oct3 | Oct3_scope1
362        temp0 = pablo.Advance(out_Callouts.bit_6 & escape_Callouts.Oct3)
363        temp1 = pablo.Advance(out_Callouts.bit_7 & escape_Callouts.Oct3)
364        out_Callouts.bit_0 = (out_Callouts.bit_0 &~ Oct3_scope2) | pablo.Advance(temp0)
365        out_Callouts.bit_1 = (out_Callouts.bit_1 &~ Oct3_scope2) | pablo.Advance(temp1)
366        out_Callouts.bit_2 = (out_Callouts.bit_2 &~ Oct3_scope2) | pablo.Advance(out_Callouts.bit_5 & Oct3_scope1)
367        out_Callouts.bit_3 = (out_Callouts.bit_3 &~ Oct3_scope2) | pablo.Advance(out_Callouts.bit_6 & Oct3_scope1)
368        out_Callouts.bit_4 = (out_Callouts.bit_4 &~ Oct3_scope2) | pablo.Advance(out_Callouts.bit_7 & Oct3_scope1)       
369     
370 
371    out_Callouts.zeromask = out_Callouts.delmask 
372    out_Callouts.bit_0 = out_Callouts.bit_0 &~ out_Callouts.zeromask   
373    out_Callouts.bit_1 = out_Callouts.bit_1 &~ out_Callouts.zeromask
374    out_Callouts.bit_2 = out_Callouts.bit_2 &~ out_Callouts.zeromask
375    out_Callouts.bit_3 = out_Callouts.bit_3 &~ out_Callouts.zeromask
376    out_Callouts.bit_4 = out_Callouts.bit_4 &~ out_Callouts.zeromask
377    out_Callouts.bit_5 = out_Callouts.bit_5 &~ out_Callouts.zeromask
378    out_Callouts.bit_6 = out_Callouts.bit_6 &~ out_Callouts.zeromask
379    out_Callouts.bit_7 = out_Callouts.bit_7 &~ out_Callouts.zeromask
380   
381
382def Main(basis_bits, lex, escape_Callouts, out_Callouts):
383
384        Classify_bytes(basis_bits, lex)
385
386        Parse_Escaped(lex, parity, escape_Callouts, out_Callouts)
387       
388        Parse_HexStrings(lex, marker, out_Callouts)
389
390        Prepare_content_buffer(basis_bits, lex, escape_Callouts, out_Callouts)
391
392
393
Note: See TracBrowser for help on using the repository browser.