diff options
Diffstat (limited to 'server/src/luaformatmapperutils.cc')
-rw-r--r-- | server/src/luaformatmapperutils.cc | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/server/src/luaformatmapperutils.cc b/server/src/luaformatmapperutils.cc new file mode 100644 index 0000000..228c9f5 --- /dev/null +++ b/server/src/luaformatmapperutils.cc @@ -0,0 +1,322 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * luaformatmapperutils.cc + * + * Mon Nov 3 08:46:51 CET 2008 + * Copyright 2008 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "luaformatmapperutils.h" +#include "luaformatmapper.h" + +#include <string> +#include <vector> + +std::vector< void * > pointers; + +#define GLOBAL_PREFIX "magic_global_" + +void *getGlobal(lua_State *L, const char *name) +{ + unsigned int top; + unsigned int index; + + std::string var = std::string(GLOBAL_PREFIX) + name; + + lua_getfield(L, LUA_GLOBALSINDEX, var.c_str()); + top = lua_gettop(L); + index = lua_tointeger(L, top); + + return pointers.at(index); +} + +void setGlobal(lua_State *L, const char *name, void *p) +{ + // Put the value of this in the globals + char value_of_this[256]; + + std::string val = std::string(GLOBAL_PREFIX) + name; + + pointers.push_back(p); + unsigned int index = pointers.size() - 1; + + sprintf(value_of_this, "%s = %u\n", val.c_str(), index); + int s = luaL_loadstring(L, value_of_this); + switch(s) { + case 0: //no errors; + break; + case LUA_ERRSYNTAX: //syntax error during pre-compilation; + case LUA_ERRMEM: //memory allocation error. + fprintf(stderr, "Error: %s\n", lua_tostring(L, lua_gettop(L))); + default: + fprintf(stderr, "Unknown return value of luaL_loadstring.\n"); + } + + // Run program (init) + s = lua_pcall(L, 0, LUA_MULTRET, 0); + // Check for errors + switch(s) { + case 0: // Success + break; + case LUA_ERRRUN:// a runtime error. + case LUA_ERRMEM:// memory allocation error. + // For such errors, Lua does not call the error handler function. + case LUA_ERRERR:// error while running the error handler function. + fprintf(stderr, "Error: %s\n", lua_tostring(L, lua_gettop(L))); + break; + default: + fprintf(stderr, "Error: Unknown return value of lua_pcall.\n"); + break; + } +} + +typedef enum { + MLTT_VALUE, + MLTT_TEXT, + MLTT_ENDOFITEM, // newline + MLTT_UNDEFINED +} mltokentype_t; + +typedef struct { + mltokentype_t type; + std::string name; + std::string value; +} mltoken_t; + +std::vector< mltoken_t > mltokenize(std::string mlvalue) +{ + std::vector< mltoken_t > tokens; + /* + mltoken_t token; + token = MLTT_UNDEFINED; + for(size_t i = 0; i < mlvalue.length(); i++) { + switch(mlvalue[i]) { + case '$': + case '[': + case ']': + case '\n': + default: + } + } + */ + { + mltoken_t token; + token.type = MLTT_TEXT; + token.value = "noget tekst "; + tokens.push_back(token); + } + + { + mltoken_t token; + token.type = MLTT_VALUE; + token.name = "myname"; + token.value = "myvalue"; + tokens.push_back(token); + } + + { + mltoken_t token; + token.type = MLTT_TEXT; + token.value = " noget mere tekst"; + tokens.push_back(token); + } + + { + mltoken_t token; + token.type = MLTT_ENDOFITEM; + token.value = "\n"; + tokens.push_back(token); + } + + // en entry mere... + { + mltoken_t token; + token.type = MLTT_TEXT; + token.value = "yet another "; + tokens.push_back(token); + } + + { + mltoken_t token; + token.type = MLTT_VALUE; + token.name = "myname"; + token.value = "another value"; + tokens.push_back(token); + } + + { + mltoken_t token; + token.type = MLTT_TEXT; + token.value = " and thats final!"; + tokens.push_back(token); + } + + { + mltoken_t token; + token.type = MLTT_ENDOFITEM; + token.value = "\n"; + tokens.push_back(token); + } + + return tokens; +} + +typedef struct { + std::string prefix; + std::string postfix; +} transform_params_t; + +std::map< std::string, transform_params_t > transforms; + +/** + * Args: mlvalue, bullet, usetext, name1, prefix1, postfix1, name2, prefix2, postfix2, ... + * Iterates list items, prepends bullet, and replaces all name/value pairs with + * corresponding prefix/value/postfix. + */ +int printfmlval(lua_State *L) +{ + int n = lua_gettop(L); // number of arguments + if(n < 3 || (n - 3) % 3 != 0) { + char errstr[512]; + sprintf(errstr, "Minimum number of args expected 3, got %d", n); + fprintf(stderr, errstr); + lua_pushstring(L, errstr); + lua_error(L); + return 0; + } + + std::string mlvalue = lua_tostring(L, lua_gettop(L) - (n - 1)); + std::string bullet = lua_tostring(L, lua_gettop(L) - (n - 2)); + bool usetext = lua_toboolean(L, lua_gettop(L) - (n - 3)); + + printf("[%s], [%s], [%d]\n", mlvalue.c_str(), bullet.c_str(), usetext); fflush(stdout); + + // Read in the (prefix, name, postfix) 3-tuples + int m = 4; + while(m < lua_gettop(L)) { + + printf("!\n"); fflush(stdout); + + transform_params_t p; + p.prefix = lua_tostring(L, lua_gettop(L) - (n - m)); + std::string name = lua_tostring(L, lua_gettop(L) - (n - (m + 1))); + p.postfix = lua_tostring(L, lua_gettop(L) - (n - (m + 2))); + + printf("[%s], [%s], [%s]\n", p.prefix.c_str(), name.c_str(), p.postfix.c_str()); fflush(stdout); + + transforms[name] = p; + + m += 3; + } + + LUAFormatMapper *lfm = (LUAFormatMapper*)getGlobal(L, "LUAFormatMapper"); + + mltokentype_t lasttype = MLTT_ENDOFITEM; + std::vector< mltoken_t > tokens = mltokenize(mlvalue); + std::vector< mltoken_t >::iterator i = tokens.begin(); + while(i != tokens.end()) { + if(lasttype == MLTT_ENDOFITEM) lfm->bufferoutput(bullet); + + switch(i->type) { + case MLTT_VALUE: + lfm->bufferoutput(transforms[i->name].prefix); + lfm->bufferoutput(i->value); + lfm->bufferoutput(transforms[i->name].postfix); + break; + + case MLTT_TEXT: + if(usetext) lfm->bufferoutput(i->value); + break; + + case MLTT_ENDOFITEM: + if(usetext) lfm->bufferoutput(i->value); + break; + + case MLTT_UNDEFINED: + // Undefined + break; + } + + lasttype = i->type; + i++; + } + + return 0; +} + + +int printval(lua_State *L) +{ + int n = lua_gettop(L); // number of arguments + if(n != 1) { + char errstr[512]; + sprintf(errstr, "Number of args expected 1, got %d", n); + fprintf(stderr, errstr); + lua_pushstring(L, errstr); + lua_error(L); + return 0; + } + + std::string value = lua_tostring(L, lua_gettop(L)); + + LUAFormatMapper *lfm = (LUAFormatMapper*)getGlobal(L, "LUAFormatMapper"); + + lfm->bufferoutput(value); + + return 0; +} + +/* +int pg_query(lua_State *L) +{ + int n = lua_gettop(L); // number of arguments + if(n != 2) { + char errstr[512]; + sprintf(errstr, "Number of args expected 2, got %d", n); + fprintf(stderr, errstr); + lua_pushstring(L, errstr); + lua_error(L); + return 0; + } + + std::string query = lua_tostring(L, lua_gettop(L)); + unsigned int pg = lua_tointeger(L, lua_gettop(L) - 1); + + printf("query [%s]\n", query.c_str()); + + // lua_createtable(L, 0, 1); + // lua_pushinteger(L, 41); + // lua_rawseti(L, -2, 1); + // lua_setfenv(L, -2); + + lua_pushinteger(L, 42); + lua_pushinteger(L, 41); + lua_rawset(L, -3); + + return 1; +} +*/ + +void preload_formatutils(lua_State *L) +{ + lua_register(L, "printval", printval); + lua_register(L, "printfmlval", printfmlval); +} |