Changeset 7 for trunk/src/engine.c


Ignore:
Timestamp:
Dec 22, 2007, 11:08:10 AM (11 years ago)
Author:
cameron
Message:

Reference extraction; checking ]]> in text; < in atts.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r6 r7  
    4141  BitBlock sentinel_value = bitblock_sfli(simd_const_1(1), 8*sizeof(unsigned long));
    4242#endif
    43   for (int j = LAngle; j < LexicalItemCount; j++) {
     43  for (int j = MarkupStart; j < LexicalItemCount; j++) {
    4444    buf.item_stream[j][BUFFER_BLOCKS] = sentinel_value;
    4545  }
     
    221221   character. */
    222222inline bool ParsingEngine::at_ElementTag_Start() const {
    223   assert(*(x8dataPtr(0)) == '<');
    224   return (*(x8dataPtr(1)) & 0xE1) != 0x21;
    225 }
    226 
    227 
    228 
    229 
    230 inline void ParsingEngine::Parse_Text () {
    231         int text_start;
    232         int text_lgth;
    233         if (!AtChar('<')) {
    234                 text_start = AbsPos();
    235 /*
    236                 ScanTo(NonWS);
    237                 non_WS_start = AbsPos(); */
    238                 ScanTo(LAngle);
    239                 /*if (text_lgth > 0) {*/
    240                 Text_action(text_start, AbsPos());
    241         }
     223 
     224  return (*(x8dataPtr(0)) == '<') &
     225         ((*(x8dataPtr(1)) & 0xE1) != 0x21);
    242226}
    243227
     
    314298}
    315299
     300inline void ParsingEngine::Parse_Reference () {
     301        int markup_start = AbsPos();
     302        /* Advance(1);  // skip "&" */
     303        ScanTo(NameFollow);  /* Name delimiter */
     304        if (!AtChar(';')) {
     305                Error_action(markup_start, AbsPos());
     306        }
     307        else {
     308                Advance(1);
     309                Reference_action(markup_start, AbsPos());
     310        }
     311}
     312
    316313inline void ParsingEngine::Parse_PI () {
    317314        int markup_start = AbsPos();
     
    335332        int att_val_start;
    336333        int att_name_end, att_val_end;
     334        lexical_item Quote_stream;
    337335        ScanTo(NameFollow);  /* Name delimiter: WS, "/" or ">" */
    338336        ElementName_action(markup_start+1, AbsPos());
     
    365363                                Advance(2);
    366364                                att_val_start = AbsPos();
    367                                 ScanTo(DQuote);
     365                                Quote_stream = DQuote;
    368366                        }
    369367                        else if (at_EqualsSQuote()) {
    370368                                Advance(2);
    371369                                att_val_start = AbsPos();
    372                                 ScanTo(SQuote);
     370                                Quote_stream = SQuote;
    373371                        }
    374372                        else {
     
    382380                                if (AtChar('"')) {
    383381                                        Advance(1);
    384                                         ScanTo(DQuote);
     382                                        Quote_stream = DQuote;
    385383                                }
    386384                                else if (AtChar('\'')) {
    387385                                        Advance(1);
    388                                         ScanTo(SQuote);
     386                                        Quote_stream = SQuote;
    389387                                }
    390388                                else {
     
    393391                                }
    394392                        }
    395                         /* ScanTo(DQuote) or ScanTo(SQuote) complete. */
     393                        ScanTo(Quote_stream);
     394                        while (AtChar('&')) {
     395                                Parse_Reference();
     396                                ScanTo(Quote_stream);
     397                        }
     398                        if (AtChar('<')) {
     399                                Error_action(markup_start, AbsPos());
     400                                break;
     401                        }
    396402                        att_val_end = AbsPos();
    397403                        Advance(1);
     
    438444inline void ParsingEngine::ParseContent () {
    439445
    440        
    441         while (!at_EOF()) {
    442                 Parse_Text();
    443                 if (!at_EOF()) {
     446        int text_start = AbsPos();
     447        do {
     448                ScanTo(MarkupStart); /* '<', '&', or ']' for ']]>' test */
     449/*              if (AtChar('<')) {
     450                        if (AbsPos() > text_start) Text_action(text_start, AbsPos());
    444451                        Parse_Markup();
    445                 }
    446         }
    447         if (BufferRelPos() > rel_EOF_pos) {
    448                 printf("Incomplete markup item at end of file.\n");
    449         }
     452                }*/
     453                int markup_start = AbsPos();
     454                if (at_ElementTag_Start()) {
     455                        Parse_StartTag();
     456                }
     457                else if (at_EndTag_Start()) {
     458                        Parse_EndTag();
     459                }
     460                else if (at_Comment_Start()) {
     461                        Parse_Comment();
     462                }
     463                else if (AtChar('&')) {
     464                        if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     465                        Parse_Reference();
     466                }
     467                else if (at_CDATA_Start()) {
     468                        Parse_CDATA();
     469                }
     470                else if (at_PI_Start()) {
     471                        Parse_PI();
     472                }
     473                else if (at_CDATA_End()) {
     474                        if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     475                        Advance(3);
     476                        Error_action(AbsPos()-3, AbsPos());
     477                }
     478                else if (at_EOF()) {
     479                        if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     480                        break;
     481                }
     482                else {
     483                        Advance(1);
     484                        continue;
     485                }
     486                text_start = AbsPos();
     487        } while (1);
    450488#ifdef BUFFER_PROFILING
    451489        printf("Bit stream computation.\n");
Note: See TracChangeset for help on using the changeset viewer.