Changeset 174


Ignore:
Timestamp:
Jun 27, 2008, 11:21:42 AM (11 years ago)
Author:
lindanl
Message:

Nmtokens.

Location:
trunk/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r173 r174  
    11781178               
    11791179                model_info->rootModel = cre;
    1180 
     1180               
     1181                /* Check for notations that were used, but not defined by the end of the DTD. */
     1182                #if (VALIDATION_MODE == ON)
     1183                hash_map<int, int >::iterator j;
     1184                for (j=model_info->GlobalNotationTable.begin(); j!=model_info->GlobalNotationTable.end(); j++) {
     1185                        if (j->second == -1)
     1186                                Validity_Error(vErr_notatn);
     1187                }
     1188                #endif
    11811189        }
    11821190        else
     
    16111619        ScanTo(NonWS);
    16121620       
    1613     int nameID = Parse_Name();
     1621    int notn_nameID = Parse_Name();
    16141622
    16151623        /*Notation name is not in the global table!*/
    1616         if(model_info->GlobalNotationTable[nameID]==0)
    1617                 Validity_Error(vErr_notatn);
     1624        if(model_info->GlobalNotationTable[notn_nameID]==0)
     1625                model_info->GlobalNotationTable[notn_nameID] = -1;
    16181626       
    16191627        ScanTo(NonWS);
     
    16211629                Advance(1);
    16221630                ScanTo(NonWS); 
    1623                 int not_nameID = Parse_Name();
     1631                notn_nameID = Parse_Name();
    16241632                       
    1625                 if(model_info->GlobalNotationTable[not_nameID]==0)
    1626                         Validity_Error(vErr_notatn);
     1633                if(model_info->GlobalNotationTable[notn_nameID]==0)
     1634//                      Validity_Error(vErr_notatn);
     1635                        model_info->GlobalNotationTable[notn_nameID] = -1;
    16271636                       
    16281637                ScanTo(NonWS);
     
    16441653        ScanTo(NonWS);
    16451654       
    1646         int nameID = Parse_Name();
    1647        
    1648         this_info->enumValues[nameID]=++(enumCount);
     1655        int nmtokenID = Parse_Nmtoken();
     1656       
     1657        this_info->enumValues[nmtokenID]=++(enumCount);
    16491658       
    16501659        ScanTo(NonWS);
     
    16521661                Advance(1);
    16531662                ScanTo(NonWS); 
    1654                 int nameID = Parse_Name();
    1655        
    1656                 int enumID = this_info->enumValues[nameID];
     1663                int nmtokenID = Parse_Nmtoken();
     1664       
     1665                int enumID = this_info->enumValues[nmtokenID];
    16571666                if(enumID==0){ 
    1658                         this_info->enumValues[nameID]=++(enumCount);
     1667                        this_info->enumValues[nmtokenID]=++(enumCount);
    16591668                        enumID = enumCount;
    16601669                }
     
    17981807
    17991808        int notationID = model_info->GlobalNotationTable[nameID];
    1800         if(notationID==0){     
     1809        /* notationID == -1: used but not yet defined; == 0: new, > 0 prev. defined */
     1810        if(notationID <= 0){   
    18011811                model_info->GlobalNotationTable[nameID]=++(model_info->globalNotationCount);
    18021812                notationID = model_info->globalNotationCount;
     
    23472357        ScanTo(NameFollow);
    23482358        int lgth = AbsPos()-name_pos;
    2349         int nameID = model_info->symbol_table->ASCII_Lookup_or_Insert(&((char *) x8data)[buffer_rel_pos-lgth], lgth);
     2359        int nameID = model_info->symbol_table->ASCII_Lookup_or_Insert_Name(&((char *) x8data)[buffer_rel_pos-lgth], lgth);
    23502360        if (nameID != 0) return nameID;
    23512361        else {
     
    23772387        ScanTo(NameFollow);
    23782388        int lgth = AbsPos()-name_pos;
    2379         return model_info->symbol_table->UTF8_Lookup_or_Insert(&((char *)x8data)[buffer_rel_pos-lgth], lgth);
    2380 }
    2381 
     2389        return model_info->symbol_table->UTF8_Lookup_or_Insert_Name(&((char *)x8data)[buffer_rel_pos-lgth], lgth);
     2390}
     2391
     2392template <class B>
     2393inline int ParsingEngine<B>::Parse_Nmtoken() {
     2394        int name_pos = AbsPos();
     2395        ScanTo(NameFollow);
     2396        int lgth = AbsPos()-name_pos;
     2397        int nameID = model_info->symbol_table->ASCII_Lookup_or_Insert_Nmtoken(&((char *) x8data)[buffer_rel_pos-lgth], lgth);
     2398        if (nameID != 0) return nameID;
     2399        else {
     2400                int u8_lgth = byteplex->UTF8_Length(name_pos, lgth);
     2401                char * u8_ptr = model_info->symbol_table->ReserveSymbolSpace(u8_lgth);
     2402                byteplex->to_UTF8(name_pos, lgth, u8_ptr);
     2403                return model_info->symbol_table->LookupOrInsertReserved_nmtoken();
     2404        }
     2405}
     2406
     2407template <>
     2408inline int ParsingEngine< X8_Buffer<EBCDIC> >::Parse_Nmtoken() {
     2409        int name_pos = AbsPos();
     2410        ScanTo(NameFollow);
     2411        int lgth = AbsPos()-name_pos;
     2412//      int nameID = local_EBCDIC_table->Lookup_or_Insert(GetCodeUnitPtr(name_pos), lgth);
     2413//      if (nameID != 0) return nameID;
     2414//      else {
     2415                int u8_lgth = byteplex->UTF8_Length(name_pos, lgth);
     2416                char * u8_ptr = model_info->symbol_table->ReserveSymbolSpace(u8_lgth);
     2417                byteplex->to_UTF8(name_pos, lgth, u8_ptr);
     2418                return model_info->symbol_table->LookupOrInsertReserved_nmtoken();
     2419//      }
     2420}
     2421template <>
     2422inline int ParsingEngine<UTF8_Buffer>::Parse_Nmtoken() {
     2423        int name_pos = AbsPos();
     2424        ScanTo(NameFollow);
     2425        int lgth = AbsPos()-name_pos;
     2426        return model_info->symbol_table->UTF8_Lookup_or_Insert_Nmtoken(&((char *)x8data)[buffer_rel_pos-lgth], lgth);
     2427}
    23822428
    23832429template <class B>
  • trunk/src/engine.h

    r170 r174  
    142142        int Parse_ValidStartTag(bool& is_empty);
    143143       
     144        int Parse_Nmtoken();
    144145        int Parse_Name();
    145146       
  • trunk/src/symtab.c

    r173 r174  
    189189}
    190190
     191bool is_XML10_UTF8_Nmtoken(char prototoken[], int lgth) {
     192        int valid_bytes = XML_10_UTF8_NameChar_bytes((unsigned char *) prototoken);
     193        int pos = valid_bytes;
     194        while ((valid_bytes > 0) & (pos < lgth)) {
     195                valid_bytes = XML_10_UTF8_NameChar_bytes((unsigned char *) &prototoken[pos]);
     196                pos += valid_bytes;
     197                 
     198        }
     199        /* Success requires that every byte sequence processed be valid
     200           and that the total lgth processed be exactly that provided on
     201           input. */
     202         
     203        return (valid_bytes > 0) & (pos == lgth);
     204}
     205
     206bool is_XML11_UTF8_Nmtoken(char prototoken[], int lgth) {
     207        int valid_bytes = XML_11_UTF8_NameChar_bytes((unsigned char *) prototoken);
     208        int pos = valid_bytes;
     209        while ((valid_bytes > 0) & (pos < lgth)) {
     210                valid_bytes = XML_11_UTF8_NameChar_bytes((unsigned char *) &prototoken[pos]);
     211                pos += valid_bytes;
     212        }
     213        /* Success requires that every byte sequence processed be valid
     214           and that the total lgth processed be exactly that provided on
     215           input. */
     216        return (valid_bytes > 0) & (pos == lgth);
     217}
     218
    191219int Symbol_Table::Insert_Name(char * name, int lgth) {
    192220//      char * s = copy_name(name,lgth);
     
    228256a nameID if necessary.  If the name is non-ASCII, 0 is returned. */
    229257
    230 inline int Symbol_Table::ASCII_Lookup_or_Insert(char * name_ptr, int name_lgth) {
     258inline int Symbol_Table::ASCII_Lookup_or_Insert_Name(char * name_ptr, int name_lgth) {
    231259
    232260        if (Verify_ASCII(name_ptr, name_lgth)) {
    233                 return UTF8_Lookup_or_Insert(name_ptr, name_lgth);
     261                return UTF8_Lookup_or_Insert_Name(name_ptr, name_lgth);
    234262        }
    235263        return 0;
     
    238266
    239267
    240 int Symbol_Table::UTF8_Lookup_or_Insert(char * name, int lgth) {
     268int Symbol_Table::UTF8_Lookup_or_Insert_Name(char * name, int lgth) {
    241269               
    242270        char delim = name[lgth];
     
    293321}
    294322
     323inline int Symbol_Table::ASCII_Lookup_or_Insert_Nmtoken(char * nmtoken_ptr, int name_lgth) {
     324
     325        if (Verify_ASCII(nmtoken_ptr, name_lgth)) {
     326                return UTF8_Lookup_or_Insert_Nmtoken(nmtoken_ptr, name_lgth);
     327        }
     328        return 0;
     329}
     330
     331
     332int Symbol_Table::UTF8_Lookup_or_Insert_Nmtoken(char * nmtoken, int lgth) {
     333               
     334        char delim = nmtoken[lgth];
     335        nmtoken[lgth] = '\0';
     336        int nmtokenID = UTF8NmtokenMap[nmtoken];
     337        nmtoken[lgth] = delim; 
     338       
     339        if(nmtokenID == 0){
     340        #if (not defined(OMISSION)) or (OMISSION != NAME_VALIDATION)
     341#ifdef EDITION5
     342                if (!is_XML11_UTF8_Nmtoken(nmtoken,lgth))  {
     343                        ShowSyntaxError(NT_Nmtoken);
     344                        exit(-1);
     345                }
     346#endif
     347#ifndef EDITION5
     348                if (!is_XML10_UTF8_Nmtoken(nmtoken,lgth))  {
     349                        if (version == XML_1_1) {
     350                                if (!is_XML11_UTF8_Nmtoken(nmtoken,lgth))  {
     351                                        ShowSyntaxError(NT_Nmtoken);
     352                                        exit(-1);
     353                                }
     354                        }
     355                        else {
     356                                ShowSyntaxError(NT_Nmtoken);
     357                                exit(-1);
     358                        }
     359                }
     360#endif
     361        #endif
     362//              char * s = copy_name(name,lgth);
     363                char * s = pool->Insert(nmtoken,lgth);
     364                UTF8NmtokenMap[s]=++(globalNmtokenCount);
     365                nmtokenID = globalNmtokenCount;
     366                Name_Data nmtoken_data;
     367                nmtoken_data.name_string = s;
     368                nmtoken_data.lgth = lgth;
     369                UTF8NmtokenTable.push_back(nmtoken_data);
     370//              UTF8NameTable.push_back(s);
     371        }
     372        return nmtokenID;
     373}
     374
     375
     376
     377
     378char * Symbol_Table::Get_UTF8_nmtoken(int nmtokenID) {
     379        return  UTF8NmtokenTable[nmtokenID].name_string;
     380}
     381
     382int Symbol_Table::Get_UTF8_nmtoken_lgth(int nmtokenID) {
     383        return  UTF8NmtokenTable[nmtokenID].lgth;
     384}
     385
    295386char * Symbol_Table::ReserveSymbolSpace(int u8_lgth) {
    296387        reserved = new char[u8_lgth+1];
     
    320411        }
    321412        return nameID;
     413}
     414
     415int Symbol_Table::LookupOrInsertReserved_nmtoken(){             
     416        int nmtokenID = UTF8NmtokenMap[reserved];
     417        if(nmtokenID == 0){
     418        #if (not defined(OMISSION)) or (OMISSION != NAME_VALIDATION)
     419                if (!is_XML10_UTF8_Nmtoken(reserved,reserved_lgth))  {
     420                        ShowSyntaxError(NT_Nmtoken);
     421                        exit(-1);
     422                }
     423        #endif
     424                UTF8NmtokenMap[reserved]=++(globalNmtokenCount);
     425                nmtokenID = globalNmtokenCount;
     426                Name_Data nmtoken_data;
     427                nmtoken_data.name_string = reserved;
     428                nmtoken_data.lgth = reserved_lgth;
     429                UTF8NmtokenTable.push_back(nmtoken_data);
     430        }
     431        else {
     432                delete [] reserved;
     433        }
     434        return nmtokenID;
    322435}
    323436
  • trunk/src/symtab.h

    r173 r174  
    5252
    5353        int Insert_Name(char * name, int lgth);
    54         int ASCII_Lookup_or_Insert(char * name, int lgth);     
    55         int UTF8_Lookup_or_Insert(char * name, int lgth);
     54        int ASCII_Lookup_or_Insert_Name(char * name, int lgth);
     55        int UTF8_Lookup_or_Insert_Name(char * name, int lgth);
     56        int ASCII_Lookup_or_Insert_Nmtoken(char * name, int lgth);     
     57        int UTF8_Lookup_or_Insert_Nmtoken(char * name, int lgth);
    5658
    5759        char * Get_UTF8_name(int nameID);
    5860        int Get_UTF8_lgth(int nameID);
     61
     62        char * Get_UTF8_nmtoken(int nmtokenID);
     63        int Get_UTF8_nmtoken_lgth(int nmtokenID);
    5964       
    6065        char * ReserveSymbolSpace(int u8_lgth);
    6166        int LookupOrInsertReserved();
     67        int LookupOrInsertReserved_nmtoken();
    6268       
    6369        XML_version version;
    6470        vector<Name_Data> UTF8NameTable;
     71        vector<Name_Data> UTF8NmtokenTable;
    6572private:
    6673        hash_map<const char *, int, hash<const char *>, eqstr > UTF8NameMap;
     74        hash_map<const char *, int, hash<const char *>, eqstr > UTF8NmtokenMap;
    6775        int globalNameCount;
     76        int globalNmtokenCount;
    6877//      vector<char *> UTF8NameTable;
    6978
  • trunk/src/xmlmodel.h

    r163 r174  
    101101        char * external_DTD_pubidLiteral;       
    102102        Symbol_Table * symbol_table;
     103       
    103104   
    104105        /* Information computed from ATTLIST, ELEMENT, NOTATION and ENTITY declarations. */
Note: See TracChangeset for help on using the changeset viewer.