Changeset 125 for trunk/src/engine.c


Ignore:
Timestamp:
May 2, 2008, 10:10:52 AM (11 years ago)
Author:
lindanl
Message:

Character references: calculation and error detection.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r124 r125  
    447447        }
    448448}
    449 
     449       
    450450template <CodeUnit_Base C>
    451451inline void ParsingEngine<C>::Parse_CharRef() {
    452452        Advance(2);  // skip "&#"
     453        int ch_val = 0;
    453454        if (AtChar<C,'x'>(cur())) {
    454455                Advance(1);
    455                 int hex_pos = AbsPos();
    456                 ScanTo(NonHex);
    457                 if (AbsPos() == hex_pos) Syntax_Error(NT_CharRef);
     456                while(at_HexDigit<C>(cur())){
     457                        ch_val = HexVal<C>(cur()[0]) + (ch_val<<4);
     458                        if (ch_val> 0x10FFFF )
     459                                WF_Error(wfErr_wf_Legalchar);
     460                        Advance(1);
     461                }
    458462        }
    459463        else {
    460                 int num_pos = AbsPos();
    461                 ScanTo(NonDigit);
    462                 if (AbsPos() == num_pos) Syntax_Error(NT_CharRef); 
    463         }       
     464                while(at_Digit<C>(cur())){
     465                        ch_val = DigitVal<C>(cur()[0]) + ch_val*10;
     466                        if (ch_val> 0x10FFFF )
     467                                WF_Error(wfErr_wf_Legalchar);
     468                        Advance(1);
     469                }
     470        }
     471        if ((ch_val == 0x0) || ((ch_val | 0x7FF) == 0xDFFF)|| ((ch_val | 0x1) == 0xFFFF))
     472                                WF_Error(wfErr_wf_Legalchar);   
     473                else  if (entity_Info->version != XML_1_1)
     474                        if (((ch_val < 0x20) && (ch_val != 0x9) && (ch_val != 0xD) && (ch_val != 0xA)))
     475                                WF_Error(wfErr_wf_Legalchar);
     476                               
    464477        if (!AtChar<C,';'>(cur())) {
    465478                        Syntax_Error(NT_CharRef);
    466479        }
    467         else {
    468                 Advance(1);
    469                 Reference_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
    470         }
     480                else {
     481                        Advance(1);
     482                        Reference_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     483                }
    471484}
    472485
     
    16821695                       
    16831696                }
    1684                 char * temp = replText;
    1685                 replText = cat_string (temp,(char *)GetCodeUnitPtr(quot_start), strlen(temp), AbsPos()-quot_start);
    1686                 free(temp);
     1697                replText = cat_string (replText,(char *)GetCodeUnitPtr(quot_start), strlen(replText), AbsPos()-quot_start);
    16871698        }
    16881699        this_info->ReplacementText = replText;
Note: See TracChangeset for help on using the changeset viewer.