Browse Source

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 -

sergei 16 years ago
parent
commit
9fe4f59c5a
1 changed files with 17 additions and 15 deletions
  1. 17 15
      packages/fcl-xml/src/xpath.pp

+ 17 - 15
packages/fcl-xml/src/xpath.pp

@@ -1548,8 +1548,6 @@ function TXPathScanner.NextToken: TXPathToken;
     Result := tkNumber;
     Result := tkNumber;
   end;
   end;
 
 
-const
-  IdentifierChars = ['A'..'Z', 'a'..'z', '0'..'9', '.', '-', '_'];
 begin
 begin
   if FCurToken = tkEndOfStream then
   if FCurToken = tkEndOfStream then
   begin
   begin
@@ -1561,7 +1559,7 @@ begin
     versions will use WideStrings  -sg }
     versions will use WideStrings  -sg }
 
 
   // Skip whitespace
   // 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);
     Inc(FCurData);
 
 
   FTokenStart := FCurData;
   FTokenStart := FCurData;
@@ -1575,7 +1573,9 @@ begin
       begin
       begin
         Inc(FCurData);
         Inc(FCurData);
         Result := tkNotEqual;
         Result := tkNotEqual;
-      end;
+      end
+      else
+        Error(SScannerInvalidChar);
     '"':
     '"':
       begin
       begin
         FTokenLength := 0;
         FTokenLength := 0;
@@ -1661,16 +1661,6 @@ begin
         Result := tkGreater;
         Result := tkGreater;
     '@':
     '@':
       Result := tkAt;
       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;
       Result := tkLeftSquareBracket;
     ']':
     ']':
@@ -1678,7 +1668,19 @@ begin
     '|':
     '|':
       Result := tkPipe;
       Result := tkPipe;
     else
     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;
   end;
 
 
   // We have processed at least one character now; eat it:
   // We have processed at least one character now; eat it: