Changeset 599 for proto


Ignore:
Timestamp:
Sep 2, 2010, 2:14:57 PM (9 years ago)
Author:
lindanl
Message:

fixed bug at buffer boundary

Location:
proto/parabix2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • proto/parabix2/src/tag_matcher.cpp

    r595 r599  
    3232  struct attribute InAtt;
    3333  int att_index;
     34  int InFinalEndTag;
    3435   
    3536  tag_matcher(char * src);
    3637  ~tag_matcher(); 
    3738  int StreamScan(int chars_avail);
    38   void store_streams(SIMD_type tagMark, SIMD_type NameFollow, SIMD_type miscMarks);
     39  void store_streams(SIMD_type tagMark, SIMD_type NameFollow, SIMD_type miscMarks, int chars_avail);
    3940  int tag_match(int pos, int chars_avail);
    4041  void Advance_buffer();
     
    99100         
    100101          if (depth == 0){
    101             while(srcbuf[pos]!='>')
     102            while(srcbuf[pos]!='>'){
    102103              pos++;
     104              if(pos>=chars_avail){
     105                InFinalEndTag = 1;
     106                return 0;
     107              }
     108            }
    103109            pos = bitstream_scan(miscMarks,pos+1);
    104110            if(pos!=chars_avail){
     
    116122              pos++;
    117123            pos = bitstream_scan(miscMarks,pos+1);
     124           
    118125            if(pos!=chars_avail){
    119126              fprintf(stderr,"illegal content after root element at position = %i\n",buf_base+pos);
     
    192199}
    193200
    194 void tag_matcher::store_streams(SIMD_type tagMark, SIMD_type NameFollow, SIMD_type miscMark){
     201void tag_matcher::store_streams(SIMD_type tagMark, SIMD_type NameFollow, SIMD_type miscMark, int chars_avail){
    195202  tagMarks[stream_index] = tagMark;
    196203  miscMarks[stream_index] = ~miscMark;
     
    198205  stream_index++; 
    199206  if(stream_index==1){
     207   
     208    if (InFinalEndTag == 1){
     209      int pos = -1;
     210      while(srcbuf[pos]!='>'){
     211        pos++;
     212        if(pos>=chars_avail){
     213          InFinalEndTag = 1;
     214          return;
     215        }
     216      }
     217      pos = bitstream_scan(miscMarks,pos+1);
     218      if(pos!=chars_avail){
     219        fprintf(stderr,"illegal content after root element at position = %i\n",buf_base+pos);
     220        exit(-1);       
     221      }   
     222    }
     223   
    200224    if(state == InStartTag) {
    201225      state = Clear;
    202226      int remain_lgth = bitstream_scan(NameFollows,0);
    203227      memcpy(&tags_buf[tags_buf_cur],srcbuf,remain_lgth);
    204 //       tags_buf_cur += remain_lgth;
    205228      tag_lgth_stack[depth] += remain_lgth;
    206229      depth++;
     
    211234      if (does_match(tag_stack[depth]+inTagPos,srcbuf,lgth-inTagPos) && ((srcbuf[lgth] == '>') ||(srcbuf[lgth] <= ' '))) return ;       
    212235      else {
    213          cout << "inTagPos = " << inTagPos << endl;
    214               cout << "end tag is " << string(srcbuf,lgth-inTagPos) << endl ;
    215               cout << "start tag is   " << string(tag_stack[depth]+inTagPos,lgth-inTagPos) << endl ;
    216               cout << "start tag[-1] is " << string(tag_stack[depth-1],tag_lgth_stack[depth-1]) << endl ;
    217236          fprintf(stderr,"tag name mismatch at position = %i\n",buf_base);
    218237          exit(-1);
    219       }      
     238      }
    220239    }
    221240    else if (state == InAttName) {
     
    228247              exit(-1);
    229248      }
    230     }
     249    }   
    231250  } 
    232251}
     
    239258  state = Clear;
    240259  mode = StartOfFile;
     260  InFinalEndTag = 0;
    241261  NameFollows[BUFFER_SIZE/BLOCK_SIZE]=simd_const_1(1);  //sentinel
    242262}
  • proto/parabix2/template.c

    r597 r599  
    449449        }
    450450
    451         t.store_streams(tag_marks, NameFollows, Misc_mask);
     451        t.store_streams(tag_marks, NameFollows, Misc_mask, chars_avail);
    452452       
    453453        block_pos += BLOCK_SIZE;
     
    509509        }
    510510       
    511         t.store_streams(tag_marks, NameFollows, Misc_mask);
     511        t.store_streams(tag_marks, NameFollows, Misc_mask, chars_avail);
    512512
    513513        block_pos += BLOCK_SIZE;
Note: See TracChangeset for help on using the changeset viewer.