mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-19 23:39:31 +02:00
Three XPath scanner fixes:
* #12 is not a whitespace char; * '!' is not valid unless it is a part of '!=' token; * Accept full XML 1.0 name character range as identifiers. git-svn-id: trunk@13109 -
This commit is contained in:
parent
b340822af2
commit
9fe4f59c5a
@ -1548,8 +1548,6 @@ function TXPathScanner.NextToken: TXPathToken;
|
||||
Result := tkNumber;
|
||||
end;
|
||||
|
||||
const
|
||||
IdentifierChars = ['A'..'Z', 'a'..'z', '0'..'9', '.', '-', '_'];
|
||||
begin
|
||||
if FCurToken = tkEndOfStream then
|
||||
begin
|
||||
@ -1561,7 +1559,7 @@ begin
|
||||
versions will use WideStrings -sg }
|
||||
|
||||
// Skip whitespace
|
||||
while (FCurData[0] < #255) and (char(ord(FCurData[0])) in [#9, #10, #12, #13, ' ']) do
|
||||
while (FCurData[0] < #255) and (char(ord(FCurData[0])) in [#9, #10, #13, ' ']) do
|
||||
Inc(FCurData);
|
||||
|
||||
FTokenStart := FCurData;
|
||||
@ -1575,7 +1573,9 @@ begin
|
||||
begin
|
||||
Inc(FCurData);
|
||||
Result := tkNotEqual;
|
||||
end;
|
||||
end
|
||||
else
|
||||
Error(SScannerInvalidChar);
|
||||
'"':
|
||||
begin
|
||||
FTokenLength := 0;
|
||||
@ -1661,16 +1661,6 @@ begin
|
||||
Result := tkGreater;
|
||||
'@':
|
||||
Result := tkAt;
|
||||
'A'..'Z', 'a'..'z':
|
||||
begin
|
||||
FTokenLength := 1;
|
||||
Result := tkIdentifier;
|
||||
while (FCurData[1] < #255) and (char(ord(FCurData[1])) in IdentifierChars) do
|
||||
begin
|
||||
Inc(FCurData);
|
||||
Inc(FTokenLength);
|
||||
end;
|
||||
end;
|
||||
'[':
|
||||
Result := tkLeftSquareBracket;
|
||||
']':
|
||||
@ -1678,7 +1668,19 @@ begin
|
||||
'|':
|
||||
Result := tkPipe;
|
||||
else
|
||||
Error(SScannerInvalidChar);
|
||||
// TODO: no surrogate pairs/XML 1.1 support yet
|
||||
if Byte(FCurData^) in NamingBitmap[NamePages[hi(Word(FCurData^))]] then
|
||||
begin
|
||||
FTokenLength := 1;
|
||||
Result := tkIdentifier;
|
||||
while Byte(FCurData[1]) in NamingBitmap[NamePages[$100+hi(Word(FCurData[1]))]] do
|
||||
begin
|
||||
Inc(FCurData);
|
||||
Inc(FTokenLength);
|
||||
end;
|
||||
end
|
||||
else
|
||||
Error(SScannerInvalidChar);
|
||||
end;
|
||||
|
||||
// We have processed at least one character now; eat it:
|
||||
|
Loading…
Reference in New Issue
Block a user