/* -------------------------------------------------------------------------- * Copyright 2003-2011 (inclusive) Nathan Angelacos * (nangel@users.sourceforge.net) * * This file is part of haserl. * * Haserl is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, * as published by the Free Software Foundation. * * Haserl 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 haserl. If not, see . * * ------------------------------------------------------------------------ */ #if HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "common.h" #include "h_error.h" #include "h_lua.h" #include "h_script.h" #include "haserl.h" extern lua_State *lua_vm; /* attempts to open a file, tokenize and then process it as a haserl script */ int h_lua_loadfile (lua_State * L) { script_t *scriptchain; token_t *tokenchain; buffer_t script_text; int status; /* get the filename */ const char *filename = luaL_checkstring (L, 1); scriptchain = load_script ((char *) filename, NULL); tokenchain = build_token_list (scriptchain, NULL); preprocess_token_list (tokenchain); process_token_list (&script_text, tokenchain); free_token_list (tokenchain); free_script_list (scriptchain); /* script_text has the include file */ status = luaL_loadbuffer (L, (char *) script_text.data, script_text.ptr - script_text.data, filename); buffer_destroy (&script_text); if (status) { lua_error (L); } return (1); /* we return one value, the buffer, as a function */ } void lua_exec (buffer_t * buf, char *str) { buffer_add (buf, str, strlen (str)); } void lua_doscript (buffer_t * script, char *name) { int status; /* force the string to be null terminated */ buffer_add (script, "\0", 1); status = luaL_loadbuffer (lua_vm, (char *) script->data, strlen ((char *) script->data), name) || lua_pcall (lua_vm, 0, LUA_MULTRET, 0); if (status && !lua_isnil (lua_vm, -1)) { const char *msg = lua_tostring (lua_vm, -1); if (msg == NULL) msg = "(error object is not a string)"; die_with_message (NULL, NULL, msg); } } /* Run the echo command in a subshell */ void lua_echo (buffer_t * buf, char *str, size_t len) { static char echo_start[] = " io.write("; char quote[200] = "]=]"; /* 197 nested comments is a problem */ if (len == 0) return; /* figure out if the string uses ]] ]=] ]==] etc in it */ while ((strstr (str, quote)) && (strlen (quote) < 198)) { memmove (quote + strlen (quote) - 1, quote + strlen (quote) - 2, 3); } /* As of 5.1, nested comments are depreciated... sigh */ quote[0] = '['; quote[strlen (quote) - 1] = quote[0]; while ((strstr (str, quote)) && (strlen (quote) < 198)) { memmove (quote + strlen (quote) - 1, quote + strlen (quote) - 2, 3); } buffer_add (buf, echo_start, strlen (echo_start)); buffer_add (buf, quote, strlen (quote)); buffer_add (buf, str, len); quote[0] = ']'; quote[strlen (quote) - 1] = quote[0]; buffer_add (buf, quote, strlen (quote)); buffer_add (buf, ")\n", 2); } /* do an evaluation */ void lua_eval (buffer_t * buf, char *str, size_t len) { static char start[] = " io.write(tostring("; static char end[] = "))\n"; if (len == 0) return; buffer_add (buf, start, strlen (start)); buffer_add (buf, str, len); buffer_add (buf, end, strlen (end)); }