Changeset 93


Ignore:
Timestamp:
Apr 8, 2008, 11:24:38 AM (11 years ago)
Author:
lindanl
Message:

Hashmap for enumerated types in Attlists.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r92 r93  
    8484        byteplex->DoByteplex();
    8585        byteplex->PreparePseudoASCII_Stream();
    86        
     86         StrictWellFormedness=false;
    8787        LastAttOccurrence.push_back(0);
    8888       
     
    885885inline void ParsingEngine<C>::Parse_Enumeration (ATT_info * this_info){
    886886
     887        int enumCount=0;
    887888        if(AtChar<C,'('>(cur()))
    888889                Advance(1);
     
    890891                Error_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
    891892        ScanTo(NonWS);
     893       
     894    int name_start = AbsPos();
    892895        ScanTo(NameFollow);
     896        int     lgth = AbsPos()-name_start;
     897       
     898        char *s = new char[lgth+1];
     899        memcpy(s, GetCodeUnitPtr(name_start), lgth);
     900        s[lgth] = '\0';
     901       
     902        this_info->enumValues[s]=++(enumCount);
     903       
    893904        ScanTo(NonWS);
    894905        while(AtChar<C,'|'>(cur())){
    895906                Advance(1);
     907                ScanTo(NonWS);         
     908                name_start = AbsPos();
    896909                ScanTo(NameFollow);
     910                lgth = AbsPos()-name_start;
     911       
     912                char *s = new char[lgth+1];
     913                memcpy(s, GetCodeUnitPtr(name_start), lgth);
     914                s[lgth] = '\0';
     915       
     916                int enumID = this_info->enumValues[s];
     917                if(enumID==0){ 
     918                        this_info->enumValues[s]=++(enumCount);
     919                        enumID = enumCount;
     920                }
     921                else if(!StrictWellFormedness){
     922                        Error_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     923                }
    897924                ScanTo(NonWS);
    898925        }
  • trunk/src/engine.h

    r92 r93  
    4545        int buffer_rel_pos;
    4646        int buffer_limit_pos;
     47       
    4748};
    4849
     
    5455        void ParseContent();
    5556protected:
     57        bool StrictWellFormedness;
     58
    5659        vector<int> LastAttOccurrence;
    5760        XML_Decl_Parser<C> * decl_parser;
  • trunk/src/xmlmodel.h

    r91 r93  
    8383/* Possible kinds of attribute default in ATTLIST declarations. */
    8484
     85struct eqstr
     86{
     87  bool operator()(const char* s1, const char* s2) const
     88  {
     89    return strcmp(s1, s2) == 0;
     90  }
     91};
     92
    8593class ATT_info {
    8694public:
    8795        int globalATT_id;
    8896        ATT_type attType;
    89         vector<string> enumValues; /* For NOTATION_att or enumeration_att.*/
     97        hash_map<const char *, int, hash<const char *>, eqstr > enumValues; /* For NOTATION_att or enumeration_att.*/
    9098        ATT_default_kind defaultKind;
    9199        unsigned char * defaultValue;
     
    96104   specifications for particular attribute names. */
    97105//typedef vector<ATT_info> ElementAttributeModel;
    98 
    99 struct eqstr
    100 {
    101   bool operator()(const char* s1, const char* s2) const
    102   {
    103     return strcmp(s1, s2) == 0;
    104   }
    105 };
    106106
    107107class Model_Info {
Note: See TracChangeset for help on using the changeset viewer.