source: proto/PDF/cb_pablo.py @ 2903

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

Escape parsing and numeric calculation optimization.

File size: 16.1 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    mask = 0
58    zeromask = 0
59    delmask = 0
60    hexString_mask = 0
61    names_escapes = 0
62    bit_0 = 0
63    bit_1 = 0
64    bit_2 = 0
65    bit_3 = 0
66    bit_4 = 0
67    bit_5 = 0
68    bit_6 = 0
69    bit_7 = 0
70   
71class marker():
72    hex_opener = 0
73    name_starts = 0
74    numeric_starts = 0
75   
76   
77
78def Classify_bytes(basis_bits, lex):
79        temp1 = (basis_bits.bit_1 &~ basis_bits.bit_0)
80        temp2 = (basis_bits.bit_2 &~ basis_bits.bit_3)
81        temp3 = (temp1 & temp2)
82        temp4 = (basis_bits.bit_6 &~ basis_bits.bit_7)
83        temp5 = (basis_bits.bit_4 | basis_bits.bit_5)
84        temp6 = (basis_bits.bit_5 &~ basis_bits.bit_4)
85        temp7 = (temp5 &~ temp6)
86        temp8 = (basis_bits.bit_4 & basis_bits.bit_5)
87        temp9 = (temp7 &~ temp8)
88        temp10 = (temp4 &~ temp9)
89        temp11 = (temp3 & temp10)
90        temp12 = (basis_bits.bit_2 & basis_bits.bit_3)
91        temp13 = (temp1 & temp12)
92        temp14 = (temp4 &~ temp5)
93        temp15 = (temp13 & temp14)
94        temp16 = (temp11 | temp15)
95        temp17 = (basis_bits.bit_6 | basis_bits.bit_7)
96        temp18 = (temp6 &~ temp17)
97        temp19 = (temp13 & temp18)
98        lex.pdf_mod_bit_1 = (temp16 | temp19)
99        lex.pdf_mod_bit_2 = (temp16 | temp19)
100        temp20 = (temp14 | temp18)
101        lex.pdf_mod_bit_3 = (temp13 & temp20)
102        temp21 = (temp4 &~ temp7)
103        temp22 = (temp3 & temp21)
104        temp23 = (temp22 | temp15)
105        lex.pdf_mod_bit_4 = (temp23 | temp19)
106        temp24 = (temp8 & temp4)
107        temp25 = (temp3 & temp24)
108        temp26 = (temp25 | temp15)
109        lex.pdf_mod_bit_5 = (temp26 | temp19)
110        lex.pdf_mod_bit_6 = (temp22 | temp15)
111        lex.pdf_mod_bit_7 = (temp13 & temp20)
112        temp27 = (basis_bits.bit_0 | basis_bits.bit_1)
113        temp28 = (temp2 &~ temp27)
114        temp29 = (basis_bits.bit_4 &~ basis_bits.bit_5)
115        temp30 = (temp29 &~ temp17)
116        lex.LParen = (temp28 & temp30)
117        temp31 = (basis_bits.bit_7 &~ basis_bits.bit_6)
118        temp32 = (temp29 & temp31)
119        lex.RParen = (temp28 & temp32)
120        temp33 = (basis_bits.bit_3 &~ basis_bits.bit_2)
121        temp34 = (temp1 & temp33)
122        temp35 = (temp8 &~ temp17)
123        lex.Backslash = (temp34 & temp35)
124        temp36 = (temp17 &~ temp31)
125        temp37 = (temp29 &~ temp36)
126        temp38 = (temp28 & temp37)
127        temp39 = (temp12 &~ temp27)
128        temp40 = (temp39 & temp35)
129        temp41 = (temp38 | temp40)
130        temp42 = (temp39 & temp24)
131        temp43 = (temp41 | temp42)
132        temp44 = (basis_bits.bit_6 & basis_bits.bit_7)
133        temp45 = (temp29 & temp44)
134        temp46 = (temp34 & temp45)
135        temp47 = (temp43 | temp46)
136        temp48 = (temp8 & temp31)
137        temp49 = (temp34 & temp48)
138        temp50 = (temp47 | temp49)
139        temp51 = (temp13 & temp45)
140        temp52 = (temp50 | temp51)
141        temp53 = (temp13 & temp48)
142        temp54 = (temp52 | temp53)
143        temp55 = (temp6 & temp31)
144        temp56 = (temp28 & temp55)
145        temp57 = (temp54 | temp56)
146        temp58 = (temp8 & temp44)
147        temp59 = (temp28 & temp58)
148        lex.Special = (temp57 | temp59)
149        lex.Percent = (temp28 & temp55)
150        lex.Period = (temp28 & temp24)
151        lex.LAngle = (temp39 & temp35)
152        lex.RAngle = (temp39 & temp24)
153        lex.LBracket = (temp34 & temp45)
154        lex.RBracket = (temp34 & temp48)
155        lex.Slash = (temp28 & temp58)
156        temp60 = (basis_bits.bit_2 | basis_bits.bit_3)
157        temp61 = (temp27 | temp60)
158        temp62 = (temp29 & temp4)
159        temp63 = (temp48 | temp62)
160        lex.EOL = (temp63 &~ temp61)
161        temp64 = (temp5 | temp17)
162        temp65 = (temp61 | temp64)
163        temp66 = (temp35 &~ temp61)
164        temp67 = (temp65 &~ temp66)
165        temp68 = (temp48 &~ temp61)
166        temp69 = (temp67 &~ temp68)
167        temp70 = (temp62 &~ temp61)
168        temp71 = (temp69 &~ temp70)
169        temp72 = (temp32 &~ temp61)
170        temp73 = (temp71 &~ temp72)
171        temp74 = (temp28 &~ temp64)
172        temp75 = (temp73 &~ temp74)
173        lex.WS = (~temp75)
174        temp76 = (basis_bits.bit_5 | basis_bits.bit_6)
175        temp77 = (basis_bits.bit_4 & temp76)
176        lex.Digit = (temp39 &~ temp77)
177        temp78 = (temp48 | temp45)
178        lex.Sign = (temp28 & temp78)
179        temp79 = (temp1 &~ temp60)
180        temp80 = (temp79 &~ basis_bits.bit_4)
181        temp81 = (~temp44)
182        temp82 = ((basis_bits.bit_5 & temp81)|(~(basis_bits.bit_5) & temp17))
183        temp83 = (temp80 & temp82)
184        temp84 = (lex.Digit | temp83)
185        temp85 = (temp3 &~ basis_bits.bit_4)
186        temp86 = (temp85 & temp82)
187        lex.Hex = (temp84 | temp86)
188        temp87 = (temp44 &~ temp5)
189        lex.Hash = (temp28 & temp87)
190        lex.CR = (temp48 &~ temp61)
191        lex.LF = (temp62 &~ temp61)
192        lex.Oct = (temp39 &~ basis_bits.bit_4)
193        lex.Nonoct = (temp16 | temp19)
194        lex.Regular = ~ (lex.Special | lex.WS)
195
196       
197def Parse_Escaped(lex, parity, escape_Callouts, out_Callouts):
198 
199        escape_Callouts.UELParen = lex.LParen
200        escape_Callouts.UERParen = lex.RParen
201        escape_Callouts.Nonoct = 0
202        escape_Callouts.Oct1 = 0
203        escape_Callouts.Oct2 = 0
204        escape_Callouts.Oct3 = 0
205        out_Callouts.delmask = 0
206 
207        if lex.Backslash:
208
209          odd = parity.odd
210          even = parity.even
211
212          start = lex.Backslash &~ pablo.Advance(lex.Backslash)
213         
214          even_start = start & even     
215          even_final = pablo.ScanThru(even_start, lex.Backslash) 
216          escape = even_final & odd
217          escape_char = even & pablo.SpanUpTo(even_start, even_final)
218         
219          odd_start = start & odd
220          odd_final = pablo.ScanThru(odd_start, lex.Backslash)
221          escape = escape | (odd_final & even)
222          escape_char |= (odd & pablo.SpanUpTo(odd_start, odd_final))
223
224          escape_Callouts.UELParen = lex.LParen &~ escape
225          escape_Callouts.UERParen = lex.RParen &~ escape
226          escape_Callouts.Nonoct = lex.Nonoct & escape 
227          escape_Callouts.Oct1 = lex.Oct & escape
228          escape_Callouts.Oct2 = escape_Callouts.Oct1 & pablo.Lookahead(lex.Oct)
229          escape_Callouts.Oct1 &= ~escape_Callouts.Oct2
230          escape_Callouts.Oct3 = escape_Callouts.Oct2 & pablo.Lookahead(lex.Oct, 2)
231          escape_Callouts.Oct2 &= ~escape_Callouts.Oct3
232          out_Callouts.delmask = escape_char
233
234#def Parse_CommentsLiteralStrings(lex, escaped_Callouts, marker, comments_Callouts, literalStrings_Callouts) :
235       
236
237       
238def Parse_HexStrings(lex, marker, out_Callouts) :
239        hexString_starts = lex.LAngle #&~marker.mask
240        hexString_ends = pablo.ScanThru(pablo.Advance(hexString_starts),lex.Hex|lex.WS)
241        #error = hexString_ends &~ lex.RAngle
242        out_Callouts.hexString_mask = pablo.InclusiveSpan(hexString_starts,hexString_ends)
243        out_Callouts.mask = out_Callouts.hexString_mask
244        marker.hex_opener = hexString_starts
245
246def Parse_Names(lex, marker, out_Callouts) :
247        name_starts =lex.Slash #&~marker.mask
248        names_follows = pablo.ScanThru(pablo.Advance(name_starts), lex.Regular)
249        out_Callouts.names_escapes = lex.Hash & pablo.Lookahead(lex.Hex) & pablo.Lookahead(lex.Hex,2)   
250        out_Callouts.mask |= pablo.InclusiveSpan(name_starts,names_follows)
251        marker.name_starts = name_starts
252       
253def Parse_Numeric(lex, marker, out_Callouts) :
254        numeric_characters = (lex.Digit | lex.Period | lex.Sign)
255        numeric_starts = (numeric_characters &~ pablo.Advance(lex.Regular)) &~ out_Callouts.mask
256        numeric_follows = pablo.ScanThru(numeric_starts, lex.Regular)
257        marker.numeric_starts = numeric_starts 
258
259       
260def Prepare_content_buffer(basis_bits, lex, marker, parity, escape_Callouts, out_Callouts):
261
262    out_Callouts.bit_0 = basis_bits.bit_0
263    out_Callouts.bit_1 = basis_bits.bit_1
264    out_Callouts.bit_2 = basis_bits.bit_2
265    out_Callouts.bit_3 = basis_bits.bit_3
266    out_Callouts.bit_4 = basis_bits.bit_4
267    out_Callouts.bit_5 = basis_bits.bit_5
268    out_Callouts.bit_6 = basis_bits.bit_6
269    out_Callouts.bit_7 = basis_bits.bit_7
270   
271    names_escapes_scope1 = pablo.Advance(out_Callouts.names_escapes)
272    names_escapes_scope2 = pablo.Advance(names_escapes_scope1)
273    hexstring_nameescape_mask = out_Callouts.hexString_mask | names_escapes_scope1 | names_escapes_scope2
274   
275    if hexstring_nameescape_mask:
276     
277        out_Callouts.delmask |= out_Callouts.hexString_mask & lex.WS
278       
279        NondigitHexString = lex.Hex &~ lex.Digit
280        out_Callouts.bit_0 &= ~hexstring_nameescape_mask
281        out_Callouts.bit_1 &= ~hexstring_nameescape_mask
282        out_Callouts.bit_2 &= ~hexstring_nameescape_mask
283        out_Callouts.bit_3 &= ~hexstring_nameescape_mask
284        out_Callouts.bit_4 |= (hexstring_nameescape_mask & NondigitHexString)
285        carry7 = out_Callouts.bit_7 & NondigitHexString & hexstring_nameescape_mask
286        out_Callouts.bit_7 ^= NondigitHexString & hexstring_nameescape_mask
287        carry6 = out_Callouts.bit_6 & carry7
288        out_Callouts.bit_6 ^= carry7
289        out_Callouts.bit_5 ^= carry6
290       
291    if out_Callouts.hexString_mask:
292        hexsting_partial_start = marker.hex_opener
293        hexsting_partial_odd_start = hexsting_partial_start & parity.odd
294        hexsting_partial_even_start = hexsting_partial_start & parity.even
295        hexsting_partial_odd_end = pablo.ScanThru(pablo.Advance(hexsting_partial_odd_start),lex.Hex)
296        hexsting_partial_even_end = pablo.ScanThru(pablo.Advance(hexsting_partial_even_start),lex.Hex)
297        hexsting_partial_odd_mask = pablo.ExclusiveSpan(hexsting_partial_odd_start,hexsting_partial_odd_end) | (hexsting_partial_odd_end & parity.odd)       
298        hexsting_partial_even_mask = pablo.ExclusiveSpan(hexsting_partial_even_start,hexsting_partial_even_end) | (hexsting_partial_even_end & parity.even)
299       
300        del_position = (hexsting_partial_odd_mask & parity.even) | (hexsting_partial_even_mask & parity.odd)
301        kept_position = (hexsting_partial_odd_mask & parity.odd) | (hexsting_partial_even_mask & parity.even)
302       
303         
304        hexsting_partial_end = hexsting_partial_odd_end | hexsting_partial_even_end
305        hexsting_partial_ends = hexsting_partial_end
306        kept_positions = kept_position
307        del_positions = del_position
308        del_pre_ends = 0
309        while hexsting_partial_end & lex.WS:
310          del_pre_end = del_position & pablo.Lookahead(lex.WS) 
311          kept_pre_end = kept_position & pablo.Lookahead(lex.WS) 
312         
313          del_even_start = pablo.ScanThru(pablo.Advance(del_pre_end),lex.WS) & parity.even
314          del_odd_start = pablo.ScanThru(pablo.Advance(del_pre_end),lex.WS) & parity.odd
315          kept_even_start = pablo.ScanThru(pablo.Advance(kept_pre_end),lex.WS) & parity.even
316          kept_odd_start = pablo.ScanThru(pablo.Advance(kept_pre_end),lex.WS) & parity.odd
317           
318          del_even_end = pablo.ScanThru(del_even_start,lex.Hex)
319          del_odd_end = pablo.ScanThru(del_odd_start,lex.Hex)
320          kept_even_end = pablo.ScanThru(kept_even_start,lex.Hex)
321          kept_odd_end = pablo.ScanThru(kept_odd_start,lex.Hex)
322         
323          hexsting_partial_odd_mask = pablo.InclusiveSpan(del_even_start,del_even_end) | pablo.InclusiveSpan(kept_odd_start,kept_odd_end) 
324          hexsting_partial_even_mask = pablo.InclusiveSpan(del_odd_start,del_odd_end) | pablo.InclusiveSpan(kept_even_start,kept_even_end)   
325         
326          hexsting_partial_end = del_even_end | del_odd_end | kept_even_end | kept_odd_end
327         
328          kept_position = (hexsting_partial_odd_mask & parity.even) | (hexsting_partial_even_mask & parity.odd)
329          del_position = (hexsting_partial_odd_mask & parity.odd) | (hexsting_partial_even_mask & parity.even)
330          del_position = del_position &~ hexsting_partial_end
331         
332          hexsting_partial_ends |= hexsting_partial_end
333          kept_positions |= kept_position
334          del_positions |= del_position
335          del_pre_ends |= del_pre_end
336         
337     
338        out_Callouts.bit_4 &= ~hexsting_partial_ends
339        out_Callouts.bit_5 &= ~hexsting_partial_ends
340        out_Callouts.bit_6 &= ~hexsting_partial_ends
341        out_Callouts.bit_7 &= ~hexsting_partial_ends
342     
343        out_Callouts.bit_0 = pablo.Advance(del_positions & out_Callouts.bit_4) | (out_Callouts.bit_0 & ~kept_positions) | pablo.ScanThru(pablo.Advance((out_Callouts.bit_4 & del_pre_ends)), lex.WS)
344        out_Callouts.bit_1 = pablo.Advance(del_positions & out_Callouts.bit_5) | (out_Callouts.bit_1 & ~kept_positions) | pablo.ScanThru(pablo.Advance((out_Callouts.bit_5 & del_pre_ends)), lex.WS)
345        out_Callouts.bit_2 = pablo.Advance(del_positions & out_Callouts.bit_6) | (out_Callouts.bit_2 & ~kept_positions) | pablo.ScanThru(pablo.Advance((out_Callouts.bit_6 & del_pre_ends)), lex.WS) 
346        out_Callouts.bit_3 = pablo.Advance(del_positions & out_Callouts.bit_7) | (out_Callouts.bit_3 & ~kept_positions) | pablo.ScanThru(pablo.Advance((out_Callouts.bit_7 & del_pre_ends)), lex.WS) 
347       
348        out_Callouts.delmask |= del_positions
349           
350       
351
352    if escape_Callouts.Nonoct:       
353        out_Callouts.bit_1 ^= ( lex.pdf_mod_bit_1 & escape_Callouts.Nonoct)
354        out_Callouts.bit_2 ^= ( lex.pdf_mod_bit_2 & escape_Callouts.Nonoct)
355        out_Callouts.bit_3 ^= ( lex.pdf_mod_bit_3 & escape_Callouts.Nonoct)
356        out_Callouts.bit_4 ^= ( lex.pdf_mod_bit_4 & escape_Callouts.Nonoct)
357        out_Callouts.bit_5 ^= ( lex.pdf_mod_bit_5 & escape_Callouts.Nonoct)
358        out_Callouts.bit_6 ^= ( lex.pdf_mod_bit_6 & escape_Callouts.Nonoct)
359        out_Callouts.bit_7 ^= ( lex.pdf_mod_bit_7 & escape_Callouts.Nonoct)
360       
361    if out_Callouts.names_escapes:
362        out_Callouts.delmask |= out_Callouts.names_escapes | names_escapes_scope1
363        out_Callouts.bit_0 = (out_Callouts.bit_0 &~ names_escapes_scope2) 
364        out_Callouts.bit_1 = (out_Callouts.bit_1 &~ names_escapes_scope2)
365        out_Callouts.bit_2 = (out_Callouts.bit_2 &~ names_escapes_scope2) 
366        out_Callouts.bit_3 = (out_Callouts.bit_3 &~ names_escapes_scope2) 
367        out_Callouts.bit_0 |= pablo.Advance(out_Callouts.bit_4 & names_escapes_scope1)
368        out_Callouts.bit_1 |= pablo.Advance(out_Callouts.bit_5 & names_escapes_scope1)
369        out_Callouts.bit_2 |= pablo.Advance(out_Callouts.bit_6 & names_escapes_scope1)
370        out_Callouts.bit_3 |= pablo.Advance(out_Callouts.bit_7 & names_escapes_scope1) 
371       
372    if escape_Callouts.Oct1:
373        out_Callouts.bit_0 = (out_Callouts.bit_0 &~ escape_Callouts.Oct1) 
374        out_Callouts.bit_1 = (out_Callouts.bit_1 &~ escape_Callouts.Oct1)
375        out_Callouts.bit_2 = (out_Callouts.bit_2 &~ escape_Callouts.Oct1) 
376        out_Callouts.bit_3 = (out_Callouts.bit_3 &~ escape_Callouts.Oct1) 
377     
378    if escape_Callouts.Oct2:
379        out_Callouts.delmask |= escape_Callouts.Oct2
380        Oct2_scope1 = pablo.Advance(escape_Callouts.Oct2)
381        out_Callouts.bit_2 = (out_Callouts.bit_2 &~ Oct2_scope1) | pablo.Advance(out_Callouts.bit_5 & escape_Callouts.Oct2)
382        out_Callouts.bit_3 = (out_Callouts.bit_3 &~ Oct2_scope1) | pablo.Advance(out_Callouts.bit_6 & escape_Callouts.Oct2)
383        out_Callouts.bit_4 = (out_Callouts.bit_4 &~ Oct2_scope1) | pablo.Advance(out_Callouts.bit_7 & escape_Callouts.Oct2)
384       
385    if escape_Callouts.Oct3:
386        Oct3_scope1 = pablo.Advance(escape_Callouts.Oct3)
387        Oct3_scope2 = pablo.Advance(Oct3_scope1)
388        out_Callouts.delmask |= escape_Callouts.Oct3 | Oct3_scope1
389        temp0 = pablo.Advance(out_Callouts.bit_6 & escape_Callouts.Oct3)
390        temp1 = pablo.Advance(out_Callouts.bit_7 & escape_Callouts.Oct3)
391        out_Callouts.bit_0 = (out_Callouts.bit_0 &~ Oct3_scope2) | pablo.Advance(temp0)
392        out_Callouts.bit_1 = (out_Callouts.bit_1 &~ Oct3_scope2) | pablo.Advance(temp1)
393        out_Callouts.bit_2 = (out_Callouts.bit_2 &~ Oct3_scope2) | pablo.Advance(out_Callouts.bit_5 & Oct3_scope1)
394        out_Callouts.bit_3 = (out_Callouts.bit_3 &~ Oct3_scope2) | pablo.Advance(out_Callouts.bit_6 & Oct3_scope1)
395        out_Callouts.bit_4 = (out_Callouts.bit_4 &~ Oct3_scope2) | pablo.Advance(out_Callouts.bit_7 & Oct3_scope1)       
396     
397 
398    out_Callouts.zeromask = out_Callouts.delmask 
399    out_Callouts.bit_0 = out_Callouts.bit_0 &~ out_Callouts.zeromask   
400    out_Callouts.bit_1 = out_Callouts.bit_1 &~ out_Callouts.zeromask
401    out_Callouts.bit_2 = out_Callouts.bit_2 &~ out_Callouts.zeromask
402    out_Callouts.bit_3 = out_Callouts.bit_3 &~ out_Callouts.zeromask
403    out_Callouts.bit_4 = out_Callouts.bit_4 &~ out_Callouts.zeromask
404    out_Callouts.bit_5 = out_Callouts.bit_5 &~ out_Callouts.zeromask
405    out_Callouts.bit_6 = out_Callouts.bit_6 &~ out_Callouts.zeromask
406    out_Callouts.bit_7 = out_Callouts.bit_7 &~ out_Callouts.zeromask
407   
408
409def Main(basis_bits, lex, escape_Callouts, out_Callouts):
410
411        Classify_bytes(basis_bits, lex)
412
413        Parse_Escaped(lex, parity, escape_Callouts, out_Callouts)
414       
415        Parse_HexStrings(lex, marker, out_Callouts)
416
417        Prepare_content_buffer(basis_bits, lex, escape_Callouts, out_Callouts)
418
419
420
Note: See TracBrowser for help on using the repository browser.