libs/web: add support for string templates to the template parser
authorJo-Philipp Wich <jow@openwrt.org>
Thu, 4 Sep 2014 11:35:09 +0000 (11:35 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 4 Sep 2014 11:35:09 +0000 (11:35 +0000)
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
modules/base/src/template_lualib.c
modules/base/src/template_parser.c
modules/base/src/template_parser.h

index 0d43641041091cdd68d82c0000da23e5fa40ac6d..1035611885fdf69d6c4e61e704f6ccd1bc366519 100644 (file)
 
 #include "template_lualib.h"
 
-int template_L_parse(lua_State *L)
+static int template_L_do_parse(lua_State *L, struct template_parser *parser, const char *chunkname)
 {
-       const char *file = luaL_checkstring(L, 1);
-       struct template_parser *parser = template_open(file);
        int lua_status, rv;
 
        if (!parser)
@@ -32,7 +30,7 @@ int template_L_parse(lua_State *L)
                return 3;
        }
 
-       lua_status = lua_load(L, template_reader, parser, file);
+       lua_status = lua_load(L, template_reader, parser, chunkname);
 
        if (lua_status == 0)
                rv = 1;
@@ -44,6 +42,23 @@ int template_L_parse(lua_State *L)
        return rv;
 }
 
+int template_L_parse(lua_State *L)
+{
+       const char *file = luaL_checkstring(L, 1);
+       struct template_parser *parser = template_open(file);
+
+       return template_L_do_parse(L, parser, file);
+}
+
+int template_L_parse_string(lua_State *L)
+{
+       size_t len;
+       const char *str = luaL_checklstring(L, 1, &len);
+       struct template_parser *parser = template_string(str, len);
+
+       return template_L_do_parse(L, parser, "[string]");
+}
+
 int template_L_utf8(lua_State *L)
 {
        size_t len = 0;
@@ -146,6 +161,7 @@ static int template_L_hash(lua_State *L) {
 /* module table */
 static const luaL_reg R[] = {
        { "parse",                              template_L_parse },
+       { "parse_string",               template_L_parse_string },
        { "utf8",                               template_L_utf8 },
        { "pcdata",                             template_L_pcdata },
        { "striptags",                  template_L_striptags },
index 1aa5131ffe756a9905a2e05669006814bee772af..c263fbf9fdc9f6994718238d38611ba0aeca5f0a 100644 (file)
@@ -100,6 +100,36 @@ err:
        return NULL;
 }
 
+struct template_parser * template_string(const char *str, uint32_t len)
+{
+       struct template_parser *parser;
+
+       if (!str) {
+               errno = EINVAL;
+               goto err;
+       }
+
+       if (!(parser = malloc(sizeof(*parser))))
+               goto err;
+
+       memset(parser, 0, sizeof(*parser));
+       parser->fd = -1;
+
+       parser->size = len;
+       parser->data = (char*)str;
+
+       parser->off = parser->data;
+       parser->cur_chunk.type = T_TYPE_INIT;
+       parser->cur_chunk.s    = parser->data;
+       parser->cur_chunk.e    = parser->data;
+
+       return parser;
+
+err:
+       template_close(parser);
+       return NULL;
+}
+
 void template_close(struct template_parser *parser)
 {
        if (!parser)
@@ -108,11 +138,14 @@ void template_close(struct template_parser *parser)
        if (parser->gc != NULL)
                free(parser->gc);
 
-       if ((parser->data != NULL) && (parser->data != MAP_FAILED))
-               munmap(parser->data, parser->size);
+       /* if file is not set, we were parsing a string */
+       if (parser->file) {
+               if ((parser->data != NULL) && (parser->data != MAP_FAILED))
+                       munmap(parser->data, parser->size);
 
-       if (parser->fd >= 0)
-               close(parser->fd);
+               if (parser->fd >= 0)
+                       close(parser->fd);
+       }
 
        free(parser);
 }
@@ -376,7 +409,7 @@ int template_error(lua_State *L, struct template_parser *parser)
                        line++;
 
        snprintf(msg, sizeof(msg), "Syntax error in %s:%d: %s",
-                        parser->file, line + chunkline, err ? err : "(unknown error)");
+                        parser->file ? parser->file : "[string]", line + chunkline, err ? err : "(unknown error)");
 
        lua_pushnil(L);
        lua_pushinteger(L, line + chunkline);
index ad03cbcfb27bae70aed3a27188375d7ee02f84e1..a3200a2df3899e8343d007e936702f95eb26bd71 100644 (file)
@@ -71,6 +71,7 @@ struct template_parser {
 };
 
 struct template_parser * template_open(const char *file);
+struct template_parser * template_string(const char *str, uint32_t len);
 void template_close(struct template_parser *parser);
 
 const char *template_reader(lua_State *L, void *ud, size_t *sz);