libs/web: add support for string templates to the template parser

Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
This commit is contained in:
Jo-Philipp Wich 2014-09-04 11:35:09 +00:00
parent 84de0fbe02
commit 35eaa9f85f
3 changed files with 59 additions and 9 deletions

View file

@ -18,10 +18,8 @@
#include "template_lualib.h" #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; int lua_status, rv;
if (!parser) if (!parser)
@ -32,7 +30,7 @@ int template_L_parse(lua_State *L)
return 3; return 3;
} }
lua_status = lua_load(L, template_reader, parser, file); lua_status = lua_load(L, template_reader, parser, chunkname);
if (lua_status == 0) if (lua_status == 0)
rv = 1; rv = 1;
@ -44,6 +42,23 @@ int template_L_parse(lua_State *L)
return rv; 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) int template_L_utf8(lua_State *L)
{ {
size_t len = 0; size_t len = 0;
@ -146,6 +161,7 @@ static int template_L_hash(lua_State *L) {
/* module table */ /* module table */
static const luaL_reg R[] = { static const luaL_reg R[] = {
{ "parse", template_L_parse }, { "parse", template_L_parse },
{ "parse_string", template_L_parse_string },
{ "utf8", template_L_utf8 }, { "utf8", template_L_utf8 },
{ "pcdata", template_L_pcdata }, { "pcdata", template_L_pcdata },
{ "striptags", template_L_striptags }, { "striptags", template_L_striptags },

View file

@ -100,6 +100,36 @@ err:
return NULL; 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) void template_close(struct template_parser *parser)
{ {
if (!parser) if (!parser)
@ -108,11 +138,14 @@ void template_close(struct template_parser *parser)
if (parser->gc != NULL) if (parser->gc != NULL)
free(parser->gc); free(parser->gc);
/* if file is not set, we were parsing a string */
if (parser->file) {
if ((parser->data != NULL) && (parser->data != MAP_FAILED)) if ((parser->data != NULL) && (parser->data != MAP_FAILED))
munmap(parser->data, parser->size); munmap(parser->data, parser->size);
if (parser->fd >= 0) if (parser->fd >= 0)
close(parser->fd); close(parser->fd);
}
free(parser); free(parser);
} }
@ -376,7 +409,7 @@ int template_error(lua_State *L, struct template_parser *parser)
line++; line++;
snprintf(msg, sizeof(msg), "Syntax error in %s:%d: %s", 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_pushnil(L);
lua_pushinteger(L, line + chunkline); lua_pushinteger(L, line + chunkline);

View file

@ -71,6 +71,7 @@ struct template_parser {
}; };
struct template_parser * template_open(const char *file); 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); void template_close(struct template_parser *parser);
const char *template_reader(lua_State *L, void *ud, size_t *sz); const char *template_reader(lua_State *L, void *ud, size_t *sz);