Changeset 174 for trunk/src/symtab.c


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

Nmtokens.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.