/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * luaformatmapper.cc * * Wed Oct 29 16:02:03 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 "luaformatmapper.h" #include #include "exception.h" #include "luaformatmapperutils.h" /* static std::string loadresultstring(Fields &fields) { std::string s; Fields::iterator v = fields.begin(); while(v != fields.end()) { lua_pushstring(L, v->second); // Push the pointer to 'this' instance lua_setglobal(L, v->first); // Assign it to a global lua var. // s += (*v).first + " = \"" + (*v).second + "\"\n"; v++; } return s; } */ LUAFormatMapper::LUAFormatMapper(Fields &fields) { L = luaL_newstate(); if(L == NULL) { error("Could not create LUA state."); return; } luaL_openlibs(L); setGlobal(L, "LUAFormatMapper", this); preload_formatutils(L); Fields::iterator v = fields.begin(); while(v != fields.end()) { lua_pushstring(L, v->second.c_str()); // Push the pointer to 'this' instance lua_setglobal(L, v->first.c_str()); // Assign it to a global lua var. v++; } /* std::string preload = loadresultstring(fields); if(luaL_loadbuffer(L, preload.c_str(), preload.size(), "preload")) { error(lua_tostring(L, lua_gettop(L))); return; } // Run program (init) if(lua_pcall(L, 0, LUA_MULTRET, 0)) { error(lua_tostring(L, lua_gettop(L))); return; } */ clean_top = lua_gettop(L); } LUAFormatMapper::~LUAFormatMapper() { lua_close(L); } std::string LUAFormatMapper::map(const std::string &mapper) { output = ""; if(L == NULL) { error("LUA state not initialized!"); return output; } if(mapper == "") { error("Empty LUA mapper detected in " + mapper); return output; } // Load the mapper if(luaL_loadbuffer(L, mapper.c_str(), mapper.size(), "mapper")) { error(lua_tostring(L, lua_gettop(L)) + std::string(" in ") + mapper); return output; } // Run the loaded code if(lua_pcall(L, 0, LUA_MULTRET, 0)) { error(lua_tostring(L, lua_gettop(L)) + std::string(" in ") + mapper); return output; } // Check if app messed up the stack. if(lua_gettop(L) != clean_top) { error("Wrong number of return values in " + mapper); lua_pop(L, lua_gettop(L) - clean_top); return output; } // output = lua_tostring(L, lua_gettop(L)); // lua_pop(L, 1); return output; } void LUAFormatMapper::error(std::string message) { throw Exception("ERROR in LUAFormatMapper: " + message); } void LUAFormatMapper::bufferoutput(std::string value) { output += value; }