summaryrefslogtreecommitdiff
path: root/server/src/luaformatmapperutils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/luaformatmapperutils.cc')
-rw-r--r--server/src/luaformatmapperutils.cc322
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);
+}