summaryrefslogtreecommitdiffhomepage
path: root/libs/lmo/src/lmo_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/lmo/src/lmo_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/lmo/src/lmo_lualib.c')
-rw-r--r--libs/lmo/src/lmo_lualib.c263
1 files changed, 0 insertions, 263 deletions
diff --git a/libs/lmo/src/lmo_lualib.c b/libs/lmo/src/lmo_lualib.c
deleted file mode 100644
index 5cc1e7d69d..0000000000
--- a/libs/lmo/src/lmo_lualib.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * lmo - Lua Machine Objects - Lua binding
- *
- * Copyright (C) 2009-2012 Jo-Philipp Wich <xm@subsignal.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "lmo_lualib.h"
-
-extern char _lmo_error[1024];
-
-
-static int lmo_L_open(lua_State *L) {
- const char *filename = luaL_checklstring(L, 1, NULL);
- lmo_archive_t *ar, **udata;
-
- if( (ar = lmo_open(filename)) != NULL )
- {
- if( (udata = lua_newuserdata(L, sizeof(lmo_archive_t *))) != NULL )
- {
- *udata = ar;
- luaL_getmetatable(L, LMO_ARCHIVE_META);
- lua_setmetatable(L, -2);
- return 1;
- }
-
- lmo_close(ar);
- lua_pushnil(L);
- lua_pushstring(L, "out of memory");
- return 2;
- }
-
- lua_pushnil(L);
- lua_pushstring(L, lmo_error());
- return 2;
-}
-
-static uint32_t _lmo_hash_string(lua_State *L, int n) {
- size_t len;
- const char *str = luaL_checklstring(L, n, &len);
- char res[4096];
- char *ptr, prev;
-
- if (!str || len >= sizeof(res))
- return 0;
-
- for (prev = ' ', ptr = res; *str; prev = *str, str++)
- {
- if (isspace(*str))
- {
- if (!isspace(prev))
- *ptr++ = ' ';
- }
- else
- {
- *ptr++ = *str;
- }
- }
-
- if ((ptr > res) && isspace(*(ptr-1)))
- ptr--;
-
- return sfh_hash(res, ptr - res);
-}
-
-static int lmo_L_hash(lua_State *L) {
- uint32_t hash = _lmo_hash_string(L, 1);
- lua_pushinteger(L, (lua_Integer)hash);
- return 1;
-}
-
-static lmo_luaentry_t *_lmo_push_entry(lua_State *L) {
- lmo_luaentry_t *le;
-
- if( (le = lua_newuserdata(L, sizeof(lmo_luaentry_t))) != NULL )
- {
- luaL_getmetatable(L, LMO_ENTRY_META);
- lua_setmetatable(L, -2);
-
- return le;
- }
-
- return NULL;
-}
-
-static int _lmo_lookup(lua_State *L, lmo_archive_t *ar, uint32_t hash) {
- lmo_entry_t *e = ar->index;
- lmo_luaentry_t *le = NULL;
-
- while( e != NULL )
- {
- if( e->key_id == hash )
- {
- if( (le = _lmo_push_entry(L)) != NULL )
- {
- le->archive = ar;
- le->entry = e;
- return 1;
- }
- else
- {
- lua_pushnil(L);
- lua_pushstring(L, "out of memory");
- return 2;
- }
- }
-
- e = e->next;
- }
-
- lua_pushnil(L);
- return 1;
-}
-
-static int lmo_L_get(lua_State *L) {
- lmo_archive_t **ar = luaL_checkudata(L, 1, LMO_ARCHIVE_META);
- uint32_t hash = (uint32_t) luaL_checkinteger(L, 2);
- return _lmo_lookup(L, *ar, hash);
-}
-
-static int lmo_L_lookup(lua_State *L) {
- lmo_archive_t **ar = luaL_checkudata(L, 1, LMO_ARCHIVE_META);
- uint32_t hash = _lmo_hash_string(L, 2);
- return _lmo_lookup(L, *ar, hash);
-}
-
-static int lmo_L_foreach(lua_State *L) {
- lmo_archive_t **ar = luaL_checkudata(L, 1, LMO_ARCHIVE_META);
- lmo_entry_t *e = (*ar)->index;
-
- if( lua_isfunction(L, 2) )
- {
- while( e != NULL )
- {
- lua_pushvalue(L, 2);
- lua_pushinteger(L, e->key_id);
- lua_pushlstring(L, &(*ar)->mmap[e->offset], e->length);
- lua_pcall(L, 2, 0, 0);
- e = e->next;
- }
- }
-
- return 0;
-}
-
-static int lmo_L__gc(lua_State *L) {
- lmo_archive_t **ar = luaL_checkudata(L, 1, LMO_ARCHIVE_META);
-
- if( (*ar) != NULL )
- lmo_close(*ar);
-
- *ar = NULL;
-
- return 0;
-}
-
-static int lmo_L__tostring(lua_State *L) {
- lmo_archive_t **ar = luaL_checkudata(L, 1, LMO_ARCHIVE_META);
- lua_pushfstring(L, "LMO Archive (%d bytes)", (*ar)->length);
- return 1;
-}
-
-
-static int _lmo_convert_entry(lua_State *L, int idx) {
- lmo_luaentry_t *le = luaL_checkudata(L, idx, LMO_ENTRY_META);
-
- lua_pushlstring(L,
- &le->archive->mmap[le->entry->offset],
- le->entry->length
- );
-
- return 1;
-}
-
-static int lmo_L_entry__tostring(lua_State *L) {
- return _lmo_convert_entry(L, 1);
-}
-
-static int lmo_L_entry__concat(lua_State *L) {
- if( lua_isuserdata(L, 1) )
- _lmo_convert_entry(L, 1);
- else
- lua_pushstring(L, lua_tostring(L, 1));
-
- if( lua_isuserdata(L, 2) )
- _lmo_convert_entry(L, 2);
- else
- lua_pushstring(L, lua_tostring(L, 2));
-
- lua_concat(L, 2);
-
- return 1;
-}
-
-static int lmo_L_entry__len(lua_State *L) {
- lmo_luaentry_t *le = luaL_checkudata(L, 1, LMO_ENTRY_META);
- lua_pushinteger(L, le->entry->length);
- return 1;
-}
-
-static int lmo_L_entry__gc(lua_State *L) {
- lmo_luaentry_t *le = luaL_checkudata(L, 1, LMO_ENTRY_META);
- le->archive = NULL;
- le->entry = NULL;
- return 0;
-}
-
-
-/* lmo method table */
-static const luaL_reg M[] = {
- {"close", lmo_L__gc},
- {"get", lmo_L_get},
- {"lookup", lmo_L_lookup},
- {"foreach", lmo_L_foreach},
- {"__tostring", lmo_L__tostring},
- {"__gc", lmo_L__gc},
- {NULL, NULL}
-};
-
-/* lmo.entry method table */
-static const luaL_reg E[] = {
- {"__tostring", lmo_L_entry__tostring},
- {"__concat", lmo_L_entry__concat},
- {"__len", lmo_L_entry__len},
- {"__gc", lmo_L_entry__gc},
- {NULL, NULL}
-};
-
-/* module table */
-static const luaL_reg R[] = {
- {"open", lmo_L_open},
- {"hash", lmo_L_hash},
- {NULL, NULL}
-};
-
-LUALIB_API int luaopen_lmo(lua_State *L) {
- luaL_newmetatable(L, LMO_ARCHIVE_META);
- luaL_register(L, NULL, M);
- lua_pushvalue(L, -1);
- lua_setfield(L, -2, "__index");
- lua_setglobal(L, LMO_ARCHIVE_META);
-
- luaL_newmetatable(L, LMO_ENTRY_META);
- luaL_register(L, NULL, E);
- lua_pushvalue(L, -1);
- lua_setfield(L, -2, "__index");
- lua_setglobal(L, LMO_ENTRY_META);
-
- luaL_register(L, LMO_LUALIB_META, R);
-
- return 1;
-}