Changeset 94


Ignore:
Timestamp:
Apr 8, 2008, 2:05:55 PM (11 years ago)
Author:
lindanl
Message:

Add Notation table.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r93 r94  
    862862                Advance(8);
    863863                        requireWS();
    864                 Parse_Enumeration(this_info);
     864                Parse_Notation(this_info);
    865865                this_info->attType = NOTATION_att;
    866866        }
     
    873873        requireWS();
    874874        Parse_DefaultDecl(this_info);
    875         old_abspos = AbsPos();
     875
    876876                ScanTo(NonWS);
    877877                model_info->ElementAttributeData[elemID].push_back(this_info);
     
    880880        Advance(1);
    881881        AttlistDecl_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     882}
     883
     884template <CodeUnit_Base C>
     885inline void ParsingEngine<C>::Parse_Notation (ATT_info * this_info){
     886
     887        if(AtChar<C,'('>(cur()))
     888                Advance(1);
     889        else
     890                Error_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     891        ScanTo(NonWS);
     892       
     893    int name_start = AbsPos();
     894        ScanTo(NameFollow);
     895        int     lgth = AbsPos()-name_start;
     896       
     897        char *s = new char[lgth+1];
     898        memcpy(s, GetCodeUnitPtr(name_start), lgth);
     899        s[lgth] = '\0';
     900
     901        /*Notation name is not in the global table!*/
     902        if(model_info->GlobalNotationTable[s]==0)
     903                Error_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     904       
     905        ScanTo(NonWS);
     906        while(AtChar<C,'|'>(cur())){
     907                Advance(1);
     908                ScanTo(NonWS);         
     909                name_start = AbsPos();
     910                ScanTo(NameFollow);
     911                lgth = AbsPos()-name_start;
     912       
     913                char *s = new char[lgth+1];
     914                memcpy(s, GetCodeUnitPtr(name_start), lgth);
     915                s[lgth] = '\0';
     916       
     917                if(model_info->GlobalNotationTable[s]==0)
     918                        Error_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     919                       
     920                ScanTo(NonWS);
     921        }
     922        if (AtChar<C,')'>(cur()))
     923                Advance(1);
     924        else
     925                Error_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
    882926}
    883927
     
    10231067template <CodeUnit_Base C>
    10241068inline void ParsingEngine<C>::Parse_Notationdecl (){
    1025        
     1069
    10261070        int old_abspos;
    10271071        Advance(8); /* Skip "NOTATION. */
    10281072        requireWS();
     1073       
     1074        int name_start = AbsPos();
    10291075        ScanTo(NameFollow);
     1076        int     lgth = AbsPos()-name_start;
     1077       
     1078        char *s = new char[lgth+1];
     1079        memcpy(s, GetCodeUnitPtr(name_start), lgth);
     1080        s[lgth] = '\0';
     1081
     1082        int notationID = model_info->GlobalNotationTable[s];
     1083        if(notationID==0){     
     1084                model_info->GlobalNotationTable[s]=++(model_info->globalNotationCount);
     1085                notationID = model_info->globalNotationCount;
     1086        }
     1087        else /*Duplicate notation name!*/
     1088                Error_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     1089               
    10301090        requireWS();
    10311091        if(at_SYSTEM<C>(cur())){
  • trunk/src/engine.h

    r93 r94  
    9898        void Parse_Cp();
    9999        void Parse_AttlistDecl ();
     100        void Parse_Notation (ATT_info * this_info);
    100101        void Parse_Enumeration (ATT_info * this_info);
    101102        void Parse_DefaultDecl (ATT_info * this_info);
  • trunk/src/xmlmodel.h

    r93 r94  
    130130        hash_map<const char *, int, hash<const char *>, eqstr > GlobalAttributeTable;
    131131        hash_map<const char *, int, hash<const char *>, eqstr > GlobalElementTable;
     132        hash_map<const char *, int, hash<const char *>, eqstr > GlobalNotationTable;
    132133        int globalElementCount;
    133134        int globalAttributeCount;
     135        int globalNotationCount;
    134136       
    135137    /* For each element, we have an ElementAttributeModel */
Note: See TracChangeset for help on using the changeset viewer.