Changeset 66 for trunk/src/engine.c


Ignore:
Timestamp:
Mar 19, 2008, 11:54:19 AM (11 years ago)
Author:
lindanl
Message:

text_or_markup_start field for parsing engine

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r62 r66  
    205205template <CodeUnit_Base C>
    206206inline void ParsingEngine<C>::Parse_Markup() {
    207         int markup_start = AbsPos();
     207        text_or_markup_start = AbsPos();
    208208        if (at_ElementTag_Start<C>(cur())) {
    209209                Parse_StartTag();
     
    223223        else {
    224224                Advance(1);
    225                 Error_action(markup_start, AbsPos());
     225                Error_action(text_or_markup_start, AbsPos());
    226226        }
    227227}
     
    230230template <CodeUnit_Base C>
    231231inline void ParsingEngine<C>::Parse_Comment() {
    232         int markup_start = AbsPos();
     232
    233233        Advance(4); /* Skip "<!--". */
    234234        ScanTo(Hyphen);
     
    239239        if (at_Comment_End<C>(cur())) {
    240240                Advance(3); /* Skip "-->". */
    241                 Comment_action(markup_start, AbsPos());
     241                Comment_action(text_or_markup_start, AbsPos());
    242242        }
    243243        else {
    244244                Advance(2);  /* "--" */
    245                 Error_action(markup_start, AbsPos());
     245                Error_action(text_or_markup_start, AbsPos());
    246246        }
    247247}
     
    250250template <CodeUnit_Base C>
    251251inline void ParsingEngine<C>::Parse_EndTag() {
    252         int markup_start = AbsPos();
     252
    253253#ifndef OMIT_ADVANCE_PRIOR_TO_EXCLUSIVE_SCAN
    254254        Advance(2); /* Skip "</". */
     
    257257        if (AtChar<C,'>'>(cur())) {
    258258                Advance(1);
    259                 EndTag_action(markup_start, AbsPos());
     259                EndTag_action(text_or_markup_start, AbsPos());
    260260        }
    261261        else {
     
    263263                if (AtChar<C,'>'>(cur())) {
    264264                        Advance(1);
    265                         EndTag_action(markup_start, AbsPos());
    266                 }
    267                 else Error_action(markup_start, AbsPos());
     265                        EndTag_action(text_or_markup_start, AbsPos());
     266                }
     267                else Error_action(text_or_markup_start, AbsPos());
    268268        }
    269269}
     
    272272template <CodeUnit_Base C>
    273273inline void ParsingEngine<C>::Parse_CDATA() {
    274         int markup_start = AbsPos();
     274
    275275        Advance(8); /* Skip "<![CDATA". */
    276276        if (!AtChar<C,'['>(cur())) {
    277                 Error_action(markup_start, AbsPos());
     277                Error_action(text_or_markup_start, AbsPos());
    278278        }
    279279        else {
     
    284284                }
    285285                Advance(3); /* Skip "]]>". */
    286                 CDATA_action(markup_start, AbsPos());
     286                CDATA_action(text_or_markup_start, AbsPos());
    287287        }
    288288}
     
    290290template <CodeUnit_Base C>
    291291inline void ParsingEngine<C>::Parse_Reference() {
    292         int markup_start = AbsPos();
     292
    293293        /* Advance(1);  // skip "&" */
    294294        ScanTo(NameFollow);  /* Name delimiter */
    295295        if (!AtChar<C,';'>(cur())) {
    296                 Error_action(markup_start, AbsPos());
     296                Error_action(text_or_markup_start, AbsPos());
    297297        }
    298298        else {
    299299                Advance(1);
    300                 Reference_action(markup_start, AbsPos());
     300                Reference_action(text_or_markup_start, AbsPos());
    301301        }
    302302}
     
    304304template <CodeUnit_Base C>
    305305inline void ParsingEngine<C>::Parse_PI (){
    306         int markup_start = AbsPos();
     306
    307307        Advance(2); /* Skip "<?". */
    308308        int target_start = AbsPos();
     
    310310        if (at_XxMmLll_WS<C>(cur())) {
    311311                Advance(4);
    312                 Error_action(markup_start, AbsPos());
     312                Error_action(text_or_markup_start, AbsPos());
    313313                return;
    314314        }
     
    321321        }
    322322        Advance(2); /* Skip "?>". */
    323         PI_action(markup_start, AbsPos());
     323        PI_action(text_or_markup_start, AbsPos());
    324324}
    325325 
     
    327327template <CodeUnit_Base C>
    328328inline void ParsingEngine<C>::Parse_StartTag (){
    329         int markup_start = AbsPos();
     329
    330330        int att_name_start;
    331331        int att_val_start;
     
    333333        unsigned char quoteCh;
    334334        ScanTo(NameFollow);  /* Name delimiter: WS, "/" or ">" */
    335         ElementName_action(markup_start+1, AbsPos());
     335        ElementName_action(text_or_markup_start+1, AbsPos());
    336336        /* The following test optimizes the most common case of a
    337337        start tag with no attributes.  */
    338338        if (AtChar<C,'>'>(cur())) {
    339339                Advance(1);
    340                 StartTag_action(markup_start, AbsPos());
     340                StartTag_action(text_or_markup_start, AbsPos());
    341341        }
    342342        else {
     
    344344                if (AtChar<C,'>'>(cur())) {
    345345                        Advance(1);
    346                         StartTag_action(markup_start, AbsPos());
     346                        StartTag_action(text_or_markup_start, AbsPos());
    347347                }
    348348                else if (at_EmptyElementDelim<C>(cur())) {
    349349                        Advance(2);
    350                         EmptyElement_action(markup_start, AbsPos());
     350                        EmptyElement_action(text_or_markup_start, AbsPos());
    351351                }
    352352                else do {
     
    366366                                ScanTo(NonWS);
    367367                                if (!AtChar<C,'='>(cur())) {
    368                                         Error_action(markup_start, AbsPos());
     368                                        Error_action(text_or_markup_start, AbsPos());
    369369                                        break;
    370370                                }
     
    372372                                quoteCh = cur()[0];
    373373                                if (!AtQuote<C>(cur())) {
    374                                         Error_action(markup_start, AbsPos());
     374                                        Error_action(text_or_markup_start, AbsPos());
    375375                                        break;
    376376                                }
     
    388388                                }
    389389                                else /* if (AtChar<C,'<'>(cur())) */{
    390                                         Error_action(markup_start, AbsPos());
     390                                        Error_action(text_or_markup_start, AbsPos());
    391391                                        break;
    392392                                }
     
    405405                        if (AtChar<C,'>'>(cur())) {
    406406                                Advance(1);
    407                                 StartTag_action(markup_start, AbsPos());
     407                                StartTag_action(text_or_markup_start, AbsPos());
    408408                                break;
    409409                        }
    410410                        else if (at_EmptyElementDelim<C>(cur())) {
    411411                                Advance(2);
    412                                 EmptyElement_action(markup_start, AbsPos());
     412                                EmptyElement_action(text_or_markup_start, AbsPos());
    413413                                break;
    414414                        }
     
    416416                        if (AtChar<C,'>'>(cur())) {
    417417                                Advance(1);
    418                                 StartTag_action(markup_start, AbsPos());
     418                                StartTag_action(text_or_markup_start, AbsPos());
    419419                                break;
    420420                        }
    421421                        else if (at_EmptyElementDelim<C>(cur())) {
    422422                                Advance(2);
    423                                 EmptyElement_action(markup_start, AbsPos());
     423                                EmptyElement_action(text_or_markup_start, AbsPos());
    424424                                break;
    425425                        }
    426426                        else if (AbsPos() == att_val_end + 1) {
    427427                                /* No WS following att value */
    428                                 Error_action(markup_start, AbsPos());
     428                                Error_action(text_or_markup_start, AbsPos());
    429429                                break;
    430430                        }
     
    434434
    435435template <CodeUnit_Base C>
     436inline void ParsingEngine<C>::text_if_nonnull_action(){
     437        if (AbsPos() > text_or_markup_start) {
     438                Text_action(text_or_markup_start, AbsPos());
     439                text_or_markup_start = AbsPos();
     440        }
     441}
     442
     443template <CodeUnit_Base C>
    436444inline void ParsingEngine<C>::ParseContent() {
    437445
    438         int text_start = AbsPos();
     446        text_or_markup_start = AbsPos();
    439447        DocumentStart_action();
    440448        do {
    441449                ScanTo(MarkupStart); /* '<', '&', or ']' for ']]>' test */
    442450/*              if (AtChar<C,'<'>(cur())) {
    443                         if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     451                        text_if_nonnull_action();
    444452                        Parse_Markup<C>();
    445453                }*/
    446                 int markup_start = AbsPos();
    447454                if (at_ElementTag_Start<C>(cur())) {
    448                         if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     455                        text_if_nonnull_action();
    449456                        Parse_StartTag();
    450457                }
    451458                else if (at_EndTag_Start<C>(cur())) {
    452                         if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     459                        text_if_nonnull_action();
    453460                        Parse_EndTag();
    454461                }
    455462                else if (at_Comment_Start<C>(cur())) {
    456                         if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     463                        text_if_nonnull_action();
    457464                        Parse_Comment();
    458465                }
    459466                else if (AtChar<C,'&'>(cur())) {
    460                         if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     467                        text_if_nonnull_action();
    461468                        Parse_Reference();
    462469                }
    463470                else if (at_CDATA_Start<C>(cur())) {
    464                         if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     471                        text_if_nonnull_action();
    465472                        Parse_CDATA();
    466473                }
    467474                else if (at_PI_Start<C>(cur())) {
    468                         if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     475                        text_if_nonnull_action();
    469476                        Parse_PI();
    470477                }
    471478                else if (at_CDATA_End<C>(cur())) {
    472                         if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     479                        text_if_nonnull_action();
    473480                        Advance(3);
    474481                        Error_action(AbsPos()-3, AbsPos());
    475482                }
    476483                else if (at_EOF()) {
    477                         if (AbsPos() > text_start) Text_action(text_start, AbsPos());
     484                        text_if_nonnull_action();
    478485                        break;
    479486                }
     
    482489                        continue;
    483490                }
    484                 text_start = AbsPos();
     491                text_or_markup_start = AbsPos();
    485492        } while (1);
    486493        DocumentEnd_action();   
Note: See TracChangeset for help on using the changeset viewer.