123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- From: Matthias Schiffer <mschiffer@universe-factory.net>
- Date: Fri, 16 May 2014 11:37:21 +0200
- Subject: libs/web: add support for string templates to the template parser
- diff --git a/libs/web/src/template_lualib.c b/libs/web/src/template_lualib.c
- index 0d43641..1035611 100644
- --- a/libs/web/src/template_lualib.c
- +++ b/libs/web/src/template_lualib.c
- @@ -18,10 +18,8 @@
-
- #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 },
- diff --git a/libs/web/src/template_parser.c b/libs/web/src/template_parser.c
- index 1aa5131..c263fbf 100644
- --- a/libs/web/src/template_parser.c
- +++ b/libs/web/src/template_parser.c
- @@ -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);
- diff --git a/libs/web/src/template_parser.h b/libs/web/src/template_parser.h
- index ad03cbc..a3200a2 100644
- --- a/libs/web/src/template_parser.h
- +++ b/libs/web/src/template_parser.h
- @@ -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);
|