source: proto/xmlschema/parabix2_validation_cc.py @ 3437

Last change on this file since 3437 was 3374, checked in by shiyangy, 6 years ago

validation function template checked in

File size: 37.6 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# parabix2_compilable.py
4#
5# Parallel XML Parsing with Bitstream Addition
6#
7# - Complete prototype for all bitstream computations in Parabix2
8# - Optimized for compilation
9# - Separate compilation
10
11# Robert D. Cameron
12# July 29, 2010
13#
14
15#import bitutil
16
17class u8 ():
18  unibyte = 0
19  prefix = 0
20  prefix2 = 0
21  prefix3 = 0
22  prefix4 = 0
23  suffix = 0
24  badprefix = 0
25  xE0 = 0
26  xED = 0
27  xF0 = 0
28  xF4 = 0
29  xA0_xBF = 0
30  x80_x9F = 0
31  x90_xBF = 0
32  x80_x8F = 0
33  xEF = 0
34  xBF = 0
35  xBE = 0
36  scope22 = 0
37  scope32 = 0
38  scope33 = 0
39  scope42 = 0
40  scope43 = 0
41  scope44 = 0
42  xE0_scope = 0
43  xED_scope = 0
44  xF0_scope = 0
45  xF4_scope = 0
46  xEF_scope = 0
47
48class Lex ():
49        CR = 0
50        LF = 0
51        HT = 0
52        SP = 0
53        CRLF = 0
54        RefStart = 0
55        Semicolon = 0
56        Colon = 0
57        LAngle = 0
58        RAngle = 0
59        LBracket = 0
60        RBracket = 0
61        Exclam = 0
62        QMark = 0
63        Hyphen = 0
64        Equals = 0
65        SQuote = 0
66        DQuote = 0
67        Slash = 0
68        Hash = 0
69        x = 0
70        ASCII_name_start = 0
71        ASCII_name_char = 0
72        NameScan = 0
73        Digit = 0
74        Hex = 0
75        WS = 0
76        tag_closing = 0
77        cc0 = 0
78        @cc_lex
79
80class Scope1 ():
81        RefStart = 0
82        LAngle = 0
83        Hyphen = 0
84        QMark = 0
85        RBracket = 0
86       
87class Marker ():
88        LAngle_scope = 0
89        Ref_opener = 0
90        CD_closer = 0
91
92class CtCDPI_Callouts():
93        CD_end = 0
94        Ct_starts = 0
95        Ct_ends = 0
96        CD_starts = 0
97        CD_ends = 0
98        PI_starts = 0
99        PI_name_starts = 0
100        PI_name_ends = 0
101        PI_ends = 0
102        CtCDPI_mask = 0
103
104class Ref_Callouts():
105        GenRef_starts = 0
106        GenRef_ends = 0
107        DecRef_starts = 0
108        DecRef_ends = 0
109        HexRef_starts = 0
110        HexRef_ends = 0
111
112class Hash_data():
113        Hash_value = 0
114
115class Tag_Callouts():
116        ElemName_starts = 0
117        ElemName_ends = 0
118        ElemName_ends_1 = 0
119        ElemName_ends_2 = 0
120        ElemName_ends_3 = 0
121        ElemName_ends_4 = 0
122        ElemName_ends_5 = 0
123        ElemName_ends_6 = 0
124        ElemName_ends_7 = 0
125        ElemName_ends_8 = 0
126        ElemName_ends_9 = 0
127        ElemName_ends_10 = 0
128        ElemName_ends_11 = 0
129        ElemName_ends_12 = 0
130        ElemName_ends_13 = 0
131        ElemName_ends_14 = 0
132        ElemName_ends_15 = 0
133        ElemName_ends_16 = 0
134        ElemName_ends_17_and_longer = 0
135        AttName_starts = 0
136        AttName_ends = 0
137        AttVal_starts = 0
138        AttVal_ends = 0
139        AttVal_spans = 0
140        EmptyTag_marks = 0
141        EndTag_marks = 0
142       
143        Tag_closing = 0
144
145class Basis_bits():
146        bit_0 = 0
147        bit_1 = 0
148        bit_2 = 0
149        bit_3 = 0
150        bit_4 = 0
151        bit_5 = 0
152        bit_6 = 0
153        bit_7 = 0
154
155class Check_streams():
156        misc_mask = 0
157        non_ascii_name_starts = 0
158        non_ascii_names = 0
159        tag_marks = 0
160        name_follows = 0
161        att_refs = 0
162
163class Xml_names():
164        namespace_error = 0
165       
166class elem():
167        purchaseOrder = 0
168        shipTo =0
169        name =0
170        street =0
171        city =0
172        state =0
173        zip =0
174        billTo =0
175        comment =0
176        items =0
177        item =0
178        productName =0
179        quantity =0
180        USPrice =0
181        shipDate =0
182       
183class Output():
184        matches = 0
185
186def Classify_bytes_Validate_utf8(basis_bits, lex, u8):
187        temp1 = (basis_bits.bit_0 | basis_bits.bit_1);
188        temp2 = (basis_bits.bit_2 &~ basis_bits.bit_3);
189        temp3 = (temp2 &~ temp1);
190        temp4 = (basis_bits.bit_5 &~ basis_bits.bit_4);
191        temp5 = (basis_bits.bit_6 &~ basis_bits.bit_7);
192        temp6 = (temp4 & temp5);
193        lex.RefStart = (temp3 & temp6);
194        temp7 = (basis_bits.bit_2 & basis_bits.bit_3);
195        temp8 = (temp7 &~ temp1);
196        temp9 = (basis_bits.bit_4 &~ basis_bits.bit_5);
197        temp10 = (basis_bits.bit_6 & basis_bits.bit_7);
198        temp11 = (temp9 & temp10);
199        lex.Semicolon = (temp8 & temp11);
200        temp12 = (basis_bits.bit_4 & basis_bits.bit_5);
201        temp13 = (basis_bits.bit_6 | basis_bits.bit_7);
202        temp14 = (temp12 &~ temp13);
203        lex.LAngle = (temp8 & temp14);
204        temp15 = (temp12 & temp5);
205        lex.RAngle = (temp8 & temp15);
206        temp16 = (basis_bits.bit_1 &~ basis_bits.bit_0);
207        temp17 = (basis_bits.bit_3 &~ basis_bits.bit_2);
208        temp18 = (temp16 & temp17);
209        lex.LBracket = (temp18 & temp11);
210        temp19 = (basis_bits.bit_7 &~ basis_bits.bit_6);
211        temp20 = (temp12 & temp19);
212        lex.RBracket = (temp18 & temp20);
213        temp21 = (basis_bits.bit_4 | basis_bits.bit_5);
214        temp22 = (temp19 &~ temp21);
215        lex.Exclam = (temp3 & temp22);
216        temp23 = (temp12 & temp10);
217        lex.QMark = (temp8 & temp23);
218        lex.Hyphen = (temp3 & temp20);
219        lex.Equals = (temp8 & temp20);
220        temp24 = (temp4 & temp10);
221        lex.SQuote = (temp3 & temp24);
222        temp25 = (temp5 &~ temp21);
223        lex.DQuote = (temp3 & temp25);
224        lex.Slash = (temp3 & temp23);
225        temp26 = (temp10 &~ temp21);
226        lex.Hash = (temp3 & temp26);
227        temp27 = (temp16 & temp7);
228        temp28 = (temp9 &~ temp13);
229        lex.x = (temp27 & temp28);
230        temp29 = (temp9 & temp5);
231        lex.Colon = (temp8 & temp29);
232        temp30 = (temp18 & temp23);
233        temp31 = (temp30 | lex.Colon);
234        temp32 = (temp16 &~ basis_bits.bit_2);
235        temp33 = (basis_bits.bit_5 | temp10);
236        temp34 = (basis_bits.bit_4 & temp33);
237        temp35 = (~temp34);
238        temp36 = (temp21 | temp13);
239        temp37 = ((basis_bits.bit_3 & temp35)|(~(basis_bits.bit_3) & temp36));
240        temp38 = (temp32 & temp37);
241        temp39 = (temp31 | temp38);
242        temp40 = (temp16 & basis_bits.bit_2);
243        temp41 = (temp40 & temp37);
244        lex.ASCII_name_start = (temp39 | temp41);
245        temp42 = (temp30 | lex.Hyphen);
246        temp43 = (temp3 & temp15);
247        temp44 = (temp42 | temp43);
248        temp45 = (temp8 &~ temp34);
249        temp46 = (temp44 | temp45);
250        temp47 = (temp46 | temp38);
251        lex.ASCII_name_char = (temp47 | temp41);
252        lex.NameScan = (lex.ASCII_name_char | basis_bits.bit_0);
253        temp48 = (temp1 | basis_bits.bit_2);
254        x00_x1F = (~temp48);
255        temp49 = (basis_bits.bit_2 | basis_bits.bit_3);
256        temp50 = (temp1 | temp49);
257        lex.CR = (temp20 &~ temp50);
258        lex.LF = (temp29 &~ temp50);
259        temp51 = (temp9 & temp19);
260        lex.HT = (temp51 &~ temp50);
261        lex.SP = (temp3 &~ temp36);
262        temp52 = (temp20 | temp29);
263        temp53 = (temp52 | temp51);
264        temp54 = (temp53 &~ temp50);
265        lex.WS = (temp54 | lex.SP);
266        temp55 = (basis_bits.bit_5 | basis_bits.bit_6);
267        temp56 = (basis_bits.bit_4 & temp55);
268        lex.Digit = (temp8 &~ temp56);
269        temp57 = (temp16 &~ temp49);
270        temp58 = (temp57 &~ basis_bits.bit_4);
271        temp59 = (~temp10);
272        temp60 = ((basis_bits.bit_5 & temp59)|(~(basis_bits.bit_5) & temp13));
273        temp61 = (temp58 & temp60);
274        temp62 = (lex.Digit | temp61);
275        temp63 = (temp16 & temp2);
276        temp64 = (temp63 &~ basis_bits.bit_4);
277        temp65 = (temp64 & temp60);
278        lex.Hex = (temp62 | temp65);
279        lex_error = x00_x1F &~ lex.WS
280        if lex_error & EOF_mask:
281                error_tracker.NoteError("Error: illegal character", lex_error)
282
283
284        ### Validate_utf8(basis_bits, u8):
285        u8.unibyte = (~basis_bits.bit_0);
286        u8.suffix = 0
287        u8_error = 0
288        u8_FFFE_FFFF = 0
289        u8anyscope = 0 #local
290        if basis_bits.bit_0:
291                u8.prefix = (basis_bits.bit_0 & basis_bits.bit_1);
292                u8.prefix2 = (u8.prefix &~ basis_bits.bit_2);
293                u8.prefix3 = (u8.prefix & temp2);
294                u8.prefix4 = (u8.prefix & temp7);
295                u8.suffix = (basis_bits.bit_0 &~ basis_bits.bit_1);
296                temp66 = (u8.prefix &~ temp49);
297                temp67 = (temp21 | basis_bits.bit_6);
298                temp68 = (temp66 &~ temp67);
299                temp69 = (basis_bits.bit_5 & temp13);
300                temp70 = (basis_bits.bit_4 | temp69);
301                temp71 = (u8.prefix4 & temp70);
302                u8.badprefix = (temp68 | temp71);
303                u8_error = u8.badprefix
304                u8.scope22 = pablo.Advance(u8.prefix2)
305                u8anyscope = u8.scope22
306                if u8.prefix3 | u8.prefix4:
307                        xE0 = (u8.prefix3 &~ temp36);
308                        xED = (u8.prefix3 & temp20);
309                        xF0 = (u8.prefix4 &~ temp36);
310                        temp72 = (temp4 &~ temp13);
311                        xF4 = (u8.prefix4 & temp72);
312                        u8.xA0_xBF = (u8.suffix & basis_bits.bit_2);
313                        u8.x80_x9F = (u8.suffix &~ basis_bits.bit_2);
314                        u8.x90_xBF = (u8.suffix & temp49);
315                        u8.x80_x8F = (u8.suffix &~ temp49);
316                        xEF = (u8.prefix3 & temp23);
317                        temp73 = (u8.suffix & temp7);
318                        u8.xBF = (temp73 & temp23);
319                        u8.xBE = (temp73 & temp15);
320                        u8.xE0_scope = pablo.Advance(xE0);
321                        u8.xED_scope = pablo.Advance(xED);
322                        u8.xF0_scope = pablo.Advance(xF0);
323                        u8.xF4_scope = pablo.Advance(xF4);
324                        u8.xEF_scope = pablo.Advance(xEF);
325                        u8.scope32 = pablo.Advance(u8.prefix3)
326                        u8.scope33 = pablo.Advance(u8.scope32)
327                        u8.scope42 = pablo.Advance(u8.prefix4)
328                        u8.scope43 = pablo.Advance(u8.scope42)
329                        u8.scope44 = pablo.Advance(u8.scope43)
330
331                        u8lastscope = u8.scope22 | u8.scope33 | u8.scope44
332                        u8anyscope = u8lastscope | u8.scope32 | u8.scope42 | u8.scope43
333
334                        u8error1 = u8.xE0_scope & u8.x80_x9F
335                        u8error2 = u8.xED_scope & u8.xA0_xBF
336                        u8error3 = u8.xF0_scope & u8.x80_x8F
337                        u8error4 = u8.xF4_scope & u8.x90_xBF
338
339                        u8_error |= u8error1 | u8error2 | u8error3 | u8error4
340
341                        EF_BF_pending = pablo.Advance(u8.xEF_scope & u8.xBF)
342
343                        u8_FFFE_FFFF = (EF_BF_pending & (u8.xBE | u8.xBF))
344                u8mismatch = u8anyscope ^ u8.suffix
345                u8_error |= u8mismatch | u8_FFFE_FFFF
346                if u8_error:
347                        error_tracker.NoteError("UTF-8 error found", (u8_error))
348
349
350def Add_scope_streams(lex, scope1):
351        #scope1.LAngle = pablo.Advance(lex.LAngle)
352        #scope1.Hyphen = pablo.Advance(lex.Hyphen)
353        #scope1.QMark = pablo.Advance(lex.QMark)
354        v = lex.LAngle | lex.Hyphen
355        w = lex.Hyphen | lex.QMark
356        v1 = pablo.Advance(v)
357        w1 = pablo.Advance(w)
358        scope1.LAngle = v1 &~ w1
359        scope1.Hyphen = v1 & w1
360        scope1.QMark = w1 &~ v1
361        scope1.RefStart = 0 # default
362
363def Parse_CtCDPI(lex, marker, ctCDPI_Callouts, check_streams):
364        ctCDPI_Callouts.Ct_starts = 0
365        ctCDPI_Callouts.Ct_ends = 0
366        ctCDPI_Callouts.CD_starts = 0
367        ctCDPI_Callouts.CD_ends = 0
368        ctCDPI_Callouts.PI_starts = 0
369        ctCDPI_Callouts.PI_name_starts = 0
370        ctCDPI_Callouts.PI_name_ends = 0
371        ctCDPI_Callouts.PI_ends = 0
372        CtCDPI_starts = 0
373        CtCDPI_ends = 0
374        ctCDPI_mask = 0
375
376        v = lex.LAngle | lex.Hyphen
377        w = lex.Hyphen | lex.QMark
378        v1 = pablo.Advance(v,1)
379        w1 = pablo.Advance(w,1)
380       
381        LAngle_scope = v1 &~ w1  #pablo.Advance(lex.LAngle)
382        PI_opener = LAngle_scope & lex.QMark
383        CtCD_opener= LAngle_scope & lex.Exclam
384        CtCDPI_opener = PI_opener | CtCD_opener
385
386        #DoubleHyphen = 0
387        CD_closer = 0
388        #PI_closer = 0
389       
390        #if lex.Hyphen: DoubleHyphen = pablo.Advance(lex.Hyphen) & lex.Hyphen
391        DoubleHyphen = v1 & w1 & lex.Hyphen
392        if lex.RBracket:
393                DoubleRBracket = pablo.Advance(lex.RBracket) & lex.RBracket
394                CD_closer = pablo.Advance(DoubleRBracket) & lex.RAngle
395        #if lex.QMark: PI_closer = pablo.Advance(lex.QMark) & lex.RAngle
396        PI_closer = w1 & ~v1 & lex.RAngle
397
398        #
399        # Initiate the scan
400        CtCDPI_Cursor = pablo.ScanToFirst(CtCDPI_opener)
401        while CtCDPI_Cursor:
402                CtCDPI_starts |= CtCDPI_Cursor
403                PI_Cursor = CtCDPI_Cursor & PI_opener
404                CD_Ct_Cursor = pablo.Advance(CtCDPI_Cursor & ~PI_Cursor)
405                CD_Cursor = CD_Ct_Cursor & lex.LBracket
406                Ct_Cursor = CD_Ct_Cursor & lex.Hyphen
407                # PI processing
408                if PI_Cursor:
409                        ctCDPI_Callouts.PI_starts |= PI_Cursor
410                        PI_Cursor = pablo.Advance(PI_Cursor)
411                        ctCDPI_Callouts.PI_name_starts |= PI_Cursor
412                        PI_name_end = pablo.ScanThru(PI_Cursor, lex.NameScan)
413                        PI_error = PI_Cursor & PI_name_end
414                        PI_noWS = PI_name_end & ~ lex.WS
415                        PI_error |= PI_noWS &~ lex.QMark | pablo.Advance(PI_noWS) &~ PI_closer
416                        pablo.assert_0(PI_error, "Error in PI syntax")
417                        ctCDPI_Callouts.PI_name_ends |= PI_name_end
418                        PI_Cursor = pablo.ScanTo(PI_name_end, PI_closer)
419                        ctCDPI_Callouts.PI_ends |= PI_Cursor
420                        CtCDPI_ends |= PI_Cursor
421
422                # CDATA section processing
423                if CD_Cursor:
424                        ctCDPI_Callouts.CD_starts |= CD_Cursor
425                        CD_Cursor = pablo.ScanTo(CD_Cursor, CD_closer)
426                        ctCDPI_Callouts.CD_ends |= CD_Cursor
427                        CtCDPI_ends |= CD_Cursor
428
429                # Comment processing
430                if Ct_Cursor:
431                        ctCDPI_Callouts.Ct_starts |= Ct_Cursor
432                        Ct_Cursor = pablo.Advance(Ct_Cursor) 
433                        Ct_error = Ct_Cursor & ~ lex.Hyphen
434                        # Advance twice past <!--, so that we don't treat <!---
435                        # as being a terminated comment.
436                        Ct_Cursor = pablo.Advance(pablo.Advance(Ct_Cursor))
437                        Ct_Cursor = pablo.Advance(pablo.ScanTo(Ct_Cursor, DoubleHyphen))
438                        pablo.assert_0(Ct_error | Ct_Cursor & ~ lex.RAngle, "Error in comment syntax")
439                        ctCDPI_Callouts.Ct_ends |= Ct_Cursor
440                        CtCDPI_ends |= Ct_Cursor
441
442                # Common processing
443                CtCDPI_Cursor = PI_Cursor | CD_Cursor | Ct_Cursor
444                ctCDPI_mask = pablo.InclusiveSpan(CtCDPI_starts, CtCDPI_ends)
445#               ctCDPI_mask |= (CtCDPI_ends - CtCDPI_starts) | CtCDPI_ends
446                # If any of the Comment, CDATA or PI markups are unterminated, it is an error.
447                pablo.assert_0(pablo.atEOF(ctCDPI_mask), "Error in comment, CDATA or processing instruction syntax")
448                CtCDPI_Cursor = pablo.ScanTo(CtCDPI_Cursor, CtCDPI_opener)     
449               
450#       check_streams.misc_mask = (lex.WS | lex.LAngle | (pablo.Advance(ctCDPI_Callouts.Ct_ends | ctCDPI_Callouts.PI_ends)  -(ctCDPI_Callouts.Ct_starts | ctCDPI_Callouts.PI_starts)) | CtCDPI_starts) & EOF_mask
451#  Following is slow
452        check_streams.misc_mask = (lex.WS | lex.LAngle | pablo.InclusiveSpan(ctCDPI_Callouts.Ct_starts | ctCDPI_Callouts.PI_starts, ctCDPI_Callouts.Ct_ends | ctCDPI_Callouts.PI_ends) | CtCDPI_starts) & EOF_mask
453
454
455        # Identify the remaining significant markers for XML processing.
456        marker.LAngle_scope = LAngle_scope &~ ctCDPI_mask
457        marker.Ref_opener = lex.RefStart &~ ctCDPI_mask
458        marker.CD_closer = CD_closer &~ ctCDPI_mask
459
460def Parse_tags(lex, marker, tag_Callouts):
461       
462        EqExpected = 0
463        AttListEnd = 0
464       
465        # Delimiters for scans.
466        DQuoteDelim = lex.DQuote | lex.LAngle
467        SQuoteDelim = lex.SQuote | lex.LAngle
468        AttListDelim = lex.Slash | lex.RAngle
469       
470        # Start the parallel parsing by inspecting the character
471        # after the opening "<" of a tag.
472        tag_Callouts.ElemName_starts = marker.LAngle_scope & ~lex.Slash
473        tag_Callouts.EndTag_marks = marker.LAngle_scope & lex.Slash
474       
475        # Start Tag/Empty Element Tag Parsing
476
477        # Advance all cursors by scanning through the tag name.
478        tag_Callouts.ElemName_ends = pablo.ScanThru(tag_Callouts.ElemName_starts, lex.NameScan)
479        # Must have at least one name character for a legal start tag.
480        # Mark any occurrences of null names as errors.
481        ParseError = tag_Callouts.ElemName_starts & tag_Callouts.ElemName_ends
482       
483        # Initialize the accumulators for attribute name and value positions.
484        tag_Callouts.AttName_starts = 0 
485        tag_Callouts.AttName_ends = 0
486        tag_Callouts.AttVal_starts = 0
487        tag_Callouts.AttVal_ends = 0
488        # After the element name, there may or may not be an attlist.
489        if tag_Callouts.ElemName_ends & lex.WS:
490                AfterWS = pablo.ScanThru(tag_Callouts.ElemName_ends, lex.WS)
491                AttListEnd = AfterWS & AttListDelim
492                AttNameStart = AfterWS & ~AttListDelim
493                #
494                # The following loop iterates through attributes within a start tag.
495                # Because all start tags are processed in parallel, the number of
496                # iterations is the maximum number of attributes found in any one
497                # start tag, plus one.
498                while AttNameStart:
499                        ParseError |= AttNameStart &~ lex.NameScan
500                        tag_Callouts.AttName_starts |= AttNameStart
501                        AttNameFollow = pablo.ScanThru(AttNameStart, lex.NameScan)
502                        tag_Callouts.AttName_ends |= AttNameFollow
503                        # Scan through WS to the expected '=' delimiter.
504                        # EqExpected = pablo.ScanThru(AttNameFollow, lex.WS)
505                        # But use if test to optimize.
506                        if AttNameFollow & lex.WS: 
507                                EqExpected = pablo.ScanThru(AttNameFollow, lex.WS)
508                        else: EqExpected = AttNameFollow
509                        ParseError |= EqExpected &~ lex.Equals
510                        AttValPos = pablo.AdvanceThenScanThru(EqExpected, lex.WS)
511#                       AttValPos = pablo.ScanThru(EqExpected, EqExpected | lex.WS)
512                        tag_Callouts.AttVal_starts |= AttValPos
513                        DQuoteAttVal = AttValPos & lex.DQuote
514                        SQuoteAttVal = AttValPos & lex.SQuote
515#                       DQuoteAttEnd = pablo.ScanTo(DQuoteAttVal, DQuoteDelim &~ DQuoteAttVal)
516#                       SQuoteAttEnd = pablo.ScanTo(SQuoteAttVal, SQuoteDelim &~ SQuoteAttVal)
517                        DQuoteAttEnd = pablo.AdvanceThenScanTo(DQuoteAttVal, DQuoteDelim)
518                        SQuoteAttEnd = pablo.AdvanceThenScanTo(SQuoteAttVal, SQuoteDelim)
519                        AttValEnd = DQuoteAttEnd | SQuoteAttEnd
520                        ParseError |= (AttValPos | AttValEnd) &~ (lex.DQuote | lex.SQuote)
521                        AttValFollow = pablo.Advance(AttValEnd)
522                        tag_Callouts.AttVal_ends |= AttValFollow
523                        #  AfterWS = pablo.ScanThru(AttValFollow, lex.WS)
524                        if AttValFollow & lex.WS: 
525                                AfterWS = pablo.ScanThru(AttValFollow, lex.WS)
526                                AttListEnd |= AfterWS & AttListDelim
527                                AttNameStart = AfterWS & ~AttListDelim
528                        else: 
529                                AttListEnd |= AttValFollow & AttListDelim       
530                                AttNameStart = AttValFollow & ~AttListDelim
531                        ParseError |= AttValFollow & AttNameStart
532        else:
533                # No WS character after ElemName; must be at the end
534                AttListEnd = tag_Callouts.ElemName_ends & AttListDelim
535                ParseError |= tag_Callouts.ElemName_ends & ~AttListDelim
536
537        STagEnds = AttListEnd & lex.RAngle
538        # Mark any "/" characters found as the ends of empty element tags.
539        tag_Callouts.EmptyTag_marks = pablo.Advance(AttListEnd & lex.Slash)
540       
541        ParseError |= tag_Callouts.EmptyTag_marks & ~lex.RAngle
542
543        # End Tag Parsing
544
545        EndTagEnds = pablo.AdvanceThenScanThru(tag_Callouts.EndTag_marks, lex.NameScan)
546        if EndTagEnds & lex.WS:
547                EndTagEnds = pablo.ScanThru(EndTagEnds, lex.WS)
548        ParseError |= EndTagEnds & ~lex.RAngle
549        pablo.assert_0(ParseError, "Tag parsing error found")
550               
551               
552        # Attribute value spans
553#       tag_Callouts.AttVal_spans = tag_Callouts.AttVal_ends - tag_Callouts.AttVal_starts
554        tag_Callouts.AttVal_spans = pablo.SpanUpTo(tag_Callouts.AttVal_starts, tag_Callouts.AttVal_ends)
555       
556        tag_Callouts.Tag_closing = tag_Callouts.EmptyTag_marks | tag_Callouts.EndTag_marks
557
558def Parse_refs(lex, marker, ref_Callouts):
559        ref_Callouts.GenRef_starts = 0
560        ref_Callouts.GenRef_ends = 0
561        ref_Callouts.DecRef_starts = 0
562        ref_Callouts.DecRef_ends = 0
563        ref_Callouts.HexRef_starts = 0
564        ref_Callouts.HexRef_ends = 0
565        ref_error = 0
566
567        # All remaining "&" must be reference start characters; parse them.
568        if marker.Ref_opener:
569                Ref_scope = pablo.Advance(marker.Ref_opener)
570                NumRef2 = Ref_scope & lex.Hash
571                ref_Callouts.GenRef_starts = Ref_scope &~ lex.Hash
572                NumRef3 = pablo.Advance(NumRef2)
573                HexRef3 = NumRef3 & lex.x
574                ref_Callouts.DecRef_starts = NumRef3 &~ lex.x
575                ref_Callouts.HexRef_starts = pablo.Advance(HexRef3) 
576                ref_Callouts.GenRef_ends = pablo.ScanThru(ref_Callouts.GenRef_starts, lex.NameScan)
577                ref_Callouts.DecRef_ends = pablo.ScanThru(ref_Callouts.DecRef_starts, lex.Digit)
578                ref_Callouts.HexRef_ends = pablo.ScanThru(ref_Callouts.HexRef_starts, lex.Hex)
579                # Error checks
580                # At least one digit required for DecRef, one hex digit for HexRef.
581                ref_error1 = ref_Callouts.DecRef_starts &~ lex.Digit
582                ref_error2 = ref_Callouts.HexRef_starts &~ lex.Hex
583                # Semicolon terminator required (also covers unterminated at EOF).
584                ref_ends = ref_Callouts.GenRef_ends | ref_Callouts.DecRef_ends | ref_Callouts.HexRef_ends
585                ref_error3 = ref_ends &~ lex.Semicolon
586                pablo.assert_0(ref_error1 | ref_error2 | ref_error3, "Reference error found")
587
588
589
590def Validate_xml_names(ctCDPI_Callouts, ref_Callouts, tag_Callouts, lex, u8, check_streams):
591        PI_names = pablo.SpanUpTo(ctCDPI_Callouts.PI_name_starts,ctCDPI_Callouts.PI_name_ends)
592        GenRefs = pablo.SpanUpTo(ref_Callouts.GenRef_starts,ref_Callouts.GenRef_ends)
593        ElemNames = pablo.SpanUpTo(tag_Callouts.ElemName_starts,tag_Callouts.ElemName_ends)
594        AttNames = pablo.SpanUpTo(tag_Callouts.AttName_starts, tag_Callouts.AttName_ends)
595        qname_stream =  ElemNames | AttNames
596        ncname_stream = PI_names | GenRefs
597        name_stream = qname_stream | ncname_stream
598        name_start = name_stream &~ pablo.Advance(name_stream)
599        name_cursor = name_stream & ~pablo.Advance(name_stream)
600        void_prefix_err = name_cursor & lex.Colon
601        namespace_sep = pablo.ScanThru(name_cursor, lex.NameScan &~ lex.Colon) & lex.Colon
602        local_part_start = pablo.Advance(namespace_sep)
603        local_part_err = local_part_start &~ lex.NameScan
604        colon2_err = pablo.ScanThru(local_part_start, lex.NameScan &~ lex.Colon) & lex.Colon
605        ncname_err = ncname_stream & lex.Colon
606        namespace_error = void_prefix_err | local_part_err | colon2_err | ncname_err
607        if namespace_error:
608                error_tracker.NoteError("error found", namespace_error)
609
610
611        check_streams.non_ascii_name_starts = name_start &~lex.ASCII_name_start
612        check_streams.non_ascii_names = (name_stream &~ name_start) & ~lex.ASCII_name_char & ~u8.suffix
613
614   
615def Do_check_streams(marker, tag_Callouts, check_streams):
616        pablo.assert_0(marker.CD_closer & ~tag_Callouts.AttVal_spans, "Error: ]]> in text")
617        check_streams.tag_marks = tag_Callouts.EmptyTag_marks | tag_Callouts.ElemName_starts | tag_Callouts.EndTag_marks | tag_Callouts.AttName_starts
618        check_streams.name_follows = tag_Callouts.ElemName_ends | tag_Callouts.AttName_ends
619        check_streams.att_refs = tag_Callouts.AttVal_spans & marker.Ref_opener
620
621
622def Classify_bytes(basis_bits,lex):
623        @cc_code
624       
625def Validation_1(lex, output):
626        m0=0
627        m1=0
628        m2=0
629        m3=0
630        m4=0
631        m5=0
632        m0=~0
633        m0 = pablo.Advance((m0 & lex.cc1))
634        m1 = m0
635        m3 = m1
636        m4 = m1
637        m5 = m1
638        m1 = pablo.Advance((m1 & lex.cc2))
639        m1 = pablo.Advance((m1 & lex.tag_closing))
640        m3 = pablo.Advance((m3 & lex.cc3))
641        m3 = pablo.Advance((m3 & lex.tag_closing))
642        m4 = pablo.Advance((m4 & lex.cc4))
643        m4 = pablo.Advance((m4 & lex.tag_closing))
644        m5 = pablo.Advance((m5 & lex.cc27))
645        m5 = pablo.Advance((m5 & lex.tag_closing))
646        m1 = (((m1 | m3) | m4) | m5)
647        while (~m0 & m1):
648                        m0 = (m0 | m1)
649                        m3 = m1
650                        m4 = m1
651                        m5 = m1
652                        m1 = pablo.Advance((m1 & lex.cc2))
653                        m1 = pablo.Advance((m1 & lex.tag_closing))
654                        m3 = pablo.Advance((m3 & lex.cc3))
655                        m3 = pablo.Advance((m3 & lex.tag_closing))
656                        m4 = pablo.Advance((m4 & lex.cc4))
657                        m4 = pablo.Advance((m4 & lex.tag_closing))
658                        m5 = pablo.Advance((m5 & lex.cc27))
659                        m5 = pablo.Advance((m5 & lex.tag_closing))
660                        m1 = (((m1 | m3) | m4) | m5)
661        m0 = pablo.Advance((m0 & lex.tag_closing))
662        output.matches = m0
663       
664def validation_5(lex, output):
665        m0=0
666        m0=~0
667        m0 = pablo.Advance((m0 & lex.cc5))
668        m0 = pablo.Advance((m0 & lex.tag_closing))
669        output.matches = m0
670       
671def Validation_25(lex,output):
672        m0=0
673        m1=0
674        m2=0
675        m0=~0
676        m0 = pablo.Advance((m0 & lex.cc25))
677        m1 = m0
678        m1 = pablo.Advance((m1 & lex.cc5))
679        m1 = pablo.Advance((m1 & lex.tag_closing))
680        while (~m0 & m1):
681                        m0 = (m0 | m1)
682                        m1 = pablo.Advance((m1 & lex.cc5))
683                        m1 = pablo.Advance((m1 & lex.tag_closing))
684        m0 = pablo.Advance((m0 & lex.tag_closing))
685        output.matches = m0
686       
687def Validation_24(lex,output):
688        m0=0
689        m1=0
690        m2=0
691        m3=0
692        m4=0
693        m5=0
694        m6=0
695        m7=0
696        m8=0
697        m9=0
698        m10=0
699        m11=0
700        m12=0
701        m13=0
702        m14=0
703        m15=0
704        m16=0
705        m17=0
706        m18=0
707        m19=0
708        m20=0
709        m21=0
710        m22=0
711        m0=~0
712        m0 = pablo.Advance((m0 & lex.cc24))
713        m0 = pablo.Advance((m0 & lex.cc5))
714        m0 = pablo.Advance((m0 & lex.tag_closing))
715        m1 = m0
716        m3 = m1
717        m4 = m1
718        m5 = m1
719        m1 = pablo.Advance((m1 & lex.cc7))
720        m1 = pablo.Advance((m1 & lex.tag_closing))
721        m3 = pablo.Advance((m3 & lex.cc6))
722        m3 = pablo.Advance((m3 & lex.tag_closing))
723        m4 = pablo.Advance((m4 & lex.cc8))
724        m4 = pablo.Advance((m4 & lex.tag_closing))
725        m6 = m5
726        m8 = m6
727        m9 = m6
728        m10 = m6
729        m11 = m6
730        m12 = m6
731        m13 = m6
732        m14 = m6
733        m15 = m6
734        m16 = m6
735        m17 = m6
736        m18 = m6
737        m19 = m6
738        m20 = m6
739        m21 = m6
740        m22 = m6
741        m6 = pablo.Advance((m6 & lex.cc27))
742        m6 = pablo.Advance((m6 & lex.tag_closing))
743        m8 = pablo.Advance((m8 & lex.cc28))
744        m8 = pablo.Advance((m8 & lex.tag_closing))
745        m9 = pablo.Advance((m9 & lex.cc29))
746        m9 = pablo.Advance((m9 & lex.tag_closing))
747        m10 = pablo.Advance((m10 & lex.cc31))
748        m10 = pablo.Advance((m10 & lex.tag_closing))
749        m11 = pablo.Advance((m11 & lex.cc30))
750        m11 = pablo.Advance((m11 & lex.tag_closing))
751        m12 = pablo.Advance((m12 & lex.cc32))
752        m12 = pablo.Advance((m12 & lex.tag_closing))
753        m13 = pablo.Advance((m13 & lex.cc33))
754        m13 = pablo.Advance((m13 & lex.tag_closing))
755        m14 = pablo.Advance((m14 & lex.cc34))
756        m14 = pablo.Advance((m14 & lex.tag_closing))
757        m15 = pablo.Advance((m15 & lex.cc35))
758        m15 = pablo.Advance((m15 & lex.tag_closing))
759        m16 = pablo.Advance((m16 & lex.cc36))
760        m16 = pablo.Advance((m16 & lex.tag_closing))
761        m17 = pablo.Advance((m17 & lex.cc37))
762        m17 = pablo.Advance((m17 & lex.tag_closing))
763        m18 = pablo.Advance((m18 & lex.cc38))
764        m18 = pablo.Advance((m18 & lex.tag_closing))
765        m19 = pablo.Advance((m19 & lex.cc39))
766        m19 = pablo.Advance((m19 & lex.tag_closing))
767        m20 = pablo.Advance((m20 & lex.cc40))
768        m20 = pablo.Advance((m20 & lex.tag_closing))
769        m21 = pablo.Advance((m21 & lex.cc41))
770        m21 = pablo.Advance((m21 & lex.tag_closing))
771        m22 = pablo.Advance((m22 & lex.cc42))
772        m22 = pablo.Advance((m22 & lex.tag_closing))
773        m6 = (((((((((((((((m6 | m8) | m9) | m10) | m11) | m12) | m13) | m14) | m15) | m16) | m17) | m18) | m19) | m20) | m21) | m22)
774        while (~m5 & m6):
775                        m5 = (m5 | m6)
776                        m8 = m6
777                        m9 = m6
778                        m10 = m6
779                        m11 = m6
780                        m12 = m6
781                        m13 = m6
782                        m14 = m6
783                        m15 = m6
784                        m16 = m6
785                        m17 = m6
786                        m18 = m6
787                        m19 = m6
788                        m20 = m6
789                        m21 = m6
790                        m22 = m6
791                        m6 = pablo.Advance((m6 & lex.cc27))
792                        m6 = pablo.Advance((m6 & lex.tag_closing))
793                        m8 = pablo.Advance((m8 & lex.cc28))
794                        m8 = pablo.Advance((m8 & lex.tag_closing))
795                        m9 = pablo.Advance((m9 & lex.cc29))
796                        m9 = pablo.Advance((m9 & lex.tag_closing))
797                        m10 = pablo.Advance((m10 & lex.cc31))
798                        m10 = pablo.Advance((m10 & lex.tag_closing))
799                        m11 = pablo.Advance((m11 & lex.cc30))
800                        m11 = pablo.Advance((m11 & lex.tag_closing))
801                        m12 = pablo.Advance((m12 & lex.cc32))
802                        m12 = pablo.Advance((m12 & lex.tag_closing))
803                        m13 = pablo.Advance((m13 & lex.cc33))
804                        m13 = pablo.Advance((m13 & lex.tag_closing))
805                        m14 = pablo.Advance((m14 & lex.cc34))
806                        m14 = pablo.Advance((m14 & lex.tag_closing))
807                        m15 = pablo.Advance((m15 & lex.cc35))
808                        m15 = pablo.Advance((m15 & lex.tag_closing))
809                        m16 = pablo.Advance((m16 & lex.cc36))
810                        m16 = pablo.Advance((m16 & lex.tag_closing))
811                        m17 = pablo.Advance((m17 & lex.cc37))
812                        m17 = pablo.Advance((m17 & lex.tag_closing))
813                        m18 = pablo.Advance((m18 & lex.cc38))
814                        m18 = pablo.Advance((m18 & lex.tag_closing))
815                        m19 = pablo.Advance((m19 & lex.cc39))
816                        m19 = pablo.Advance((m19 & lex.tag_closing))
817                        m20 = pablo.Advance((m20 & lex.cc40))
818                        m20 = pablo.Advance((m20 & lex.tag_closing))
819                        m21 = pablo.Advance((m21 & lex.cc41))
820                        m21 = pablo.Advance((m21 & lex.tag_closing))
821                        m22 = pablo.Advance((m22 & lex.cc42))
822                        m22 = pablo.Advance((m22 & lex.tag_closing))
823                        m6 = (((((((((((((((m6 | m8) | m9) | m10) | m11) | m12) | m13) | m14) | m15) | m16) | m17) | m18) | m19) | m20) | m21) | m22)
824        m1 = (((m1 | m3) | m4) | m5)
825        while (~m0 & m1):
826                        m0 = (m0 | m1)
827                        m3 = m1
828                        m4 = m1
829                        m5 = m1
830                        m1 = pablo.Advance((m1 & lex.cc7))
831                        m1 = pablo.Advance((m1 & lex.tag_closing))
832                        m3 = pablo.Advance((m3 & lex.cc6))
833                        m3 = pablo.Advance((m3 & lex.tag_closing))
834                        m4 = pablo.Advance((m4 & lex.cc8))
835                        m4 = pablo.Advance((m4 & lex.tag_closing))
836                        m6 = m5
837                        m8 = m6
838                        m9 = m6
839                        m10 = m6
840                        m11 = m6
841                        m12 = m6
842                        m13 = m6
843                        m14 = m6
844                        m15 = m6
845                        m16 = m6
846                        m17 = m6
847                        m18 = m6
848                        m19 = m6
849                        m20 = m6
850                        m21 = m6
851                        m22 = m6
852                        m6 = pablo.Advance((m6 & lex.cc27))
853                        m6 = pablo.Advance((m6 & lex.tag_closing))
854                        m8 = pablo.Advance((m8 & lex.cc28))
855                        m8 = pablo.Advance((m8 & lex.tag_closing))
856                        m9 = pablo.Advance((m9 & lex.cc29))
857                        m9 = pablo.Advance((m9 & lex.tag_closing))
858                        m10 = pablo.Advance((m10 & lex.cc31))
859                        m10 = pablo.Advance((m10 & lex.tag_closing))
860                        m11 = pablo.Advance((m11 & lex.cc30))
861                        m11 = pablo.Advance((m11 & lex.tag_closing))
862                        m12 = pablo.Advance((m12 & lex.cc32))
863                        m12 = pablo.Advance((m12 & lex.tag_closing))
864                        m13 = pablo.Advance((m13 & lex.cc33))
865                        m13 = pablo.Advance((m13 & lex.tag_closing))
866                        m14 = pablo.Advance((m14 & lex.cc34))
867                        m14 = pablo.Advance((m14 & lex.tag_closing))
868                        m15 = pablo.Advance((m15 & lex.cc35))
869                        m15 = pablo.Advance((m15 & lex.tag_closing))
870                        m16 = pablo.Advance((m16 & lex.cc36))
871                        m16 = pablo.Advance((m16 & lex.tag_closing))
872                        m17 = pablo.Advance((m17 & lex.cc37))
873                        m17 = pablo.Advance((m17 & lex.tag_closing))
874                        m18 = pablo.Advance((m18 & lex.cc38))
875                        m18 = pablo.Advance((m18 & lex.tag_closing))
876                        m19 = pablo.Advance((m19 & lex.cc39))
877                        m19 = pablo.Advance((m19 & lex.tag_closing))
878                        m20 = pablo.Advance((m20 & lex.cc40))
879                        m20 = pablo.Advance((m20 & lex.tag_closing))
880                        m21 = pablo.Advance((m21 & lex.cc41))
881                        m21 = pablo.Advance((m21 & lex.tag_closing))
882                        m22 = pablo.Advance((m22 & lex.cc42))
883                        m22 = pablo.Advance((m22 & lex.tag_closing))
884                        m6 = (((((((((((((((m6 | m8) | m9) | m10) | m11) | m12) | m13) | m14) | m15) | m16) | m17) | m18) | m19) | m20) | m21) | m22)
885                        while (~m5 & m6):
886                                        m5 = (m5 | m6)
887                                        m8 = m6
888                                        m9 = m6
889                                        m10 = m6
890                                        m11 = m6
891                                        m12 = m6
892                                        m13 = m6
893                                        m14 = m6
894                                        m15 = m6
895                                        m16 = m6
896                                        m17 = m6
897                                        m18 = m6
898                                        m19 = m6
899                                        m20 = m6
900                                        m21 = m6
901                                        m22 = m6
902                                        m6 = pablo.Advance((m6 & lex.cc27))
903                                        m6 = pablo.Advance((m6 & lex.tag_closing))
904                                        m8 = pablo.Advance((m8 & lex.cc28))
905                                        m8 = pablo.Advance((m8 & lex.tag_closing))
906                                        m9 = pablo.Advance((m9 & lex.cc29))
907                                        m9 = pablo.Advance((m9 & lex.tag_closing))
908                                        m10 = pablo.Advance((m10 & lex.cc31))
909                                        m10 = pablo.Advance((m10 & lex.tag_closing))
910                                        m11 = pablo.Advance((m11 & lex.cc30))
911                                        m11 = pablo.Advance((m11 & lex.tag_closing))
912                                        m12 = pablo.Advance((m12 & lex.cc32))
913                                        m12 = pablo.Advance((m12 & lex.tag_closing))
914                                        m13 = pablo.Advance((m13 & lex.cc33))
915                                        m13 = pablo.Advance((m13 & lex.tag_closing))
916                                        m14 = pablo.Advance((m14 & lex.cc34))
917                                        m14 = pablo.Advance((m14 & lex.tag_closing))
918                                        m15 = pablo.Advance((m15 & lex.cc35))
919                                        m15 = pablo.Advance((m15 & lex.tag_closing))
920                                        m16 = pablo.Advance((m16 & lex.cc36))
921                                        m16 = pablo.Advance((m16 & lex.tag_closing))
922                                        m17 = pablo.Advance((m17 & lex.cc37))
923                                        m17 = pablo.Advance((m17 & lex.tag_closing))
924                                        m18 = pablo.Advance((m18 & lex.cc38))
925                                        m18 = pablo.Advance((m18 & lex.tag_closing))
926                                        m19 = pablo.Advance((m19 & lex.cc39))
927                                        m19 = pablo.Advance((m19 & lex.tag_closing))
928                                        m20 = pablo.Advance((m20 & lex.cc40))
929                                        m20 = pablo.Advance((m20 & lex.tag_closing))
930                                        m21 = pablo.Advance((m21 & lex.cc41))
931                                        m21 = pablo.Advance((m21 & lex.tag_closing))
932                                        m22 = pablo.Advance((m22 & lex.cc42))
933                                        m22 = pablo.Advance((m22 & lex.tag_closing))
934                                        m6 = (((((((((((((((m6 | m8) | m9) | m10) | m11) | m12) | m13) | m14) | m15) | m16) | m17) | m18) | m19) | m20) | m21) | m22)
935                        m1 = (((m1 | m3) | m4) | m5)
936        m0 = pablo.Advance((m0 & lex.tag_closing))
937        output.matches = m0
938       
939def Validation_27(lex,output): 
940        m0=0
941        m1=0
942        m2=0
943        m3=0
944        m4=0
945        m5=0
946        m6=0
947        m7=0
948        m8=0
949        m9=0
950        m10=0
951        m11=0
952        m12=0
953        m13=0
954        m14=0
955        m15=0
956        m16=0
957        m17=0
958        m18=0
959        m19=0
960        m0=~0
961        m0 = pablo.Advance((m0 & lex.cc27))
962        m1 = m0
963        m3 = m1
964        m5 = m3
965        m6 = m3
966        m7 = m3
967        m8 = m3
968        m9 = m3
969        m10 = m3
970        m11 = m3
971        m12 = m3
972        m13 = m3
973        m14 = m3
974        m15 = m3
975        m16 = m3
976        m17 = m3
977        m18 = m3
978        m19 = m3
979        m3 = pablo.Advance((m3 & lex.cc27))
980        m3 = pablo.Advance((m3 & lex.tag_closing))
981        m5 = pablo.Advance((m5 & lex.cc28))
982        m5 = pablo.Advance((m5 & lex.tag_closing))
983        m6 = pablo.Advance((m6 & lex.cc29))
984        m6 = pablo.Advance((m6 & lex.tag_closing))
985        m7 = pablo.Advance((m7 & lex.cc31))
986        m7 = pablo.Advance((m7 & lex.tag_closing))
987        m8 = pablo.Advance((m8 & lex.cc30))
988        m8 = pablo.Advance((m8 & lex.tag_closing))
989        m9 = pablo.Advance((m9 & lex.cc32))
990        m9 = pablo.Advance((m9 & lex.tag_closing))
991        m10 = pablo.Advance((m10 & lex.cc33))
992        m10 = pablo.Advance((m10 & lex.tag_closing))
993        m11 = pablo.Advance((m11 & lex.cc34))
994        m11 = pablo.Advance((m11 & lex.tag_closing))
995        m12 = pablo.Advance((m12 & lex.cc35))
996        m12 = pablo.Advance((m12 & lex.tag_closing))
997        m13 = pablo.Advance((m13 & lex.cc36))
998        m13 = pablo.Advance((m13 & lex.tag_closing))
999        m14 = pablo.Advance((m14 & lex.cc37))
1000        m14 = pablo.Advance((m14 & lex.tag_closing))
1001        m15 = pablo.Advance((m15 & lex.cc38))
1002        m15 = pablo.Advance((m15 & lex.tag_closing))
1003        m16 = pablo.Advance((m16 & lex.cc39))
1004        m16 = pablo.Advance((m16 & lex.tag_closing))
1005        m17 = pablo.Advance((m17 & lex.cc40))
1006        m17 = pablo.Advance((m17 & lex.tag_closing))
1007        m18 = pablo.Advance((m18 & lex.cc41))
1008        m18 = pablo.Advance((m18 & lex.tag_closing))
1009        m19 = pablo.Advance((m19 & lex.cc42))
1010        m19 = pablo.Advance((m19 & lex.tag_closing))
1011        m3 = (((((((((((((((m3 | m5) | m6) | m7) | m8) | m9) | m10) | m11) | m12) | m13) | m14) | m15) | m16) | m17) | m18) | m19)
1012        while (~m1 & m3):
1013                        m1 = (m1 | m3)
1014                        m5 = m3
1015                        m6 = m3
1016                        m7 = m3
1017                        m8 = m3
1018                        m9 = m3
1019                        m10 = m3
1020                        m11 = m3
1021                        m12 = m3
1022                        m13 = m3
1023                        m14 = m3
1024                        m15 = m3
1025                        m16 = m3
1026                        m17 = m3
1027                        m18 = m3
1028                        m19 = m3
1029                        m3 = pablo.Advance((m3 & lex.cc27))
1030                        m3 = pablo.Advance((m3 & lex.tag_closing))
1031                        m5 = pablo.Advance((m5 & lex.cc28))
1032                        m5 = pablo.Advance((m5 & lex.tag_closing))
1033                        m6 = pablo.Advance((m6 & lex.cc29))
1034                        m6 = pablo.Advance((m6 & lex.tag_closing))
1035                        m7 = pablo.Advance((m7 & lex.cc31))
1036                        m7 = pablo.Advance((m7 & lex.tag_closing))
1037                        m8 = pablo.Advance((m8 & lex.cc30))
1038                        m8 = pablo.Advance((m8 & lex.tag_closing))
1039                        m9 = pablo.Advance((m9 & lex.cc32))
1040                        m9 = pablo.Advance((m9 & lex.tag_closing))
1041                        m10 = pablo.Advance((m10 & lex.cc33))
1042                        m10 = pablo.Advance((m10 & lex.tag_closing))
1043                        m11 = pablo.Advance((m11 & lex.cc34))
1044                        m11 = pablo.Advance((m11 & lex.tag_closing))
1045                        m12 = pablo.Advance((m12 & lex.cc35))
1046                        m12 = pablo.Advance((m12 & lex.tag_closing))
1047                        m13 = pablo.Advance((m13 & lex.cc36))
1048                        m13 = pablo.Advance((m13 & lex.tag_closing))
1049                        m14 = pablo.Advance((m14 & lex.cc37))
1050                        m14 = pablo.Advance((m14 & lex.tag_closing))
1051                        m15 = pablo.Advance((m15 & lex.cc38))
1052                        m15 = pablo.Advance((m15 & lex.tag_closing))
1053                        m16 = pablo.Advance((m16 & lex.cc39))
1054                        m16 = pablo.Advance((m16 & lex.tag_closing))
1055                        m17 = pablo.Advance((m17 & lex.cc40))
1056                        m17 = pablo.Advance((m17 & lex.tag_closing))
1057                        m18 = pablo.Advance((m18 & lex.cc41))
1058                        m18 = pablo.Advance((m18 & lex.tag_closing))
1059                        m19 = pablo.Advance((m19 & lex.cc42))
1060                        m19 = pablo.Advance((m19 & lex.tag_closing))
1061                        m3 = (((((((((((((((m3 | m5) | m6) | m7) | m8) | m9) | m10) | m11) | m12) | m13) | m14) | m15) | m16) | m17) | m18) | m19)
1062        while (~m0 & m1):
1063                        m0 = (m0 | m1)
1064                        m3 = m1
1065                        m5 = m3
1066                        m6 = m3
1067                        m7 = m3
1068                        m8 = m3
1069                        m9 = m3
1070                        m10 = m3
1071                        m11 = m3
1072                        m12 = m3
1073                        m13 = m3
1074                        m14 = m3
1075                        m15 = m3
1076                        m16 = m3
1077                        m17 = m3
1078                        m18 = m3
1079                        m19 = m3
1080                        m3 = pablo.Advance((m3 & lex.cc27))
1081                        m3 = pablo.Advance((m3 & lex.tag_closing))
1082                        m5 = pablo.Advance((m5 & lex.cc28))
1083                        m5 = pablo.Advance((m5 & lex.tag_closing))
1084                        m6 = pablo.Advance((m6 & lex.cc29))
1085                        m6 = pablo.Advance((m6 & lex.tag_closing))
1086                        m7 = pablo.Advance((m7 & lex.cc31))
1087                        m7 = pablo.Advance((m7 & lex.tag_closing))
1088                        m8 = pablo.Advance((m8 & lex.cc30))
1089                        m8 = pablo.Advance((m8 & lex.tag_closing))
1090                        m9 = pablo.Advance((m9 & lex.cc32))
1091                        m9 = pablo.Advance((m9 & lex.tag_closing))
1092                        m10 = pablo.Advance((m10 & lex.cc33))
1093                        m10 = pablo.Advance((m10 & lex.tag_closing))
1094                        m11 = pablo.Advance((m11 & lex.cc34))
1095                        m11 = pablo.Advance((m11 & lex.tag_closing))
1096                        m12 = pablo.Advance((m12 & lex.cc35))
1097                        m12 = pablo.Advance((m12 & lex.tag_closing))
1098                        m13 = pablo.Advance((m13 & lex.cc36))
1099                        m13 = pablo.Advance((m13 & lex.tag_closing))
1100                        m14 = pablo.Advance((m14 & lex.cc37))
1101                        m14 = pablo.Advance((m14 & lex.tag_closing))
1102                        m15 = pablo.Advance((m15 & lex.cc38))
1103                        m15 = pablo.Advance((m15 & lex.tag_closing))
1104                        m16 = pablo.Advance((m16 & lex.cc39))
1105                        m16 = pablo.Advance((m16 & lex.tag_closing))
1106                        m17 = pablo.Advance((m17 & lex.cc40))
1107                        m17 = pablo.Advance((m17 & lex.tag_closing))
1108                        m18 = pablo.Advance((m18 & lex.cc41))
1109                        m18 = pablo.Advance((m18 & lex.tag_closing))
1110                        m19 = pablo.Advance((m19 & lex.cc42))
1111                        m19 = pablo.Advance((m19 & lex.tag_closing))
1112                        m3 = (((((((((((((((m3 | m5) | m6) | m7) | m8) | m9) | m10) | m11) | m12) | m13) | m14) | m15) | m16) | m17) | m18) | m19)
1113                        while (~m1 & m3):
1114                                        m1 = (m1 | m3)
1115                                        m5 = m3
1116                                        m6 = m3
1117                                        m7 = m3
1118                                        m8 = m3
1119                                        m9 = m3
1120                                        m10 = m3
1121                                        m11 = m3
1122                                        m12 = m3
1123                                        m13 = m3
1124                                        m14 = m3
1125                                        m15 = m3
1126                                        m16 = m3
1127                                        m17 = m3
1128                                        m18 = m3
1129                                        m19 = m3
1130                                        m3 = pablo.Advance((m3 & lex.cc27))
1131                                        m3 = pablo.Advance((m3 & lex.tag_closing))
1132                                        m5 = pablo.Advance((m5 & lex.cc28))
1133                                        m5 = pablo.Advance((m5 & lex.tag_closing))
1134                                        m6 = pablo.Advance((m6 & lex.cc29))
1135                                        m6 = pablo.Advance((m6 & lex.tag_closing))
1136                                        m7 = pablo.Advance((m7 & lex.cc31))
1137                                        m7 = pablo.Advance((m7 & lex.tag_closing))
1138                                        m8 = pablo.Advance((m8 & lex.cc30))
1139                                        m8 = pablo.Advance((m8 & lex.tag_closing))
1140                                        m9 = pablo.Advance((m9 & lex.cc32))
1141                                        m9 = pablo.Advance((m9 & lex.tag_closing))
1142                                        m10 = pablo.Advance((m10 & lex.cc33))
1143                                        m10 = pablo.Advance((m10 & lex.tag_closing))
1144                                        m11 = pablo.Advance((m11 & lex.cc34))
1145                                        m11 = pablo.Advance((m11 & lex.tag_closing))
1146                                        m12 = pablo.Advance((m12 & lex.cc35))
1147                                        m12 = pablo.Advance((m12 & lex.tag_closing))
1148                                        m13 = pablo.Advance((m13 & lex.cc36))
1149                                        m13 = pablo.Advance((m13 & lex.tag_closing))
1150                                        m14 = pablo.Advance((m14 & lex.cc37))
1151                                        m14 = pablo.Advance((m14 & lex.tag_closing))
1152                                        m15 = pablo.Advance((m15 & lex.cc38))
1153                                        m15 = pablo.Advance((m15 & lex.tag_closing))
1154                                        m16 = pablo.Advance((m16 & lex.cc39))
1155                                        m16 = pablo.Advance((m16 & lex.tag_closing))
1156                                        m17 = pablo.Advance((m17 & lex.cc40))
1157                                        m17 = pablo.Advance((m17 & lex.tag_closing))
1158                                        m18 = pablo.Advance((m18 & lex.cc41))
1159                                        m18 = pablo.Advance((m18 & lex.tag_closing))
1160                                        m19 = pablo.Advance((m19 & lex.cc42))
1161                                        m19 = pablo.Advance((m19 & lex.tag_closing))
1162                                        m3 = (((((((((((((((m3 | m5) | m6) | m7) | m8) | m9) | m10) | m11) | m12) | m13) | m14) | m15) | m16) | m17) | m18) | m19)
1163        m0 = pablo.Advance((m0 & lex.tag_closing))
1164        output.matches = m0     
1165       
1166
1167def Validation_35(lex,output): 
1168        m0=0
1169        m0=~0
1170        m0 = pablo.Advance((m0 & lex.cc35))
1171        m0 = pablo.Advance((m0 & lex.tag_closing))
1172        output.matches = m0
1173       
1174def Validation_41(lex,output): 
1175        m0=0
1176        m0=~0
1177        m0 = pablo.Advance((m0 & lex.cc41))
1178        m0 = pablo.Advance((m0 & lex.tag_closing))
1179        output.matches = m0
1180       
1181def Validation_45(lex,output):
1182        m0=0
1183        m1=0
1184        m2=0
1185        m0=~0
1186        m0 = pablo.Advance((m0 & lex.cc45))
1187        m1 = m0
1188        m1 = pablo.Advance((m1 & lex.cc46))
1189        m1 = pablo.Advance((m1 & lex.tag_closing))
1190        m0 = m1
1191        m1 = m0
1192        m1 = pablo.Advance((m1 & lex.cc46))
1193        m1 = pablo.Advance((m1 & lex.tag_closing))
1194        while (~m0 & m1):
1195                        m0 = (m0 | m1)
1196                        m1 = pablo.Advance((m1 & lex.cc46))
1197                        m1 = pablo.Advance((m1 & lex.tag_closing))
1198        m0 = pablo.Advance((m0 & lex.tag_closing))
1199        output.matches = m0
1200       
1201       
1202
1203def Main(basis_bits, lex, u8, xml_char, scope1, ctCDPI_Callouts, ref_Callouts, tag_Callouts, masks, xml_names, check_streams, hash_data):
1204       
1205        # Classify bytes for UTF-8 processing, whitespace and control
1206        # processing and XML lexical analysis.
1207        # Classify_bytes(basis_bits, lex)
1208
1209        # Validate UTF-8 multibyte sequences and determine the UTF-8 scope streams
1210        # Validate_utf8(basis_bits, u8)
1211                               
1212        Classify_bytes_Validate_utf8(basis_bits, lex, u8)
1213
1214        Add_scope_streams(lex, scope1)
1215   
1216        # Parse all comments, CDATA sections and processing instructions.
1217        Parse_CtCDPI(lex, marker, ctCDPI_Callouts, check_streams)
1218               
1219        # All remaining '<' must be tag start characters; parse tags.
1220        Parse_tags(lex, marker, tag_Callouts) 
1221
1222        # All remaining '&' must be reference start characters; parse them.
1223        Parse_refs(lex, marker, ref_Callouts)
1224       
1225        # Validate XML namespaces and generate bit streams to post validate non-ascii range XML names
1226        Validate_xml_names(ctCDPI_Callouts, ref_Callouts, tag_Callouts, lex, u8, check_streams)
1227   
1228        Do_check_streams(marker, tag_Callouts, check_streams)
1229        # These methods are needed to do Paralel Bitstream Based Length Sorting
1230#       Form_Length_Group_Bitstreams(tag_Callouts)
1231
1232#       Compute_Hash_Value_Bitstream(hash_data, basis_bits);
1233       
1234               
Note: See TracBrowser for help on using the repository browser.