changeset 433:063cd016c913

Fixed some issues in scanEscapeSequence().
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Thu, 04 Oct 2007 22:31:59 +0200
parents 3ead178e0662
children cac9c8d637ad
files trunk/src/dil/Lexer.d
diffstat 1 files changed, 19 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/Lexer.d	Thu Oct 04 16:50:59 2007 +0200
+++ b/trunk/src/dil/Lexer.d	Thu Oct 04 22:31:59 2007 +0200
@@ -1787,6 +1787,9 @@
 } // version(D2)
 
   dchar scanEscapeSequence()
+  out(result)
+  { assert(isEncodable(result)); }
+  body
   {
     assert(*p == '\\');
 
@@ -1799,12 +1802,13 @@
       ++p;
       return c;
     }
+
     uint digits = 2;
 
     switch (*p)
     {
     case 'x':
-      c = 0;
+      assert(c == 0);
       while (1)
       {
         ++p;
@@ -1821,23 +1825,19 @@
           if (!--digits)
           {
             ++p;
+            if (isEncodable(c))
+              return c; // Return valid escape value.
+
+            error(sequenceStart, MID.InvalidUnicodeEscapeSequence, sequenceStart[0..p-sequenceStart]);
             break;
           }
+          continue;
         }
-        else
-        {
-          error(sequenceStart, MID.InsufficientHexDigits);
-          return REPLACEMENT_CHAR;
-        }
-      }
 
-      if (!isEncodable(c))
-      {
-        c = REPLACEMENT_CHAR;
-        assert(*sequenceStart == '\\');
-        error(sequenceStart, MID.InvalidUnicodeEscapeSequence, sequenceStart[0..p-sequenceStart]);
+        error(sequenceStart, MID.InsufficientHexDigits);
+        break;
       }
-      return c;
+      break;
     case 'u':
       digits = 4;
       goto case 'x';
@@ -1847,7 +1847,7 @@
     default:
       if (isoctal(*p))
       {
-        c = 0;
+        assert(c == 0);
         c += *p - '0';
         ++p;
         if (!isoctal(*p))
@@ -1860,6 +1860,7 @@
         c *= 8;
         c += *p - '0';
         ++p;
+        return c; // Return valid escape value.
       }
       else if(*p == '&')
       {
@@ -1874,7 +1875,9 @@
             // Pass entity excluding '&' and ';'.
             c = entity2Unicode(begin[0..p - begin]);
             ++p; // Skip ;
-            if (c == 0xFFFF)
+            if (c != 0xFFFF)
+              return c; // Return valid escape value.
+            else
               error(sequenceStart, MID.UndefinedHTMLEntity, sequenceStart[0 .. p - sequenceStart]);
           }
           else
@@ -1904,8 +1907,7 @@
         error(sequenceStart, MID.UndefinedEscapeSequence, str);
       }
     }
-
-    return c;
+    return REPLACEMENT_CHAR; // Error: return replacement character.
   }
 
   /*