summaryrefslogtreecommitdiffhomepage
path: root/libs/web/src/template_lualib.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2012-11-25 19:17:55 +0000
committerJo-Philipp Wich <jow@openwrt.org>2012-11-25 19:17:55 +0000
commit0e50aa690af6cd9f37fa97b4a521fe523cce3c39 (patch)
treec0ab4edc0dd221dfa3e6fb4eeba049ecc05326fe /libs/web/src/template_lualib.c
parentc647ff9f0e1af211a762dc9a773c1b5c4aacd168 (diff)
libs/web: rewrite template engine, merge lmo library
- template parser: merge lmo library - template parser: rewrite to operate on memory mapped files - template parser: implement proper line number reporting on syntax errors - template parser: process translate tags directly and bypass Lua - template lmo: introduce load_catalog(), change_catalog() and close_catalog() - template lmo: rewrite index processing to operate directly on the memory mapped file - template lmo: implement binary search keys, reducing the lookup complexity to O(log n) - po2lmo: write sorted indixes when generating *.lmo archives - i18n: use the template parser for translations - i18n: stub load(), loadc() and clear() - i18n: map setlanguage() to load_catalog()
Diffstat (limited to 'libs/web/src/template_lualib.c')
-rw-r--r--libs/web/src/template_lualib.c92
1 files changed, 67 insertions, 25 deletions
diff --git a/libs/web/src/template_lualib.c b/libs/web/src/template_lualib.c
index d3a5f89bbd..f40ef2d6ae 100644
--- a/libs/web/src/template_lualib.c
+++ b/libs/web/src/template_lualib.c
@@ -21,37 +21,27 @@
int template_L_parse(lua_State *L)
{
const char *file = luaL_checkstring(L, 1);
- struct template_parser parser;
- int lua_status;
+ struct template_parser *parser = template_open(file);
+ int lua_status, rv;
- if( (parser.fd = open(file, O_RDONLY)) > 0 )
+ if (!parser)
{
- parser.flags = 0;
- parser.bufsize = 0;
- parser.state = T_STATE_TEXT_NEXT;
-
- lua_status = lua_load(L, template_reader, &parser, file);
+ lua_pushnil(L);
+ lua_pushinteger(L, errno);
+ lua_pushstring(L, strerror(errno));
+ return 3;
+ }
- (void) close(parser.fd);
+ lua_status = lua_load(L, template_reader, parser, file);
+ if (lua_status == 0)
+ rv = 1;
+ else
+ rv = template_error(L, parser);
- if( lua_status == 0 )
- {
- return 1;
- }
- else
- {
- lua_pushnil(L);
- lua_pushinteger(L, lua_status);
- lua_pushlstring(L, parser.out, parser.outsize);
- return 3;
- }
- }
+ template_close(parser);
- lua_pushnil(L);
- lua_pushinteger(L, 255);
- lua_pushstring(L, "No such file or directory");
- return 3;
+ return rv;
}
int template_L_sanitize_utf8(lua_State *L)
@@ -88,12 +78,64 @@ int template_L_sanitize_pcdata(lua_State *L)
return 0;
}
+static int template_L_load_catalog(lua_State *L) {
+ const char *lang = luaL_optstring(L, 1, "en");
+ const char *dir = luaL_optstring(L, 2, NULL);
+ lua_pushboolean(L, !lmo_load_catalog(lang, dir));
+ return 1;
+}
+
+static int template_L_close_catalog(lua_State *L) {
+ const char *lang = luaL_optstring(L, 1, "en");
+ lmo_close_catalog(lang);
+ return 0;
+}
+
+static int template_L_change_catalog(lua_State *L) {
+ const char *lang = luaL_optstring(L, 1, "en");
+ lua_pushboolean(L, !lmo_change_catalog(lang));
+ return 1;
+}
+
+static int template_L_translate(lua_State *L) {
+ size_t len;
+ char *tr;
+ int trlen;
+ const char *key = luaL_checklstring(L, 1, &len);
+
+ switch (lmo_translate(key, len, &tr, &trlen))
+ {
+ case 0:
+ lua_pushlstring(L, tr, trlen);
+ return 1;
+
+ case -1:
+ return 0;
+ }
+
+ lua_pushnil(L);
+ lua_pushstring(L, "no catalog loaded");
+ return 2;
+}
+
+static int template_L_hash(lua_State *L) {
+ size_t len;
+ const char *key = luaL_checklstring(L, 1, &len);
+ lua_pushinteger(L, sfh_hash(key, len));
+ return 1;
+}
+
/* module table */
static const luaL_reg R[] = {
{ "parse", template_L_parse },
{ "sanitize_utf8", template_L_sanitize_utf8 },
{ "sanitize_pcdata", template_L_sanitize_pcdata },
+ { "load_catalog", template_L_load_catalog },
+ { "close_catalog", template_L_close_catalog },
+ { "change_catalog", template_L_change_catalog },
+ { "translate", template_L_translate },
+ { "hash", template_L_hash },
{ NULL, NULL }
};