|
@@ -452,7 +452,7 @@ lsp_kepler_reader_impl(lua_State *L, void *ud, size_t *sz)
|
|
/* State 1: plain text - put inside mg.write(...) */
|
|
/* State 1: plain text - put inside mg.write(...) */
|
|
for (;;) {
|
|
for (;;) {
|
|
/* Find next tag */
|
|
/* Find next tag */
|
|
- while ((i < left) && (reader->begin[i + reader->state] != '<')) {
|
|
|
|
|
|
+ while ((i < left) && (reader->begin[i + reader->consumed] != '<')) {
|
|
i++;
|
|
i++;
|
|
}
|
|
}
|
|
if (i > 0) {
|
|
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 (reader->begin[reader->state] == '<') */
|
|
/* assert (i == 0) */
|
|
/* assert (i == 0) */
|
|
- if (0 == memcmp(reader->begin + reader->state, "<?lua", 5)) {
|
|
|
|
|
|
+ if (0 == memcmp(reader->begin + reader->consumed, "<?lua", 5)) {
|
|
i = 5;
|
|
i = 5;
|
|
|
|
+ reader->tag = '?';
|
|
break;
|
|
break;
|
|
- } else if (0 == memcmp(reader->begin + reader->state, "<%", 2)) {
|
|
|
|
|
|
+ } else if (0 == memcmp(reader->begin + reader->consumed, "<%", 2)) {
|
|
i = 2;
|
|
i = 2;
|
|
|
|
+ reader->tag = '%';
|
|
break;
|
|
break;
|
|
} else {
|
|
} else {
|
|
i = 1;
|
|
i = 1;
|
|
@@ -479,42 +481,52 @@ lsp_kepler_reader_impl(lua_State *L, void *ud, size_t *sz)
|
|
* file/data block */
|
|
* file/data block */
|
|
ret = "]=======]);\n";
|
|
ret = "]=======]);\n";
|
|
*sz = strlen(ret);
|
|
*sz = strlen(ret);
|
|
- reader->state == 2;
|
|
|
|
- reader->tag = reader->begin[1];
|
|
|
|
|
|
+ reader->state = 2;
|
|
reader->consumed += i; /* length of <?lua or <% tag */
|
|
reader->consumed += i; /* length of <?lua or <% tag */
|
|
return ret;
|
|
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 */
|
|
/* Must never be reached */
|
|
*sz = 0;
|
|
*sz = 0;
|
|
@@ -525,8 +537,9 @@ static const char *
|
|
lsp_kepler_reader(lua_State *L, void *ud, size_t *sz)
|
|
lsp_kepler_reader(lua_State *L, void *ud, size_t *sz)
|
|
{
|
|
{
|
|
/* debugging */
|
|
/* debugging */
|
|
|
|
+ struct lsp_var_reader_data *reader = (struct lsp_var_reader_data *)ud;
|
|
const char *ret = lsp_kepler_reader_impl(L, ud, sz);
|
|
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;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -566,13 +579,11 @@ run_lsp(struct mg_connection *conn,
|
|
/* Syntax error or OOM.
|
|
/* Syntax error or OOM.
|
|
* Error message is pushed on stack. */
|
|
* Error message is pushed on stack. */
|
|
lua_pcall(L, 1, 0, 0);
|
|
lua_pcall(L, 1, 0, 0);
|
|
- printf("XXX err\n");
|
|
|
|
lua_cry(conn, lua_ok, L, "LSP", "execute"); /* XXX TODO: everywhere ! */
|
|
lua_cry(conn, lua_ok, L, "LSP", "execute"); /* XXX TODO: everywhere ! */
|
|
|
|
|
|
} else {
|
|
} else {
|
|
/* Success loading chunk. Call it. */
|
|
/* Success loading chunk. Call it. */
|
|
lua_pcall(L, 0, 0, 1);
|
|
lua_pcall(L, 0, 0, 1);
|
|
- printf("XXX succ\n");
|
|
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|