Changeset 98 for trunk/src/engine.c


Ignore:
Timestamp:
Apr 13, 2008, 8:18:17 PM (11 years ago)
Author:
cameron
Message:

Separate CharRef/EntityRef? routines

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r97 r98  
    9494        else
    9595                content_start = decl_parser->ReadXMLInfo(model_info);
    96 
    97     bitplex = new Bitplex;
     96       
     97        bitplex = new Bitplex;
    9898        buf = (LexicalStreamSet *) simd_new(sizeof(LexicalStreamSet)/PACKSIZE);
    9999
     
    269269       
    270270
    271 
    272 
    273 
    274 /* Parse a markup item beginning '<' */
    275 template <CodeUnit_Base C>
    276 inline void ParsingEngine<C>::Parse_Markup() {
    277         text_or_markup_start = AbsPos();
    278         if (at_ElementTag_Start<C>(cur())) {
    279                 Parse_StartTag();
    280         }
    281         else if (at_EndTag_Start<C>(cur())) {
    282                 Parse_EndTag();
    283         }
    284         else if (at_Comment_Start<C>(cur())) {
    285                 Parse_Comment();
    286         }
    287         else if (at_CDATA_Start<C>(cur())) {
    288                 Parse_CDATA();
    289         }
    290         else if (at_PI_Start<C>(cur())) {
    291                 Parse_PI();
    292         }
    293         else {
    294                 Advance(1);
    295                 Syntax_Error(NT_content);
    296         }
    297 }
    298 
    299271/* Parse a comment beginning "<!--" */
    300272template <CodeUnit_Base C>
     
    359331
    360332template <CodeUnit_Base C>
    361 inline void ParsingEngine<C>::Parse_Reference() {
     333inline void ParsingEngine<C>::Parse_EntityRef() {
    362334        Advance(1);  // skip "&"
     335        ScanTo(NameFollow);  /* Name delimiter */
     336        if (!AtChar<C,';'>(cur())) {
     337                Syntax_Error(NT_Reference);
     338        }
     339        else {
     340                Advance(1);
     341                Reference_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     342        }
     343}
     344
     345template <CodeUnit_Base C>
     346inline void ParsingEngine<C>::Parse_CharRef() {
     347        Advance(2);  // skip "&#"
    363348        ScanTo(NameFollow);  /* Name delimiter */
    364349        if (!AtChar<C,';'>(cur())) {
     
    438423                        In many cases, the very first test handles 100% of actual
    439424                        attribute-value pairs encountered. */
    440                         if (at_EqualsQuote<C>(cur())) {
    441                                 quoteCh = cur()[1];
    442                                 Advance(2);
    443                         }
     425                        if (at_EqualsQuote<C>(cur())) Advance(1);
    444426                        else {
    445427                                ScanTo(NonWS);
     
    449431                                }
    450432                                ScanTo(NonWS);
    451                                 quoteCh = cur()[0];
    452433                                if (!AtQuote<C>(cur())) {
    453434                                        Syntax_Error(NT_STag);
    454435                                        break;
    455436                                }
    456                                 Advance(1);
    457                         }
    458                         att_val_start = AbsPos();
    459                         ScanTo(Quote);
    460                         while (cur()[0] != quoteCh) {
    461                                 if (AtChar<C,'&'>(cur())) {
    462                                         Parse_Reference();
    463                                         ScanTo(Quote);
    464                                 }
    465                                 else if (AtQuote<C>(cur())) {
    466                                         Advance(1);
    467                                 }
    468                                 else /* if (AtChar<C,'<'>(cur())) */{
    469                                         WF_Error(wfErr_CleanAttrVals);
    470                                         break;
    471                                 }
    472                         }
    473                         att_val_end = AbsPos();
    474                         Advance(1);
     437                        }
     438                        att_val_start = AbsPos()+1;
     439                        Parse_AttValue();
     440                        att_val_end = AbsPos()-1;
    475441                        if (at_xmlns<C>(cur()+att_name_start-AbsPos())) {
    476442                                Namespace_action(GetCodeUnitPtr(att_name_start), att_name_end - att_name_start,
     
    542508                        Parse_Comment();
    543509                }
     510                else if (at_CharRef_Start<C>(cur())) {
     511                        text_if_nonnull_action();
     512                        Parse_CharRef();
     513                }
    544514                else if (AtChar<C,'&'>(cur())) {
    545515                        text_if_nonnull_action();
    546                         Parse_Reference();
     516                        Parse_EntityRef();
    547517                }
    548518                else if (at_CDATA_Start<C>(cur())) {
     
    967937        ScanTo(NonWS);
    968938       
    969     int name_start = AbsPos();
     939        int     name_start = AbsPos();
    970940        ScanTo(NameFollow);
    971941        int     lgth = AbsPos()-name_start;
     
    10671037                requireWS();
    10681038                if(at_SYSTEM<C>(cur())||at_PUBLIC<C>(cur())){
    1069                 Parse_ExternalID();            
     1039                Parse_ExternalID();     
    10701040        }
    10711041        else if(AtQuote<C>(cur())){
     
    11891159        ScanTo(Quote);                 
    11901160        while (cur()[0] != quoteCh){
    1191                 if (AtChar<C,'&'>(cur())){
    1192                         Parse_Reference();
     1161                if (at_CharRef_Start<C>(cur())){
     1162                        Parse_CharRef();
     1163                        ScanTo(Quote);
     1164                }
     1165                else if (AtChar<C,'&'>(cur())){
     1166                        Parse_EntityRef();
    11931167                        ScanTo(Quote);
    11941168                }
     
    12281202        }
    12291203        Prolog_action(GetCodeUnitPtr(old_pos), LengthFrom(old_pos));
     1204}
     1205
     1206template <CodeUnit_Base C>
     1207inline void ParsingEngine<C>::ExtSubsetDecl_action(unsigned char * item, int lgth) {
    12301208}
    12311209
Note: See TracChangeset for help on using the changeset viewer.