Преглед на файлове

Fix handling C++ style multi line

mingodad преди 9 години
родител
ревизия
f9addc2dfa
променени са 1 файла, в които са добавени 14 реда и са изтрити 1 реда
  1. 14 1
      SquiLu/squirrel/sqlexer.cpp

+ 14 - 1
SquiLu/squirrel/sqlexer.cpp

@@ -597,6 +597,7 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
         }
         }
 	}
 	}
 	for(;;) {
 	for(;;) {
+try_again:
 		while(CUR_CHAR != ndelim) {
 		while(CUR_CHAR != ndelim) {
             SQInteger x = CUR_CHAR;
             SQInteger x = CUR_CHAR;
 			switch(x) {
 			switch(x) {
@@ -687,12 +688,24 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 		    NEXT();
 		    NEXT();
 		}
 		}
 		else if(saved_ndelim == _SC('R')) {
 		else if(saved_ndelim == _SC('R')) {
+            if(CUR_CHAR == ndelim)
+            {
+                APPEND_CHAR(ndelim);
+                goto try_again;
+            }
             size_t i = 0;
             size_t i = 0;
             for(;(i < sizeof(cpp_delimin)-1) && (CUR_CHAR != _SC('"')) && cpp_delimin[i]; ++i)
             for(;(i < sizeof(cpp_delimin)-1) && (CUR_CHAR != _SC('"')) && cpp_delimin[i]; ++i)
             {
             {
                 if(CUR_CHAR != cpp_delimin[i])
                 if(CUR_CHAR != cpp_delimin[i])
                 {
                 {
-                    return Error(_SC("expect \"%s\" to close literal delimiter"), cpp_delimin);
+                    //false positive append all chars till here and continue
+                    APPEND_CHAR(ndelim);
+                    for(int j=0; j < i; ++j) APPEND_CHAR(cpp_delimin[j]); //recover already eaten chars from buffer
+                    APPEND_CHAR(CUR_CHAR); //append the last one that mismatch
+                    if(CUR_CHAR == _SC('\n')) data->currentline++;
+                    NEXT();
+                    goto try_again;
+                    //return Error(_SC("expect \"%s\" to close literal delimiter"), cpp_delimin);
                 }
                 }
                 NEXT();
                 NEXT();
             }
             }