Ignore:
Timestamp:
Aug 1, 2010, 1:13:08 PM (9 years ago)
Author:
lindanl
Message:

tag marks matching

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/parabix2/template.c

    r560 r562  
    3333int block_base=0;
    3434int buffer_base=0;
     35int tag_depth=0;
    3536char * source;
    3637
     
    153154        return 0;
    154155}
     156
     157static inline int Tag_match(int pos) {
     158        int block_pos = block_base + pos;
     159        if(source[block_pos]=='/' ){
     160          tag_depth--;
     161          if (tag_depth<0){
     162            fprintf(stderr, "tag matching error at position %i\n",block_pos+buffer_base);
     163            exit(-1);
     164          }       
     165        }
     166        else if(source[block_pos-1]=='/')
     167          tag_depth--;
     168        else
     169          tag_depth++;
     170        return 0;
     171}
     172
    155173
    156174#define s2p_step(s0,s1,hi_mask,shift,p0,p1)  \
     
    245263                             fread(&srcbuf[BUFFER_SIZE-e->content_start], 1, e->content_start, infile);
    246264        }
     265        chars_read -=e->content_start;
    247266  }
    248267 
     
    257276      while (block_pos < chars_read){
    258277
    259         int bytes = chars_read - block_pos;
     278        int bytes = chars_read - block_pos;     
     279        block_base = block_pos;
     280         
    260281        if(bytes < BLOCK_SIZE){
    261282          EOF_mask = sisd_srl(simd_const_1(1),sisd_from_int(BLOCK_SIZE-bytes));
     
    293314       
    294315        if (bitblock_has_bit(simd_or(name_check,name_start_check))) {
    295           block_base = block_pos;
    296316          StreamScan((ScanBlock *) &name_start_check, sizeof(BitBlock)/sizeof(ScanBlock), NameStrt_check);
    297317          StreamScan((ScanBlock *) &name_check, sizeof(BitBlock)/sizeof(ScanBlock), Name_check);
     318        }
     319
     320        if (bitblock_has_bit(tag_marks)) {
     321          StreamScan((ScanBlock *) &tag_marks, sizeof(BitBlock)/sizeof(ScanBlock), Tag_match);
    298322        }
    299323       
     
    303327    else{
    304328      while (block_pos < chars_read){
    305 
     329       
     330        block_base = block_pos;
     331         
    306332        BytePack * U8pack = (BytePack *) &srcbuf[block_pos];
    307333        U8[0] = sisd_load_unaligned(&U8pack[0]);
     
    326352       
    327353        if (bitblock_has_bit(simd_or(name_check,name_start_check))) {
    328           block_base = block_pos;
    329354          StreamScan((ScanBlock *) &name_start_check, sizeof(BitBlock)/sizeof(ScanBlock), NameStrt_check);
    330355          StreamScan((ScanBlock *) &name_check, sizeof(BitBlock)/sizeof(ScanBlock), Name_check);
    331356        }
    332357       
     358        if (bitblock_has_bit(tag_marks)) {
     359          StreamScan((ScanBlock *) &tag_marks, sizeof(BitBlock)/sizeof(ScanBlock), Tag_match);
     360        }
    333361        block_pos += BLOCK_SIZE;
    334362      }
     
    341369    block_pos = 0;
    342370  }
     371  if(tag_depth!=0){
     372    fprintf(stderr, "tag matching error at position %i\n",block_pos+buffer_base);
     373    exit(-1);
     374  }       
     375   
    343376}
    344377
Note: See TracChangeset for help on using the changeset viewer.