Changeset 165 for trunk/src/xmldecl.c


Ignore:
Timestamp:
Jun 23, 2008, 5:58:19 AM (11 years ago)
Author:
cameron
Message:

new/delete for encoding; DeclError?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/xmldecl.c

    r164 r165  
    2020
    2121Entity_Info::Entity_Info() {
     22        encoding = NULL;
    2223}
    2324Entity_Info::~Entity_Info() {
    24         free(encoding);
     25        delete [] encoding;
    2526}
    2627
     
    104105
    105106template <CodeUnit_Base C>
     107inline void XML_Decl_Parser<C>::DeclError() {
     108        DeclarationError(AbsPos());
     109}
     110
     111template <CodeUnit_Base C>
    106112inline int XML_Decl_Parser<C>::AbsPos() const {
    107113        return  buffer_base_pos + buffer_rel_pos;
     
    142148
    143149template <CodeUnit_Base C>
    144 int XML_Decl_Parser<C>::EncodingAction(Entity_Info & e, int start_pos, int end_pos) {
    145         e.encoding = (unsigned char *) malloc(end_pos-start_pos+1);
    146         memcpy(e.encoding, &x8data[start_pos-buffer_base_pos], end_pos - start_pos);
    147         e.encoding[end_pos - start_pos] = '\0';
    148 }
    149 
    150 
    151 template <CodeUnit_Base C>
    152150inline void XML_Decl_Parser<C>::ParseVersion(Entity_Info & e) {
    153151        /* Skip "version" */
    154152        Advance(7);
    155153        Scan_WS();
    156         if (!AtChar<C,'='>(cur())) DeclarationError(AbsPos());
     154        if (!AtChar<C,'='>(cur())) DeclError();
    157155        Advance(1);
    158156        Scan_WS();
    159157        if (at_1_0<C>(cur())) e.version = XML_1_0;
    160158        else if (at_1_1<C>(cur())) e.version = XML_1_1;
    161         else DeclarationError(AbsPos());
     159        else DeclError();
    162160        Advance(5);
    163161}
     
    169167        e.has_encoding_decl = true;
    170168        Scan_WS();
    171         if (!AtChar<C,'='>(cur())) DeclarationError(AbsPos());
     169        if (!AtChar<C,'='>(cur())) DeclError();
    172170        Advance(1);
    173171        Scan_WS();
     
    175173                unsigned char quoteCh = cur()[0];
    176174                Advance(1);
    177                 int encoding_start_pos = AbsPos();
     175                int start_pos = AbsPos();
    178176                ScanToQuote();
    179                 if (cur()[0] != quoteCh) DeclarationError(AbsPos());
    180                 EncodingAction(e, encoding_start_pos, AbsPos());
    181         }
    182         else DeclarationError(AbsPos());
     177                if (cur()[0] != quoteCh) DeclError();
     178                int end_pos = AbsPos();
     179                e.encoding = new unsigned char[end_pos - start_pos + 1];
     180                memcpy(e.encoding, &x8data[start_pos-buffer_base_pos], end_pos - start_pos);
     181                e.encoding[end_pos - start_pos] = '\0';
     182        }
     183        else DeclError();
    183184        Advance(1);
    184185}
     
    189190        Advance(10);
    190191        Scan_WS();
    191         if (!AtChar<C,'='>(cur())) DeclarationError(AbsPos());
     192        if (!AtChar<C,'='>(cur())) DeclError();
    192193        Advance(1);
    193194        Scan_WS();
    194195        if (at_yes<C>(cur())) {Advance(5); e.standalone = Standalone_yes;}
    195196        else if (at_no<C>(cur())) {Advance(4); e.standalone = Standalone_no;}
    196         else DeclarationError(AbsPos());
    197 }
    198 
    199 
    200 
    201 
    202 //
     197        else DeclError();
     198}
     199
    203200template <CodeUnit_Base C>
    204201void XML_Decl_Parser<C>::ReadXMLInfo(Entity_Info & e) {
     
    216213        Advance(6);
    217214        Scan_WS();
    218         if (!at_version<C>(cur())) DeclarationError(AbsPos());
     215        if (!at_version<C>(cur())) DeclError();
    219216        ParseVersion(e);
    220217        if (at_PI_End<C>(cur())) {
     
    222219                return;
    223220        }
    224         if (!at_WhiteSpace_10<C>(cur())) DeclarationError(AbsPos());
     221        if (!at_WhiteSpace_10<C>(cur())) DeclError();
    225222        Scan_WS();
    226223        if (at_encoding<C>(cur())) {
     
    230227                        return;
    231228                }
    232                 if (!at_WhiteSpace_10<C>(cur())) DeclarationError(AbsPos());
     229                if (!at_WhiteSpace_10<C>(cur())) DeclError();
    233230                Scan_WS();
    234231        }
     
    237234                Scan_WS();
    238235        }
    239         if (!at_PI_End<C>(cur())) DeclarationError(AbsPos());
     236        if (!at_PI_End<C>(cur())) DeclError();
    240237        e.content_start = AbsPos()+2;
    241238}
     
    263260                ParseVersion(e);
    264261                // Must have whitespace character before encoding declaration.
    265                 if (!at_WhiteSpace_10<C>(cur())) DeclarationError(AbsPos());
    266                 Scan_WS();
    267         }
    268         if (!at_encoding<C>(cur())) DeclarationError(AbsPos());
     262                if (!at_WhiteSpace_10<C>(cur())) DeclError();
     263                Scan_WS();
     264        }
     265        if (!at_encoding<C>(cur())) DeclError();
    269266        ParseEncoding(e);
    270267        Scan_WS();
    271         if (!at_PI_End<C>(cur())) DeclarationError(AbsPos());   ParseVersion(e);
     268        if (!at_PI_End<C>(cur())) DeclError();  ParseVersion(e);
    272269        if (at_PI_End<C>(cur())) {
    273270                e.content_start = AbsPos()+2;
     
    299296                        return;
    300297                }
    301                 if (!at_WhiteSpace_10<C>(cur())) DeclarationError(AbsPos());
     298                if (!at_WhiteSpace_10<C>(cur())) DeclError();
    302299                Scan_WS();
    303300                if (at_encoding<C>(cur())) {
     
    307304                                return;
    308305                        }
    309                         if (!at_WhiteSpace_10<C>(cur())) DeclarationError(AbsPos());
     306                        if (!at_WhiteSpace_10<C>(cur())) DeclError();
    310307                        Scan_WS();
    311308                }
     
    317314        else {  // Without version, we can only have a text declaration,
    318315                // in which case an encoding spec is required.
    319                 if (!at_encoding<C>(cur())) DeclarationError(AbsPos());
     316                if (!at_encoding<C>(cur())) DeclError();
    320317                ParseEncoding();
    321318                Scan_WS();
    322319                // No standalone spec is allowed in a text declaration.
    323320        }
    324         if (!at_PI_End<C>(cur())) DeclarationError(AbsPos());   
     321        if (!at_PI_End<C>(cur())) DeclError(); 
    325322        e.content_start = AbsPos()+2;
    326323}
Note: See TracChangeset for help on using the changeset viewer.