瀏覽代碼

nesting of long strings only in compatibility mode

Roberto Ierusalimschy 20 年之前
父節點
當前提交
cf5d1bdd76
共有 2 個文件被更改,包括 32 次插入10 次删除
  1. 24 9
      llex.c
  2. 8 1
      luaconf.h

+ 24 - 9
llex.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: llex.c,v 2.8 2004/12/03 20:44:19 roberto Exp roberto $
+** $Id: llex.c,v 2.9 2004/12/03 20:54:12 roberto Exp roberto $
 ** Lexical Analyzer
 ** Lexical Analyzer
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -202,6 +202,7 @@ static int skip_sep (LexState *ls) {
 
 
 static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
 static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
   int cont = 0;
   int cont = 0;
+  (void)(cont);  /* avoid warnings when `cont' is not used */
   save_and_next(ls);  /* skip 2nd `[' */
   save_and_next(ls);  /* skip 2nd `[' */
   if (currIsNewline(ls))  /* string starts with a newline? */
   if (currIsNewline(ls))  /* string starts with a newline? */
     inclinenumber(ls);  /* skip it */
     inclinenumber(ls);  /* skip it */
@@ -211,27 +212,41 @@ static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
         luaX_lexerror(ls, (seminfo) ? "unfinished long string" :
         luaX_lexerror(ls, (seminfo) ? "unfinished long string" :
                                    "unfinished long comment", TK_EOS);
                                    "unfinished long comment", TK_EOS);
         break;  /* to avoid warnings */
         break;  /* to avoid warnings */
-      case '[':
+#if defined(LUA_COMPAT_LSTR)
+      case '[': {
         if (skip_sep(ls) == sep) {
         if (skip_sep(ls) == sep) {
           save_and_next(ls);  /* skip 2nd `[' */
           save_and_next(ls);  /* skip 2nd `[' */
           cont++;
           cont++;
+#if LUA_COMPAT_LSTR == 1
+          if (sep == 0)
+            luaX_lexerror(ls, "nesting of [[...]] is deprecated", '[');
+#endif
         }
         }
-        continue;
-      case ']':
+        break;
+      }
+#endif
+      case ']': {
         if (skip_sep(ls) == sep) {
         if (skip_sep(ls) == sep) {
           save_and_next(ls);  /* skip 2nd `]' */
           save_and_next(ls);  /* skip 2nd `]' */
-          if (cont-- == 0) goto endloop;
+#if defined(LUA_COMPAT_LSTR) && LUA_COMPAT_LSTR == 2
+          cont--;
+          if (sep == 0 && cont >= 0) break;
+#endif
+          goto endloop;
         }
         }
-        continue;
+        break;
+      }
       case '\n':
       case '\n':
-      case '\r':
+      case '\r': {
         save(ls, '\n');
         save(ls, '\n');
         inclinenumber(ls);
         inclinenumber(ls);
         if (!seminfo) luaZ_resetbuffer(ls->buff);  /* avoid wasting space */
         if (!seminfo) luaZ_resetbuffer(ls->buff);  /* avoid wasting space */
-        continue;
-      default:
+        break;
+      }
+      default: {
         if (seminfo) save_and_next(ls);
         if (seminfo) save_and_next(ls);
         else next(ls);
         else next(ls);
+      }
     }
     }
   } endloop:
   } endloop:
   if (seminfo)
   if (seminfo)

+ 8 - 1
luaconf.h

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: luaconf.h,v 1.43 2005/04/07 13:52:45 roberto Exp roberto $
+** $Id: luaconf.h,v 1.44 2005/04/25 19:24:10 roberto Exp roberto $
 ** Configuration file for Lua
 ** Configuration file for Lua
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -267,6 +267,13 @@
 */
 */
 #define LUA_COMPAT_VARARG	1
 #define LUA_COMPAT_VARARG	1
 
 
+/*
+@@ LUA_COMPAT_LSTR controls compatibility with old long string nesting
+@* facility.
+** CHANGE it to 2 if you want the old behaviour, or undefine it to turn
+** off the advisory error when nesting [[...]].
+*/
+#define LUA_COMPAT_LSTR		1
 
 
 /*
 /*
 @@ luai_apicheck is the assert macro used by the Lua-C API.
 @@ luai_apicheck is the assert macro used by the Lua-C API.