Changeset 577


Ignore:
Timestamp:
Aug 14, 2010, 5:00:40 PM (9 years ago)
Author:
lindanl
Message:

Complete PI name checking. Add CDATA checking. Provide 16 extra bytes for buffer ends.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/parabix2/template_tag_match.c

    r567 r577  
    1010#define BUFFER_SIZE 12800   
    1111#define BLOCK_SIZE 128
     12#define OVERLAP_BUFSIZE 16
    1213
    1314typedef long ScanBlock;
     
    160161        return 0;
    161162}
    162 /*
    163 static inline int Tag_match(int pos) {
     163
     164static inline int PIName_check(int pos) {
     165        int block_pos = block_base + pos;         
     166        if (at_XxMmLll<ASCII>((unsigned char*)&source[block_pos]) && (source[block_pos+3]=='?' || source[block_pos+3]<= ' ')) {
     167              fprintf(stderr, "[Xx][Mm][Ll] illegal as PI name at position %i\n",block_pos+buffer_base);
     168              exit(-1);
     169        }
     170        return 0;
     171}
     172
     173static inline int CD_check(int pos) {
    164174        int block_pos = block_base + pos;
    165         if(source[block_pos]=='/' ){
    166           tag_depth--;
    167           if (tag_depth<0){
    168             fprintf(stderr, "tag matching error at position %i\n",block_pos+buffer_base);
    169             exit(-1);
    170           }       
    171         }
    172         else if(source[block_pos]=='>')
    173           tag_depth--;
    174         else
    175           tag_depth++;
     175        if (!at_CDATA1<ASCII>((unsigned char*)&source[block_pos])){
     176              fprintf(stderr, "CDATA error found at position %i\n",block_pos+buffer_base);
     177              exit(-1);
     178        }
    176179        return 0;
    177 }*/
    178 
    179 
     180}
    180181#define s2p_step(s0,s1,hi_mask,shift,p0,p1)  \
    181182{ \
     
    246247  int chars_avail = 0;
    247248  int check_pos = 0;
     249  int chars_read = 0;
    248250  char srcbuf[BUFFER_SIZE+BLOCK_SIZE];
    249251 
     
    252254 
    253255  EOF_mask = simd_const_1(1);
    254   chars_avail = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
     256  chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE + OVERLAP_BUFSIZE, infile);
     257  chars_avail = min(chars_read,BUFFER_SIZE);
    255258 
    256259  tag_matcher t(srcbuf);
     
    263266
    264267  if (e->content_start != 0) {
    265         memmove(&srcbuf[0], &srcbuf[e->content_start], chars_avail - e->content_start);
     268        memmove(&srcbuf[0], &srcbuf[e->content_start], chars_read - e->content_start);
    266269        if (chars_avail == BUFFER_SIZE) {
    267                 chars_avail = BUFFER_SIZE - e->content_start +
    268                              fread(&srcbuf[BUFFER_SIZE-e->content_start], 1, e->content_start, infile);
    269         }
    270         else chars_avail -=e->content_start;
     270                chars_read = chars_read - e->content_start +
     271                             fread(&srcbuf[chars_read-e->content_start], 1, e->content_start, infile);
     272                chars_avail = min(chars_read,BUFFER_SIZE);
     273        }
     274        else {
     275          chars_read -=e->content_start;
     276          chars_avail -=e->content_start;
     277        }
    271278  }
    272279 
    273280  @stream_stmts
    274281
    275   while(chars_avail>0){
     282  while(1){
    276283
    277284    PERF_SEC_START(parser_timer);
     
    324331          StreamScan((ScanBlock *) &name_check, sizeof(BitBlock)/sizeof(ScanBlock), Name_check);
    325332        }
    326            
     333         
     334        if (bitblock_has_bit(PI_namestarts)){
     335          StreamScan((ScanBlock *) &PI_namestarts, sizeof(BitBlock)/sizeof(ScanBlock), PIName_check);
     336        }
     337       
     338        if (bitblock_has_bit(CD_starts)){
     339          StreamScan((ScanBlock *) &CD_starts, sizeof(BitBlock)/sizeof(ScanBlock), CD_check);
     340        }
     341       
    327342        t.store_streams(tag_marks, ElemNameFollows);
    328343       
     
    360375          StreamScan((ScanBlock *) &name_check, sizeof(BitBlock)/sizeof(ScanBlock), Name_check);
    361376        }
    362            
     377       
     378        if (bitblock_has_bit(PI_namestarts)){
     379          StreamScan((ScanBlock *) &PI_namestarts, sizeof(BitBlock)/sizeof(ScanBlock), PIName_check);
     380        }
     381       
     382        if (bitblock_has_bit(CD_starts)){
     383          StreamScan((ScanBlock *) &CD_starts, sizeof(BitBlock)/sizeof(ScanBlock), CD_check);
     384        }
     385       
    363386        t.store_streams(tag_marks, ElemNameFollows);
    364387
     
    374397    buf_pos += chars_avail;
    375398    buffer_base = buf_pos;
    376     chars_avail = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
    377     buffer_last = buffer_base + chars_avail;
    378 
    379    
    380    
     399    if(chars_avail!=chars_read){
     400      int bytes_left = chars_read-chars_avail;
     401      memmove(srcbuf, &srcbuf[BUFFER_SIZE], bytes_left);
     402      chars_read = fread(&srcbuf[bytes_left],1, BUFFER_SIZE , infile)+bytes_left;
     403      chars_avail = min(chars_read,BUFFER_SIZE);
     404    }
     405    else
     406      break;   
    381407  }
    382408  if(t.depth!=0){
    383     fprintf(stderr, "tag matching error (depth %i) at position %i\n", t.depth, buffer_last);
     409    fprintf(stderr, "tag matching error (depth %i) at position %i\n", t.depth, buffer_base);
    384410    exit(-1);
    385411  }       
Note: See TracChangeset for help on using the changeset viewer.