[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/3.5/kdelibs/kjs
From:       Harri Porten <porten () kde ! org>
Date:       2007-02-17 8:37:44
Message-ID: 1171701464.825874.12317.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 634407 by porten:

parse null characters (backported from trunk)


 M  +4 -0      ChangeLog  
 M  +17 -10    lexer.cpp  
 M  +3 -2      lexer.h  


--- branches/KDE/3.5/kdelibs/kjs/ChangeLog #634406:634407
@@ -1,3 +1,7 @@
+2007-02-17  Harri Porten  <porten@kde.org>
+
+	* lexer.cpp: parse code with null characters in them 
+
 2007-02-10  Harri Porten  <porten@kde.org>
 
 	* lexer.cpp: support named function expressions 
--- branches/KDE/3.5/kdelibs/kjs/lexer.cpp #634406:634407
@@ -120,10 +120,10 @@
 #endif
 
   // read first characters
-  current = (length > 0) ? code[0].uc : 0;
-  next1 = (length > 1) ? code[1].uc : 0;
-  next2 = (length > 2) ? code[2].uc : 0;
-  next3 = (length > 3) ? code[3].uc : 0;
+  current = (length > 0) ? code[0].uc : -1;
+  next1 = (length > 1) ? code[1].uc : -1;
+  next2 = (length > 2) ? code[2].uc : -1;
+  next3 = (length > 3) ? code[3].uc : -1;
 }
 
 void Lexer::shift(unsigned int p)
@@ -133,7 +133,7 @@
     current = next1;
     next1 = next2;
     next2 = next3;
-    next3 = (pos + 3 < length) ? code[pos+3].uc : 0;
+    next3 = (pos + 3 < length) ? code[pos+3].uc : -1;
   }
 }
 
@@ -201,7 +201,7 @@
       } else if (current == '/' && next1 == '*') {
         shift(1);
         state = InMultiLineComment;
-      } else if (current == 0) {
+      } else if (current == -1) {
         if (!terminator && !delimited) {
           // automatic semicolon insertion if program incomplete
           token = ';';
@@ -258,7 +258,7 @@
       if (current == stringType) {
         shift(1);
         setDone(String);
-      } else if (current == 0 || isLineTerminator) {
+      } else if (current == -1 || isLineTerminator) {
         setDone(Bad);
       } else if (current == '\\') {
         state = InEscapeSequence;
@@ -333,12 +333,12 @@
           setDone(Other);
         } else
           state = Start;
-      } else if (current == 0) {
+      } else if (current == -1) {
         setDone(Eof);
       }
       break;
     case InMultiLineComment:
-      if (current == 0) {
+      if (current == -1) {
         setDone(Bad);
       } else if (isLineTerminator) {
         nextLine();
@@ -817,6 +817,13 @@
   buffer8[pos8++] = (char) c;
 }
 
+void Lexer::record16(int c)
+{
+  assert(c >= 0);
+  //assert(c <= USHRT_MAX);
+  record16(UChar(static_cast<unsigned short>(c)));
+}
+
 void Lexer::record16(UChar c)
 {
   // enlarge buffer if full
@@ -838,7 +845,7 @@
   bool inBrackets = false;
 
   while (1) {
-    if (current == '\r' || current == '\n' || current == 0)
+    if (current == '\r' || current == '\n' || current == -1)
       return false;
     else if (current != '/' || lastWasEscape == true || inBrackets == true)
     {
--- branches/KDE/3.5/kdelibs/kjs/lexer.h #634406:634407
@@ -129,6 +129,7 @@
   private:
 
     void record8(unsigned short c);
+    void record16(int c);
     void record16(UChar c);
 
     KJS::Identifier *makeIdentifier(UChar *buffer, unsigned int pos);
@@ -141,8 +142,8 @@
     int bol;     // begin of line
 #endif
 
-    // current and following unicode characters
-    unsigned short current, next1, next2, next3;
+    // current and following unicode characters (int to allow for -1 for end-of-file marker)
+    int current, next1, next2, next3;
 
     UString **strings;
     unsigned int numStrings;
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic