Changeset 98


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

Separate CharRef/EntityRef? routines

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/markup_stats.cxx

    r92 r98  
    325325        for (int run = 0; run < REPEAT_RUNS; run++) {
    326326       
    327         parser = Parser_Interface::ParserFactory(filename);
     327        parser = Parser_Interface::ParserFactory(filename, false);
    328328       
    329329       
  • trunk/src/bytelex.h

    r97 r98  
    8686
    8787template<CodeUnit_Base C>
     88inline bool at_CharRef_Start(unsigned char x8data[]) {
     89  return s2int16(x8data) == c2int16<C, '&', '#'>::value;
     90}
     91
     92
     93template<CodeUnit_Base C>
    8894inline bool at_EqualsQuote(unsigned char x8data[]) {
    8995  uint16_t EQ = s2int16(x8data);
  • 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
  • trunk/src/engine.h

    r97 r98  
    8383        void Syntax_Error (XML_NonTerminal errNT);
    8484       
    85         void Parse_Markup ();
    8685        void Parse_Comment ();
    8786        void Parse_StartTag ();
     
    8988        void Parse_CDATA ();
    9089        void Parse_PI ();
    91         void Parse_Reference ();       
     90        void Parse_CharRef (); 
     91        void Parse_EntityRef ();       
    9292       
    9393        /* Parsing routine for Document Type*/
Note: See TracChangeset for help on using the changeset viewer.