changeset 53:1786c2825491

- Fixed scanner for hex string literals. Terminating string with 0. Relocated some code to the bottom.
author aziz
date Wed, 27 Jun 2007 17:50:01 +0000
parents f65a83c27638
children e55bd2270f94
files trunk/src/Lexer.d
diffstat 1 files changed, 22 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Lexer.d	Wed Jun 27 17:18:02 2007 +0000
+++ b/trunk/src/Lexer.d	Wed Jun 27 17:50:01 2007 +0000
@@ -874,45 +874,35 @@
   void scanHexStringLiteral(ref Token t)
   {
     assert(p[0] == 'x' && p[1] == '"');
-    p+=2;
     t.type = TOK.String;
 
     uint c;
     ubyte[] buffer;
     ubyte h; // hex number
     uint n; // number of hex digits
-    MID mid;
 
+    ++p;
     while (1)
     {
-      c = *p++;
+      c = *++p;
       switch (c)
       {
       case '"':
+        ++p;
         if (n & 1)
-        {
-          mid = MID.OddNumberOfDigitsInHexString;
-          error(mid);
-        }
+          error(MID.OddNumberOfDigitsInHexString);
+        t.pf = scanPostfix();
+      Lreturn:
+        buffer ~= 0;
         t.str = cast(string) buffer;
-        t.pf = scanPostfix();
         t.end = p;
         return;
       case '\r':
-        if (*p == '\n')
+        if (p[1] == '\n')
           ++p;
       case '\n':
         ++loc;
         continue;
-      case LS[0]:
-        if (*p == LS[1] && (p[1] == LS[2] || p[1] == PS[2])) {
-          p += 2;
-          ++loc;
-        }
-        continue;
-      case 0, _Z_:
-        mid = MID.UnterminatedHexString;
-        goto Lerr;
       default:
         if (ishexad(c))
         {
@@ -936,16 +926,22 @@
         }
         else if (isspace(c))
           continue;
-        mid = MID.NonHexCharInHexString;
-        goto Lerr;
+        else if (c == LS[0] && p[1] == LS[1] && (p[2] == LS[2] || p[2] == PS[2]))
+        {
+          ++p; ++p;
+          ++loc;
+          continue;
+        }
+        else if (c == 0 || c == _Z_)
+        {
+          error(MID.UnterminatedHexString);
+          t.pf = 0;
+          goto Lreturn;
+        }
+        error(MID.NonHexCharInHexString);
       }
     }
-
-    return;
-  Lerr:
-    error(mid);
-    t.pf = 0;
-    t.end = p;
+    assert(0);
   }
 
   dchar scanEscapeSequence()