Changeset 175


Ignore:
Timestamp:
Jun 27, 2008, 1:22:53 PM (11 years ago)
Author:
lindanl
Message:

Pubidliteral in ; skip general entityRef in entityValue.

Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r174 r175  
    496496template <class B>
    497497inline void ParsingEngine<B>::Parse_CDATA() {
    498         Advance(8); /* Skip "<![CDATA". */
     498                Advance(8); /* Skip "<![CDATA". */
    499499        if (!AtChar<B::Base,'['>(cur())) {
    500500                Syntax_Error(NT_CDStart);
     
    555555                                        entity_parser = ParserFactory(this_info->ReplacementText, strlen(this_info->ReplacementText),entity_Info, model_info);
    556556                                        entity_parser->Parse_WF_Content();
     557                                        if(!entity_parser->at_EOF())
     558                                                Syntax_Error(NT_content);
     559                                        entity_parser->~Parser_Interface();
     560                                }
     561                        }
     562                }
     563               
     564        }
     565}
     566
     567template <class B>
     568inline void ParsingEngine<B>::Parse_EntityRef_inMixed(symbol_set_t elems) {
     569    Advance(1);  // skip "&"
     570        int nameID = Parse_Name();  /* Name delimiter */
     571    if (!AtChar<B::Base,';'>(cur())) {
     572                Syntax_Error(NT_Reference);
     573    }
     574        else {
     575                Advance(1);
     576                Reference_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     577               
     578                //      The following code will replace Reference_Action.
     579                GEntity_info * this_info;
     580                Parser_Interface * entity_parser;
     581                int entityID = model_info->GlobalGEntityTable[nameID];
     582                if (entityID == 0)
     583                        WF_Error(wfErr_wf_entdeclared);
     584                else{
     585                        this_info = model_info->GEntityData[entityID-1];
     586                        if (this_info->is_external){
     587                               
     588                        if (entity_Info->standalone != Standalone_no)
     589                                WF_Error(wfErr_NoExternalRefs);
     590                        else {
     591                                        entity_parser = ParserFactory(this_info->systemLiteral, model_info);
     592                                        entity_parser->Parse_MixedContent(elems);
     593                                        if(!entity_parser->at_EOF())
     594                                                Syntax_Error(NT_content);
     595                                        entity_parser->~Parser_Interface();
     596                        }
     597                        }
     598                        else {
     599                                if (this_info->is_simple == true);
     600//                                      printf("Entity is %s\n",this_info->ReplacementText);
     601                                else{
     602//                                      printf("Not a simple text: %s\n",this_info->ReplacementText);
     603                                        entity_parser = ParserFactory(this_info->ReplacementText, strlen(this_info->ReplacementText),entity_Info, model_info);
     604                                        entity_parser->Parse_MixedContent(elems);
     605                                        if(!entity_parser->at_EOF())
     606                                                Syntax_Error(NT_content);
     607                                        entity_parser->~Parser_Interface();
     608                                }
     609                        }
     610                }
     611               
     612        }
     613}
     614
     615template <class B>
     616inline void ParsingEngine<B>::Parse_EntityRef_inAnyContent() {
     617    Advance(1);  // skip "&"
     618        int nameID = Parse_Name();  /* Name delimiter */
     619    if (!AtChar<B::Base,';'>(cur())) {
     620                Syntax_Error(NT_Reference);
     621    }
     622        else {
     623                Advance(1);
     624                Reference_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     625               
     626                //      The following code will replace Reference_Action.
     627                GEntity_info * this_info;
     628                Parser_Interface * entity_parser;
     629                int entityID = model_info->GlobalGEntityTable[nameID];
     630                if (entityID == 0)
     631                        WF_Error(wfErr_wf_entdeclared);
     632                else{
     633                        this_info = model_info->GEntityData[entityID-1];
     634                        if (this_info->is_external){
     635                               
     636                        if (entity_Info->standalone != Standalone_no)
     637                                WF_Error(wfErr_NoExternalRefs);
     638                        else {
     639                                        entity_parser = ParserFactory(this_info->systemLiteral, model_info);
     640                                        entity_parser->Parse_AnyContent();
     641                                        if(!entity_parser->at_EOF())
     642                                                Syntax_Error(NT_content);
     643                                        entity_parser->~Parser_Interface();
     644                        }
     645                        }
     646                        else {
     647                                if (this_info->is_simple == true);
     648//                                      printf("Entity is %s\n",this_info->ReplacementText);
     649                                else{
     650//                                      printf("Not a simple text: %s\n",this_info->ReplacementText);
     651                                        entity_parser = ParserFactory(this_info->ReplacementText, strlen(this_info->ReplacementText),entity_Info, model_info);
     652                                        entity_parser->Parse_AnyContent();
    557653                                        if(!entity_parser->at_EOF())
    558654                                                Syntax_Error(NT_content);
     
    12471343inline void ParsingEngine<B>::Parse_PubidLiteral (){
    12481344        unsigned char quoteCh;
    1249         if(AtQuote<B::Base>(cur())){
    1250                 quoteCh = cur()[0];
    1251                 Advance(1);
    1252         }       
    1253         while (at_PubidChar<B::Base>(cur())) Advance(1);
     1345        quoteCh = cur()[0];
     1346        Advance(1);
     1347        while (at_PubidChar<B::Base>(cur()) && (cur()[0] != quoteCh)) {
     1348                Advance(1);
     1349        }
    12541350        if (cur()[0] != quoteCh){
    12551351                Syntax_Error(NT_PubidLiteral);
     
    17611857                }
    17621858                else
    1763                         printf("Warning: Entity definition already exist!\n");
     1859                        printf("Warning: Entity definition already exists!\n");
    17641860                       
    17651861                requireWS();
     
    18761972                        ScanTo(Quote);
    18771973                }
    1878                 else if (AtChar<B::Base,'&'>(cur())){
    1879                         strcat (replText,Replace_EntityRef(this_info->is_simple));
    1880                         quot_start = AbsPos();
    1881                         ScanTo(Quote);
    1882                 }
    18831974                else if (AtQuote<B::Base>(cur())) {
    18841975                        quot_start = AbsPos();
     
    18861977                        ScanTo(Quote);
    18871978                }
    1888                 else { /* '<' found */
     1979                else if (at_EOF()) {
     1980                        Syntax_Error(NT_EntityValue);
     1981                }
     1982                else { /* '<' or '&' found */
    18891983                        quot_start = AbsPos();
    18901984                        Advance(1);
     
    22642358                else if (AtChar<B::Base,'&'>(cur())) {
    22652359                        text_if_nonnull_action();
    2266                         Parse_EntityRef();
     2360                        Parse_EntityRef_inAnyContent();
    22672361                }
    22682362                else if (at_CDATA_Start<B::Base>(cur())) {
     
    23222416                else if (AtChar<B::Base,'&'>(cur())) {
    23232417                        text_if_nonnull_action();
    2324                         Parse_EntityRef();
     2418                        Parse_EntityRef_inMixed(elems);
    23252419                }
    23262420                else if (at_CDATA_Start<B::Base>(cur())) {
  • trunk/src/engine.h

    r174 r175  
    3131        virtual void Parse_DocumentContent() = 0;
    3232        virtual void Parse_WF_Content() = 0;
     33        virtual void Parse_AnyContent() = 0;
     34        virtual void Parse_MixedContent(symbol_set_t elems) = 0;
    3335        virtual void Parse_ValidContent(CM_RegExp * cre, int & cur_state) = 0;
    3436        virtual bool at_EOF() const = 0;
     
    101103        void Parse_PI ();
    102104        void Parse_CharRef (); 
    103         void Parse_EntityRef ();       
     105        void Parse_EntityRef ();
     106        void Parse_EntityRef_inMixed(symbol_set_t elems);
     107        void Parse_EntityRef_inAnyContent();
    104108       
    105109        /* Parsing routine for Document Type*/
Note: See TracChangeset for help on using the changeset viewer.