Changeset 126 for trunk/src


Ignore:
Timestamp:
May 2, 2008, 5:45:26 PM (11 years ago)
Author:
lindanl
Message:

Use NameID vs. name string as key for element, attribute, ... maps.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r125 r126  
    141141        byteplex->DoByteplex();
    142142        byteplex->PreparePseudoASCII_Stream();
    143          StrictWellFormedness=false;
     143        StrictWellFormedness=false;
    144144        LastAttOccurrence.assign(m->globalAttributeCount+1, 0);
    145 //      LastAttOccurrence.push_back(0);
    146145       
    147146        decl_parser = new XML_Decl_Parser<C>(byteplex);
     
    397396inline void ParsingEngine<C>::Parse_EntityRef() {
    398397    Advance(1);  // skip "&"
    399     int ref_start = AbsPos();
    400398        int nameID = Parse_Name();  /* Name delimiter */
    401399    if (!AtChar<C,';'>(cur())) {
     
    403401    }
    404402        else {
    405                 int lgth = AbsPos()-ref_start;
    406                 char * s = new char[lgth+1];
    407                 memcpy(s, GetCodeUnitPtr(ref_start),lgth);
    408                 s[lgth] = '\0';
    409                
    410403                Advance(1);
    411404                Reference_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     
    414407                GEntity_info * this_info;
    415408                Parser_Interface * entity_parser;
    416                 int entityID = model_info->GlobalGEntityTable[s];
     409                int entityID = model_info->GlobalGEntityTable[nameID];
    417410                if (entityID == 0)
    418411                        WF_Error(wfErr_wf_entdeclared);
     
    535528                else do {
    536529                        /* Must be an attribute-value pair or error. */
    537                         att_name_start = AbsPos();
    538                         int nameID = Parse_Name();
    539                         att_name_end = AbsPos();
    540                         int lgth = att_name_end-att_name_start;
     530                        int att_nameID = Parse_Name();
    541531               
    542                         int attID = model_info->getOrInsertGlobalAttName(GetCodeUnitPtr(att_name_start), lgth);
     532                        int attID = model_info->getOrInsertGlobalAttName(att_nameID);
    543533                        if (attID >= LastAttOccurrence.size()) LastAttOccurrence.push_back(0);
    544534                        else {
     
    674664                        /* Must be an attribute-value pair or error. */
    675665                        att_name_start = AbsPos();
    676                         int nameID = Parse_Name();
    677                         att_name_end = AbsPos();
    678                         int lgth = att_name_end-att_name_start;
     666                        int att_nameID = Parse_Name();
    679667               
    680                         int attID = model_info->getOrInsertGlobalAttName(GetCodeUnitPtr(att_name_start), lgth);
     668                        int attID = model_info->getOrInsertGlobalAttName(att_nameID);
    681669                        if (attID >= LastAttOccurrence.size()) LastAttOccurrence.push_back(0);
    682670                        else {
     
    905893        }
    906894        requireWS();
    907         int root_name_start = AbsPos();
    908895        int nameID = Parse_Name();
    909         char * s = copy_string(GetCodeUnitPtr(root_name_start),AbsPos()-root_name_start);
    910896
    911897        old_abspos = AbsPos(); 
     
    936922        if (AtChar<C,'>'>(cur())){
    937923                Advance(1);   
    938                 int rootID = model_info->GlobalElementTable[s];
     924                int rootID = model_info->GlobalElementTable[nameID];
    939925
    940926                CRE_Seq * rslt = new CRE_Seq();
     
    10811067                Advance(1);
    10821068                PEReference_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     1069                PEntity_info * this_info;
     1070                Parser_Interface * entity_parser;
     1071                int entityID = model_info->GlobalGEntityTable[nameID];
     1072                if (entityID == 0)
     1073                        WF_Error(wfErr_wf_entdeclared);
     1074                else{
     1075                        this_info = model_info->PEntityData[entityID-1];
     1076                        if (this_info->is_external){
     1077                               
     1078                        if (entity_Info->standalone != Standalone_no)
     1079                                WF_Error(wfErr_NoExternalRefs);
     1080                        else {
     1081                                        entity_parser = ParserFactory(this_info->systemLiteral, model_info);
     1082                                        entity_parser->Parse_WF_Content();
     1083                                        if(!entity_parser->at_EOF())
     1084                                                Syntax_Error(NT_content);
     1085                                        entity_parser->~Parser_Interface();
     1086                        }
     1087                        }
     1088                        else {
     1089                        }
     1090                }
    10831091        }
    10841092        else
     
    10931101
    10941102    requireWS();
    1095     int name_start = AbsPos();
    10961103        int nameID = Parse_Name();
    1097         int lgth = AbsPos() - name_start;
    1098         int elemID = model_info->getOrInsertGlobalElement(GetCodeUnitPtr(name_start), lgth);
     1104        int elemID = model_info->getOrInsertGlobalElement(nameID);
    10991105
    11001106        requireWS();
     
    11681174                        Advance(1);
    11691175                        ScanTo(NonWS);
    1170                         int name_start = AbsPos();
    11711176                        int nameID = Parse_Name();
    1172                         int lgth = AbsPos() - name_start;
    1173                         int elemID = model_info->getOrInsertGlobalElement(GetCodeUnitPtr(name_start), lgth);
     1177                        int elemID = model_info->getOrInsertGlobalElement(nameID);
    11741178                        r->elements[elemID] = ++k;
    11751179                        ScanTo(NonWS);
     
    12601264        }
    12611265        else{
    1262                 int name_start = AbsPos();
    12631266                int nameID = Parse_Name();
    1264                 int lgth = AbsPos() - name_start;
    1265                 int elemID = model_info->getOrInsertGlobalElement(GetCodeUnitPtr(name_start), lgth);
     1267                int elemID = model_info->getOrInsertGlobalElement(nameID);
    12661268                CRE_Name * r = new CRE_Name(elemID);
    12671269
     
    12961298        requireWS();
    12971299       
    1298         name_start = AbsPos();
    12991300        int nameID = Parse_Name();
    1300         lgth = AbsPos()-name_start;
    1301         elemID = model_info->getOrInsertGlobalElement(GetCodeUnitPtr(name_start), lgth);
     1301        elemID = model_info->getOrInsertGlobalElement(nameID);
    13021302       
    13031303        old_abspos = AbsPos();
     
    13071307                Syntax_Error(NT_AttlistDecl);
    13081308               
    1309         name_start = AbsPos();
    1310                 int nameID = Parse_Name();
    1311                 lgth = AbsPos()-name_start;
     1309                int att_nameID = Parse_Name();
    13121310               
    1313                 attID = model_info->getOrInsertGlobalAttName(GetCodeUnitPtr(name_start), lgth);
     1311                attID = model_info->getOrInsertGlobalAttName(att_nameID);
    13141312                if (attID >= LastAttOccurrence.size()) LastAttOccurrence.push_back(0);
    13151313        ATT_info * this_info = new ATT_info;
     
    13821380        ScanTo(NonWS);
    13831381       
    1384     int name_start = AbsPos();
    1385         int nameID = Parse_Name();
    1386         int     lgth = AbsPos()-name_start;
    1387        
    1388         char *s = new char[lgth+1];
    1389         memcpy(s, GetCodeUnitPtr(name_start), lgth);
    1390         s[lgth] = '\0';
     1382    int nameID = Parse_Name();
    13911383
    13921384        /*Notation name is not in the global table!*/
    1393         if(model_info->GlobalNotationTable[s]==0)
     1385        if(model_info->GlobalNotationTable[nameID]==0)
    13941386                Validity_Error(vErr_notatn);
    13951387       
     
    13971389        while(AtChar<C,'|'>(cur())){
    13981390                Advance(1);
    1399                 ScanTo(NonWS);         
    1400                 name_start = AbsPos();
    1401                 int nameID = Parse_Name();
    1402                 lgth = AbsPos()-name_start;
    1403        
    1404                 char *s = new char[lgth+1];
    1405                 memcpy(s, GetCodeUnitPtr(name_start), lgth);
    1406                 s[lgth] = '\0';
    1407        
    1408                 if(model_info->GlobalNotationTable[s]==0)
     1391                ScanTo(NonWS); 
     1392                int not_nameID = Parse_Name();
     1393                       
     1394                if(model_info->GlobalNotationTable[not_nameID]==0)
    14091395                        Validity_Error(vErr_notatn);
    14101396                       
     
    15131499                requireWS();
    15141500               
    1515                 name_start = AbsPos();
    15161501                int nameID = Parse_Name();
    1517                 lgth = AbsPos()- name_start;
    1518                 s = new char[lgth+1];
    1519                 memcpy(s, GetCodeUnitPtr(name_start),lgth);
    1520                 s[lgth] = '\0';
    15211502       
    15221503                PEntity_info * this_info = new PEntity_info;
    1523                 int entityID = model_info->GlobalPEntityTable[s];
     1504                int entityID = model_info->GlobalPEntityTable[nameID];
    15241505                if(entityID==0){       
    1525                         model_info->GlobalPEntityTable[s]=++(model_info->globalPEntityCount);
     1506                        model_info->GlobalPEntityTable[nameID]=++(model_info->globalPEntityCount);
    15261507                        entityID = model_info->globalPEntityCount;
    15271508                        this_info->globalPEntity_id = entityID;
     
    15431524        }
    15441525        else{
    1545                 name_start = AbsPos();
    15461526                int nameID = Parse_Name();
    1547                 lgth = AbsPos()- name_start;
    1548                 s = new char[lgth+1];
    1549                 memcpy(s, GetCodeUnitPtr(name_start),lgth);
    1550                 s[lgth] = '\0';
    15511527       
    15521528                GEntity_info * this_info = new GEntity_info();
    1553                 int entityID = model_info->GlobalGEntityTable[s];
     1529                int entityID = model_info->GlobalGEntityTable[nameID];
    15541530                if(entityID==0){       
    1555                         model_info->GlobalGEntityTable[s]=++(model_info->globalGEntityCount);
     1531                        model_info->GlobalGEntityTable[nameID]=++(model_info->globalGEntityCount);
    15561532                        entityID = model_info->globalGEntityCount;
    15571533                        this_info->globalGEntity_id = entityID;
     
    16011577        requireWS();
    16021578       
    1603         int name_start = AbsPos();
    16041579        int nameID = Parse_Name();
    1605         int     lgth = AbsPos()-name_start;
    1606        
    1607         char *s = new char[lgth+1];
    1608         memcpy(s, GetCodeUnitPtr(name_start), lgth);
    1609         s[lgth] = '\0';
    1610 
    1611         int notationID = model_info->GlobalNotationTable[s];
     1580
     1581        int notationID = model_info->GlobalNotationTable[nameID];
    16121582        if(notationID==0){     
    1613                 model_info->GlobalNotationTable[s]=++(model_info->globalNotationCount);
     1583                model_info->GlobalNotationTable[nameID]=++(model_info->globalNotationCount);
    16141584                notationID = model_info->globalNotationCount;
    16151585        }
     
    17041674inline char * ParsingEngine<C>::Replace_EntityRef(bool& is_simple){
    17051675        Advance(1);
    1706         int entity_start = AbsPos();
    17071676        int nameID = Parse_Name();
    1708         char * s = copy_string(GetCodeUnitPtr(entity_start),AbsPos()-entity_start);
    17091677        if (AtChar<C,';'>(cur()))
    17101678                Advance(1);
    17111679        else
    17121680                Syntax_Error(NT_EntityValue);
    1713         int entityID = model_info->GlobalGEntityTable[s];
     1681        int entityID = model_info->GlobalGEntityTable[nameID];
    17141682        if (entityID == 0)
    17151683                WF_Error(wfErr_wf_entdeclared);
     
    17291697inline char * ParsingEngine<C>::Replace_CharRef(){
    17301698        Advance(1);
    1731         int entity_start = AbsPos();
    17321699        int nameID = Parse_Name();
    1733         char * s = copy_string(GetCodeUnitPtr(entity_start),AbsPos()-entity_start);
    1734         int entityID = model_info->GlobalGEntityTable[s];
     1700        int entityID = model_info->GlobalGEntityTable[nameID];
    17351701        if (entityID == 0)
    17361702                WF_Error(wfErr_wf_entdeclared);
     
    18021768                                                        section_depth--;
    18031769                                                }
     1770                                                else
     1771                                                        Advance(1);
    18041772                                                if(section_depth==0) return;                                   
    18051773                                        }
     
    21912159                }
    21922160                else if (!is_XML10_UTF8_Name(GetCodeUnitPtr(name_pos),lgth)) Syntax_Error(NT_Name);
    2193                 model_info->GlobalNameTable[s]=++model_info->globalNameCount;
     2161                model_info->GlobalNameTable[s]=++(model_info->globalNameCount);
    21942162                nameID = model_info->globalNameCount;
    21952163        }
  • trunk/src/xmlmodel.c

    r102 r126  
    1111
    1212void Model_Info::SimpleEntity(char * entity_Name, char * replText) {
    13                 int entityID = GlobalGEntityTable[entity_Name];
     13                int entity_NameID = GlobalNameTable[entity_Name];
     14                if (entity_NameID == 0) {
     15                        GlobalNameTable[entity_Name] = ++(globalNameCount);
     16                        entity_NameID = globalNameCount;
     17                }
     18                int entityID = GlobalGEntityTable[entity_NameID];
    1419                if(entityID==0){       
    1520                        GEntity_info * this_info = new GEntity_info;
    16                         GlobalGEntityTable[entity_Name]=++(globalGEntityCount);
     21                        GlobalGEntityTable[entity_NameID]=++(globalGEntityCount);
    1722                        entityID = globalGEntityCount;
    1823               
     
    3237        globalElementCount = 0;
    3338        globalAttributeCount = 0;
     39        globalNameCount = 0;
    3440        SimpleEntity("lt", "<");
    3541        SimpleEntity("gt", ">");
     
    114120                BOM_units = B;
    115121 }
    116 int Model_Info::getOrInsertGlobalElement(unsigned char * elem_name, int lgth) {
    117         int elemID;
    118         char *s = new char[lgth+1];
    119         memcpy(s, elem_name, lgth);
    120         s[lgth] = '\0';
    121         elemID = GlobalElementTable[s];
     122int Model_Info::getOrInsertGlobalElement(int elem_nameID) {
     123        int elemID =  GlobalElementTable[elem_nameID];
    122124        if(elemID==0){ 
    123                 GlobalElementTable[s]=++(globalElementCount);
     125                GlobalElementTable[elem_nameID]=++(globalElementCount);
    124126                elemID = globalElementCount;
    125127               
     
    129131}
    130132
    131 int Model_Info::getOrInsertGlobalAttName(unsigned char * att_name, int lgth){
    132        
    133         char *s = new char[lgth+1];
    134         memcpy(s, att_name, lgth);
    135         s[lgth] = '\0';
    136        
    137         int attID = GlobalAttributeTable[s];
     133int Model_Info::getOrInsertGlobalAttName(int att_nameID){
     134               
     135        int attID = GlobalAttributeTable[att_nameID];
    138136        if(attID==0){   
    139                 GlobalAttributeTable[s]=++(globalAttributeCount);
     137                GlobalAttributeTable[att_nameID]=++(globalAttributeCount);
    140138                attID = globalAttributeCount;
    141139        }
  • trunk/src/xmlmodel.h

    r124 r126  
    173173   
    174174        /* Information computed from ATTLIST, ELEMENT, NOTATION and ENTITY declarations. */
    175         hash_map<const char *, int, hash<const char *>, eqstr > GlobalAttributeTable;
    176         hash_map<const char *, int, hash<const char *>, eqstr > GlobalElementTable;
    177         hash_map<const char *, int, hash<const char *>, eqstr > GlobalNotationTable;
    178         hash_map<const char *, int, hash<const char *>, eqstr > GlobalGEntityTable;
    179         hash_map<const char *, int, hash<const char *>, eqstr > GlobalPEntityTable;
     175
     176        hash_map<int, int > GlobalAttributeTable;
     177        hash_map<int, int > GlobalElementTable;
     178        hash_map<int, int > GlobalNotationTable;
     179        hash_map<int, int > GlobalGEntityTable;
     180        hash_map<int, int > GlobalPEntityTable;
     181       
    180182        hash_map<const char *, int, hash<const char *>, eqstr > GlobalNameTable;
    181183        int globalElementCount;
     
    187189    /* For each element, we have an ElementAttributeModel */
    188190        vector<vector<ATT_info *> > ElementAttributeData;
    189         int getOrInsertGlobalElement(unsigned char * elem_name, int lgth);
    190         int getOrInsertGlobalAttName(unsigned char * att_name, int lgth);
     191        int getOrInsertGlobalElement(int elem_nameID);
     192        int getOrInsertGlobalAttName(int att_nameID);
    191193        // rootModel is a content model for the document root, consisting
    192194        // of a single occurrence of the element named in the DOCTYPE declaration.
Note: See TracChangeset for help on using the changeset viewer.