Browse Source

xpath.pp: cleaned up and simplified TXPathScanner.GetToken()

git-svn-id: trunk@13842 -
sergei 16 years ago
parent
commit
7e731c78b6
1 changed files with 15 additions and 30 deletions
  1. 15 30
      packages/fcl-xml/src/xpath.pp

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

@@ -34,8 +34,7 @@ resourcestring
   SVarNoConversion = 'Conversion from %s to %s not possible';
 
   { Scanner errors }
-  SScannerQuotStringIsOpen = 'Ending ''"'' for string not found';
-  SScannerAposStringIsOpen = 'Ending "''" for string not found';
+  SScannerUnclosedString = 'String literal was not closed';
   SScannerInvalidChar = 'Invalid character';
   SScannerMalformedQName = 'Expected "*" or local part after colon';
   SScannerExpectedVarName = 'Expected variable name after "$"';
@@ -1674,6 +1673,8 @@ function TXPathScanner.GetToken: TXPathToken;
     Result := tkNumber;
   end;
 
+var
+  Delim: WideChar;
 begin
   // Skip whitespace
   while (FCurData[0] < #255) and (char(ord(FCurData[0])) in [#9, #10, #13, ' ']) do
@@ -1681,6 +1682,7 @@ begin
 
   FTokenStart := FCurData;
   FTokenLength := 0;
+  Result := tkInvalid;
 
   case FCurData[0] of
     #0:
@@ -1690,21 +1692,19 @@ begin
       begin
         Inc(FCurData);
         Result := tkNotEqual;
-      end
-      else
-        Error(SScannerInvalidChar);
-    '"':
+      end;
+    '"', '''':
       begin
-        FTokenLength := 0;
+        Delim := FCurData^;
         Inc(FCurData);
         FTokenStart := FCurData;
-        while FCurData[0] <> '"' do
+        while FCurData[0] <> Delim do
         begin
           if FCurData[0] = #0 then
-            Error(SScannerQuotStringIsOpen);
+            Error(SScannerUnclosedString);
           Inc(FCurData);
-          Inc(FTokenLength);
         end;
+        FTokenLength := FCurData-FTokenStart;
         Result := tkString;
       end;
     '$':
@@ -1717,20 +1717,6 @@ begin
           Error(SScannerExpectedVarName);
         Exit;
       end;
-    '''':
-      begin
-        FTokenLength := 0;
-        Inc(FCurData);
-        FTokenStart := FCurData;
-        while FCurData[0] <> '''' do
-        begin
-          if FCurData[0] = #0 then
-            Error(SScannerAposStringIsOpen);
-          Inc(FCurData);
-          Inc(FTokenLength);
-        end;
-        Result := tkString;
-      end;
     '(':
       Result := tkLeftBracket;
     ')':
@@ -1766,8 +1752,7 @@ begin
       begin
         Inc(FCurData);
         Result := tkColonColon;
-      end else
-        Error(SScannerInvalidChar);  // single colons are handled as part of identifier
+      end;
     '<':
       if FCurData[1] = '=' then
       begin
@@ -1809,13 +1794,13 @@ begin
       end
       else
         Error(SScannerMalformedQName);
-    end
-    else
-      Error(SScannerInvalidChar);
+    end;
   end;
 
+  if Result = tkInvalid then
+    Error(SScannerInvalidChar);
   // We have processed at least one character now; eat it:
-  if Result <> tkEndOfStream then
+  if Result > tkEndOfStream then
     Inc(FCurData);
 end;