瀏覽代碼

Allow Kepler Syntax for Lua Server pages (part 4/?)

bel2125 7 年之前
父節點
當前提交
7093a45ea0
共有 1 個文件被更改,包括 44 次插入33 次删除
  1. 44 33
      src/mod_lua.inl

+ 44 - 33
src/mod_lua.inl

@@ -452,7 +452,7 @@ lsp_kepler_reader_impl(lua_State *L, void *ud, size_t *sz)
 		/* State 1: plain text - put inside mg.write(...) */
 		for (;;) {
 			/* Find next tag */
-			while ((i < left) && (reader->begin[i + reader->state] != '<')) {
+			while ((i < left) && (reader->begin[i + reader->consumed] != '<')) {
 				i++;
 			}
 			if (i > 0) {
@@ -465,11 +465,13 @@ lsp_kepler_reader_impl(lua_State *L, void *ud, size_t *sz)
 
 			/* assert (reader->begin[reader->state] == '<') */
 			/* assert (i == 0) */
-			if (0 == memcmp(reader->begin + reader->state, "<?lua", 5)) {
+			if (0 == memcmp(reader->begin + reader->consumed, "<?lua", 5)) {
 				i = 5;
+				reader->tag = '?';
 				break;
-			} else if (0 == memcmp(reader->begin + reader->state, "<%", 2)) {
+			} else if (0 == memcmp(reader->begin + reader->consumed, "<%", 2)) {
 				i = 2;
+				reader->tag = '%';
 				break;
 			} else {
 				i = 1;
@@ -479,42 +481,52 @@ lsp_kepler_reader_impl(lua_State *L, void *ud, size_t *sz)
 		 * file/data block */
 		ret = "]=======]);\n";
 		*sz = strlen(ret);
-		reader->state == 2;
-		reader->tag = reader->begin[1];
+		reader->state = 2;
 		reader->consumed += i; /* length of <?lua or <% tag */
 		return ret;
 	}
 
-	/* State 2: Lua code - keep outside mg.write(...) */
-	for (;;) {
-		/* Find end tag */
-		while ((i < left)
-		       && (reader->begin[i + reader->state] != reader->tag)) {
-			i++;
-		}
-		if (i > 0) {
-			/* Check for closing tag */
-			if ((i + 1 < left) && (reader->begin[i + reader->state] == '>')) {
-				i--;                   /* don't send the tag */
-				reader->consumed += 2; /* but mark it as consumed */
-				reader->state = 3;
+	if (reader->state == 2) {
+		/* State 2: Lua code - keep outside mg.write(...) */
+
+		printf("XXXXXXXX search: [%c] xxxxxxxxxx\n", reader->tag);
+		for (;;) {
+			int close_tag_found = 0;
+
+			/* Find end tag */
+			while ((i < left)
+			       && (reader->begin[i + reader->consumed] != reader->tag)) {
+				i++;
+			}
+			if (i > 0) {
+				/* Forward all data inside the Lua script tag */
+				int64_t j = reader->consumed;
+				reader->consumed += i;
+				*sz = (size_t)i; /* cast is ok, i is limited to MG_BUF_LEN */
+
+				return reader->begin + j;
 			}
 
-			/* Forward all data inside the Lua script tag */
-			int64_t j = reader->consumed;
-			reader->consumed += i;
-			*sz = (size_t)i; /* cast is ok, i is limited to MG_BUF_LEN */
-			return reader->begin + j;
+			/* Is this the closing tag we are looking for? */
+			close_tag_found = ((i + 1 < left)
+			                   && (reader->begin[i + reader->consumed] == '>'));
+
+			if (close_tag_found) {
+				/* Drop close tag */
+				reader->consumed += 2;
+
+				/* Send a new opening tag to Lua */
+				ret = "\nmg.write([=======[";
+				*sz = strlen(ret);
+				reader->state = 1;
+				return ret;
+			} else {
+				/* Not a close tag, continue searching */
+				i++;
+			}
 		}
 	}
 
-	if (reader->state == 3) {
-		/* State 3: Send a new opening tag */
-		ret = "\nmg.write([=======[";
-		*sz = strlen(ret);
-		reader->state = 1;
-		return ret;
-	}
 
 	/* Must never be reached */
 	*sz = 0;
@@ -525,8 +537,9 @@ static const char *
 lsp_kepler_reader(lua_State *L, void *ud, size_t *sz)
 {
 	/* debugging */
+	struct lsp_var_reader_data *reader = (struct lsp_var_reader_data *)ud;
 	const char *ret = lsp_kepler_reader_impl(L, ud, sz);
-	printf("%.*s", *sz, ret);
+	printf("\n%.*s\n[%i]\n\n", *sz, ret, reader->state);
 	return ret;
 }
 
@@ -566,13 +579,11 @@ run_lsp(struct mg_connection *conn,
 		/* Syntax error or OOM.
 		 * Error message is pushed on stack. */
 		lua_pcall(L, 1, 0, 0);
-		printf("XXX err\n");
 		lua_cry(conn, lua_ok, L, "LSP", "execute"); /* XXX TODO: everywhere ! */
 
 	} else {
 		/* Success loading chunk. Call it. */
 		lua_pcall(L, 0, 0, 1);
-		printf("XXX succ\n");
 	}
 	return 0;
 }