Changeset 591 for proto/parabix2


Ignore:
Timestamp:
Aug 21, 2010, 10:38:41 AM (9 years ago)
Author:
lindanl
Message:

check if the document matches the document production

Location:
proto/parabix2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • proto/parabix2/parabix2_compilable.py

    r588 r591  
    230230                CD_Ct_Cursor = bitutil.Advance(CtCDPI_Cursor & ~PI_Cursor)
    231231                CD_Cursor = CD_Ct_Cursor & lex.LBracket
    232                 Ct_Cursor = bitutil.Advance(CD_Ct_Cursor & lex.Hyphen) 
     232                #Ct_Cursor = bitutil.Advance(CD_Ct_Cursor & lex.Hyphen)
     233                Ct_Cursor = CD_Ct_Cursor & lex.Hyphen
    233234                PI_starts |= PI_Cursor
    234235                CD_starts |= CD_Cursor
    235236                Ct_starts |= Ct_Cursor
     237                Ct_Cursor = bitutil.Advance(Ct_Cursor) 
     238                Ct_errors |= Ct_Cursor & ~ lex.Hyphen
    236239                Ct_Cursor = bitutil.Advance(Ct_Cursor)
    237240                Ct_end_scan |= Ct_Cursor
     
    253256       
    254257                CT_callouts.CtCDPI_mask = bitutil.Advance(CD_ends | Ct_ends | PI_ends) - CtCDPI_starts
    255                 CT_callouts.error = Ct_ends & ~lex.RAngle | Ct_starts & ~ lex.Hyphen
     258                #CT_callouts.error = Ct_ends & ~lex.RAngle | Ct_starts & ~ lex.Hyphen
     259                CT_callouts.error = Ct_errors | Ct_ends & ~lex.RAngle
    256260                CT_callouts.error |= bitutil.Advance(PI_name_ends & ~ lex.WS) & ~ lex.PI_end
    257261                CT_callouts.error |= PI_namestarts & PI_name_ends
    258262                # If any of the Comment, CDATA or PI markups are unterminated, it is an error.
    259                 CT_callouts.error |= CT_callouts.CtCDPI_mask &~ EOF_mask               
     263                CT_callouts.error |= CT_callouts.CtCDPI_mask &~ EOF_mask
     264               
     265        Misc_mask = (lex.WS | lex.LAngle | (bitutil.Advance(Ct_ends | PI_ends) - (Ct_starts | PI_starts)) | CtCDPI_starts) & EOF_mask
    260266        # End of loop: no remaining CtCDPI_Cursor
    261267       
     
    410416        NameFollows = ElemNameFollows | AttNameFollows
    411417        AttRef = callouts.AttVals & Ref2
    412         return (CT_callouts, callouts, refs, error, lex, EOF_mask, name_check, name_start_check, control, tag_marks, NameFollows, CD_starts, GenRef2, DecRef3, HexRef4, AttRef)
    413 
    414        
     418        return (CT_callouts, callouts, refs, error, lex, EOF_mask, name_check, name_start_check, control, tag_marks, NameFollows, CD_starts, GenRef2, DecRef3, HexRef4, AttRef, Misc_mask)
     419
     420       
  • proto/parabix2/src/tag_matcher.cpp

    r582 r591  
    1515  public:
    1616  SIMD_type tagMarks[BUFFER_SIZE/BLOCK_SIZE];
     17  SIMD_type miscMarks[BUFFER_SIZE/BLOCK_SIZE];
    1718  char tags_buf[BUFFER_SIZE];
    1819  int tags_buf_cur;
     
    2728  int buf_base;
    2829  enum TagMatchState {InStartTag, InEndTag, InAttName, Clear} state;
     30  enum TagMatchMode {StartOfFile, InFile} mode;
    2931  struct attribute Attr[MAX_ATTS];
    3032  struct attribute InAtt;
     
    3436  ~tag_matcher(); 
    3537  int StreamScan(int chars_avail);
    36   void store_streams(SIMD_type tagMark, SIMD_type NameFollow);
    37   int tag_match(int pos);
     38  void store_streams(SIMD_type tagMark, SIMD_type NameFollow, SIMD_type miscMarks);
     39  int tag_match(int pos, int chars_avail);
    3840  void Advance_buffer();
    3941  int does_match(char * s1, char * s2, int lgth);
     
    7274
    7375
    74 int tag_matcher:: tag_match(int pos) {
     76int tag_matcher:: tag_match(int pos, int chars_avail) {
     77        int rt_val=0;
    7578//      end tag
    7679        if(srcbuf[pos]=='/' ){
     
    8184          int lgth = tag_lgth_stack[depth];
    8285
    83           if (does_match(tag_stack[depth],&srcbuf[pos],lgth) && ((srcbuf[pos+lgth] == '>') ||(srcbuf[pos+lgth] <= ' '))) return 0;
     86          if (does_match(tag_stack[depth],&srcbuf[pos],lgth) && ((srcbuf[pos+lgth] == '>') ||(srcbuf[pos+lgth] <= ' '))) rt_val=0;
    8487          else if (pos + lgth >= BUFFER_SIZE + OVERLAP_BUFSIZE) {
    8588            state = InEndTag;
    8689            inTagPos = BUFFER_SIZE - pos;
     90            rt_val=0;
    8791          }
    8892          else {
     
    9397              exit(-1);
    9498          }
     99         
     100          if (depth == 0){
     101            while(srcbuf[pos]!='>')
     102              pos++;
     103            pos = bitstream_scan(miscMarks,pos+1);
     104            if(pos!=chars_avail)
     105              fprintf(stderr,"illegal content after root element at position = %i\n",buf_base+pos);
     106            exit(-1);       
     107          }
     108          return rt_val;
    95109        }
    96110//      empty tag
    97111        else if(srcbuf[pos]=='>'){
    98112          depth--;
     113          if (depth == 0){
     114            while(srcbuf[pos]!='>')
     115              pos++;
     116            pos = bitstream_scan(miscMarks,pos+1);
     117            if(pos!=chars_avail)
     118              fprintf(stderr,"illegal content after root element at position = %i\n",buf_base+pos);
     119            exit(-1);       
     120          }
    99121        }
    100122//      start tag
     
    143165        int block_pos = 0;
    144166       
     167        if(mode == StartOfFile){
     168          int pos = bitstream_scan(miscMarks,0);
     169          if (pos==chars_avail){
     170            fprintf(stderr,"no element at position =%i.\n",buf_base+pos);
     171            exit(-1);
     172          }
     173          if(srcbuf[pos-1]!='<'|| srcbuf[pos]=='!'||srcbuf[pos]=='/'){
     174            fprintf(stderr,"illegal content before root element at position =%i.\n",buf_base+pos);
     175            exit(-1);
     176          }
     177          mode = InFile;
     178        }
    145179        for (blk = 0; blk < blk_counts; blk++) {
    146180                ScanBlock s = ((ScanBlock*)tagMarks)[blk];
    147181                while(s) {
    148                         int code = (tag_match(cfzl(s) + block_pos));
     182                        int code = tag_match(cfzl(s) + block_pos, chars_avail);
    149183                        if (code) return code;
    150184                        s = s & (s-1);  // clear rightmost bit.
     
    156190}
    157191
    158 void tag_matcher::store_streams(SIMD_type tagMark, SIMD_type NameFollow){
     192void tag_matcher::store_streams(SIMD_type tagMark, SIMD_type NameFollow, SIMD_type miscMark){
    159193  tagMarks[stream_index] = tagMark;
     194  miscMarks[stream_index] = ~miscMark;
    160195  NameFollows[stream_index] = NameFollow;
    161196  stream_index++; 
     
    197232  buf_base = 0;
    198233  state = Clear;
     234  mode = StartOfFile;
    199235  NameFollows[BUFFER_SIZE/BLOCK_SIZE]=simd_const_1(1);  //sentinel
    200236}
  • proto/parabix2/template.c

    r590 r591  
    352352  XML_Decl_Parser<ASCII> decl_parser((unsigned char *)srcbuf);
    353353
    354   decl_parser.ReadXMLInfo(*e);
     354  decl_parser.ReadXMLInfo(*e); 
    355355
    356356  if (e->content_start != 0) {
     
    377377    if(chars_avail < BUFFER_SIZE){
    378378     
    379       while (block_pos < chars_avail){
     379      while (block_pos <= chars_avail){
    380380
    381381        int bytes = chars_avail - block_pos;   
     
    444444          StreamScan((ScanBlock *) &AttRef, sizeof(BitBlock)/sizeof(ScanBlock), AttRef_check);
    445445        }
    446        
    447         t.store_streams(tag_marks, NameFollows);
     446
     447        t.store_streams(tag_marks, NameFollows, Misc_mask);
    448448       
    449449        block_pos += BLOCK_SIZE;
     
    505505        }
    506506       
    507         t.store_streams(tag_marks, NameFollows);
     507        t.store_streams(tag_marks, NameFollows, Misc_mask);
    508508
    509509        block_pos += BLOCK_SIZE;
Note: See TracChangeset for help on using the changeset viewer.