diff options
Diffstat (limited to 'src/lua')
| -rw-r--r-- | src/lua/Makefile | 31 | ||||
| -rw-r--r-- | src/lua/README | 41 | ||||
| -rw-r--r-- | src/lua/lua.c | 388 |
3 files changed, 0 insertions, 460 deletions
diff --git a/src/lua/Makefile b/src/lua/Makefile deleted file mode 100644 index aa52832f..00000000 --- a/src/lua/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# makefile for Lua interpreter - -LUA= ../.. - -include $(LUA)/config - -EXTRA_DEFS= $(USERCONF) -OBJS= lua.o -SRCS= lua.c - -T= $(BIN)/lua - -all: $T - -$T: $(OBJS) $(LIB)/liblua.a $(LIB)/liblualib.a - $(CC) -o $@ $(MYLDFLAGS) $(OBJS) -L$(LIB) -llua -llualib $(EXTRA_LIBS) $(DLLIB) - -$(LIB)/liblua.a: - cd ..; $(MAKE) - -$(LIB)/liblualib.a: - cd ../lib; $(MAKE) - -clean: - rm -f $(OBJS) $T - -co: - co -q -f -M $(SRCS) - -klean: clean - rm -f $(SRCS) diff --git a/src/lua/README b/src/lua/README deleted file mode 100644 index 525f6c15..00000000 --- a/src/lua/README +++ /dev/null @@ -1,41 +0,0 @@ -This is lua, the stand-alone Lua interpreter. -It can be used as a batch interpreter and also interactively. -There are man pages for it in both nroff and html in ../../doc. - -Usage: lua [options] [script [args]]. Available options are: - - execute stdin as a file - -e stat execute string `stat' - -i enter interactive mode after executing `script' - -l name load and run library `name' - -v show version information - -w catch use of undefined global variables - -- stop handling options - -This interpreter is suitable for using Lua as a stand-alone language; it loads -all standard libraries. For a minimal interpreter, see ../../etc/min.c. - -If your application simply exports new functions to Lua (which is common), -then you can use this interpreter unmodified by putting your functions into -a library and loading it dynamically (if you have built support for dynamic -libraries). - -If you need to add your library statically, then you can use this interpreter -almost unmodified, as follows: - -* First, define a function - void myinit (lua_State *L) - in your own code. In this function, you should do whatever initializations - are needed by your application, typically exporting your functions to Lua. - (Of course, you can use any name instead of "myinit".) - -* Then, #define lua_userinit(L) in luaconf.h to call luaopen_stdlibs and - possibly luaopen_stdlibs, which opens all standard libraries. If you don't - need them, just don't call openstdlibs and open any standard libraries that - you do need in myinit. - -* Alternatively, write your own luaopen_stdlibs; the linker will use your - version (if you ask politely). - -Just remember to link your C code when building lua! - -For other customizations, see ../../include/luaconf.h . diff --git a/src/lua/lua.c b/src/lua/lua.c deleted file mode 100644 index 6a21a6ae..00000000 --- a/src/lua/lua.c +++ /dev/null @@ -1,388 +0,0 @@ -/* -** $Id: lua.c,v 1.133 2004/11/18 19:53:49 roberto Exp $ -** Lua stand-alone interpreter -** See Copyright Notice in lua.h -*/ - - -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#define lua_c - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -/* -** generic extra include file -*/ -#ifdef LUA_USERCONFIG -#include LUA_USERCONFIG -#endif - - - - -static lua_State *globalL = NULL; - -static const char *progname = PROGNAME; - - - -static void lstop (lua_State *L, lua_Debug *ar) { - (void)ar; /* unused arg. */ - lua_sethook(L, NULL, 0, 0); - luaL_error(L, "interrupted!"); -} - - -static void laction (int i) { - signal(i, SIG_DFL); /* if another SIGINT happens before lstop, - terminate process (default action) */ - lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); -} - - -static void print_usage (void) { - fprintf(stderr, - "usage: %s [options] [script [args]].\n" - "Available options are:\n" - " - execute stdin as a file\n" - " -e stat execute string `stat'\n" - " -i enter interactive mode after executing `script'\n" - " -l name load and run library `name'\n" - " -v show version information\n" - " -- stop handling options\n" , - progname); -} - - -static void l_message (const char *pname, const char *msg) { - if (pname) fprintf(stderr, "%s: ", pname); - fprintf(stderr, "%s\n", msg); -} - - -static int report (lua_State *L, int status) { - if (status && !lua_isnil(L, -1)) { - const char *msg = lua_tostring(L, -1); - if (msg == NULL) msg = "(error object is not a string)"; - l_message(progname, msg); - lua_pop(L, 1); - } - return status; -} - - -static int docall (lua_State *L, int narg, int clear) { - int status; - int base = lua_gettop(L) - narg; /* function index */ - lua_pushliteral(L, "_TRACEBACK"); - lua_rawget(L, LUA_GLOBALSINDEX); /* get traceback function */ - lua_insert(L, base); /* put it under chunk and args */ - signal(SIGINT, laction); - status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base); - signal(SIGINT, SIG_DFL); - lua_remove(L, base); /* remove traceback function */ - return status; -} - - -static void print_version (void) { - l_message(NULL, LUA_VERSION " " LUA_COPYRIGHT); -} - - -static int getargs (lua_State *L, char *argv[], int n) { - int i, narg; - for (i=n+1; argv[i]; i++) { - luaL_checkstack(L, 1, "too many arguments to script"); - lua_pushstring(L, argv[i]); - } - narg = i-(n+1); /* number of arguments to the script (not to `lua.c') */ - lua_newtable(L); - for (i=0; argv[i]; i++) { - lua_pushstring(L, argv[i]); - lua_rawseti(L, -2, i - n); - } - return narg; -} - - -static int dofile (lua_State *L, const char *name) { - int status = luaL_loadfile(L, name) || docall(L, 0, 1); - return report(L, status); -} - - -static int dostring (lua_State *L, const char *s, const char *name) { - int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1); - return report(L, status); -} - - -static int dolibrary (lua_State *L, const char *name) { - luaL_getfield(L, LUA_GLOBALSINDEX, "package.path"); - if (!lua_isstring(L, -1)) { - l_message(progname, "`package.path' must be a string"); - return 1; - } - name = luaL_searchpath(L, name, lua_tostring(L, -1)); - if (name == NULL) return report(L, 1); - else return dofile(L, name); -} - - - -/* -** this macro defines a function to show the prompt and reads the -** next line for manual input -*/ -#ifndef lua_readline -#define lua_readline(L,prompt) readline(L,prompt) - -/* maximum length of an input line */ -#ifndef MAXINPUT -#define MAXINPUT 512 -#endif - - -static int readline (lua_State *L, const char *prompt) { - static char buffer[MAXINPUT]; - if (prompt) { - fputs(prompt, stdout); - fflush(stdout); - } - if (fgets(buffer, sizeof(buffer), stdin) == NULL) - return 0; /* read fails */ - else { - lua_pushstring(L, buffer); - return 1; - } -} - -#endif - - -static const char *get_prompt (lua_State *L, int firstline) { - const char *p = NULL; - lua_pushstring(L, firstline ? "_PROMPT" : "_PROMPT2"); - lua_rawget(L, LUA_GLOBALSINDEX); - p = lua_tostring(L, -1); - if (p == NULL) p = (firstline ? PROMPT : PROMPT2); - lua_pop(L, 1); /* remove global */ - return p; -} - - -static int incomplete (lua_State *L, int status) { - if (status == LUA_ERRSYNTAX && - strstr(lua_tostring(L, -1), "near `<eof>'") != NULL) { - lua_pop(L, 1); - return 1; - } - else - return 0; -} - - -static int loadline (lua_State *L) { - int status; - lua_settop(L, 0); - if (lua_readline(L, get_prompt(L, 1)) == 0) /* no input? */ - return -1; - if (lua_tostring(L, -1)[0] == '=') { /* line starts with `=' ? */ - lua_pushfstring(L, "return %s", lua_tostring(L, -1)+1);/* `=' -> `return' */ - lua_remove(L, -2); /* remove original line */ - } - for (;;) { /* repeat until gets a complete line */ - status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin"); - if (!incomplete(L, status)) break; /* cannot try to add lines? */ - if (lua_readline(L, get_prompt(L, 0)) == 0) /* no more input? */ - return -1; - lua_concat(L, lua_gettop(L)); /* join lines */ - } - lua_saveline(L, lua_tostring(L, 1)); - lua_remove(L, 1); /* remove line */ - return status; -} - - -static void dotty (lua_State *L) { - int status; - const char *oldprogname = progname; - progname = NULL; - print_version(); - while ((status = loadline(L)) != -1) { - if (status == 0) status = docall(L, 0, 0); - report(L, status); - if (status == 0 && lua_gettop(L) > 0) { /* any result to print? */ - lua_getglobal(L, "print"); - lua_insert(L, 1); - if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0) - l_message(progname, lua_pushfstring(L, "error calling `print' (%s)", - lua_tostring(L, -1))); - } - } - lua_settop(L, 0); /* clear stack */ - fputs("\n", stdout); - progname = oldprogname; -} - - -static int checkvar (lua_State *L) { - const char *name = lua_tostring(L, 2); - if (name) - luaL_error(L, "attempt to access undefined variable `%s'", name); - return 0; -} - - -#define clearinteractive(i) (*i &= 2) - -static int handle_argv (lua_State *L, char *argv[], int *interactive) { - if (argv[1] == NULL) { /* no arguments? */ - *interactive = 0; - if (stdin_is_tty()) - dotty(L); - else - dofile(L, NULL); /* executes stdin as a file */ - } - else { /* other arguments; loop over them */ - int i; - for (i = 1; argv[i] != NULL; i++) { - if (argv[i][0] != '-') break; /* not an option? */ - switch (argv[i][1]) { /* option */ - case '-': { /* `--' */ - if (argv[i][2] != '\0') { - print_usage(); - return 1; - } - i++; /* skip this argument */ - goto endloop; /* stop handling arguments */ - } - case '\0': { - clearinteractive(interactive); - dofile(L, NULL); /* executes stdin as a file */ - break; - } - case 'i': { - *interactive = 2; /* force interactive mode after arguments */ - break; - } - case 'v': { - clearinteractive(interactive); - print_version(); - break; - } - case 'w': { - if (lua_getmetatable(L, LUA_GLOBALSINDEX)) { - lua_pushcfunction(L, checkvar); - lua_setfield(L, -2, "__index"); - } - break; - } - case 'e': { - const char *chunk = argv[i] + 2; - clearinteractive(interactive); - if (*chunk == '\0') chunk = argv[++i]; - if (chunk == NULL) { - print_usage(); - return 1; - } - if (dostring(L, chunk, "=(command line)") != 0) - return 1; - break; - } - case 'l': { - const char *filename = argv[i] + 2; - if (*filename == '\0') filename = argv[++i]; - if (filename == NULL) { - print_usage(); - return 1; - } - if (dolibrary(L, filename)) - return 1; /* stop if file fails */ - break; - } - default: { - clearinteractive(interactive); - print_usage(); - return 1; - } - } - } endloop: - if (argv[i] != NULL) { - const char *filename = argv[i]; - int narg = getargs(L, argv, i); /* collect arguments */ - int status; - lua_setglobal(L, "arg"); - clearinteractive(interactive); - status = luaL_loadfile(L, filename); - lua_insert(L, -(narg+1)); - if (status == 0) - status = docall(L, narg, 0); - else - lua_pop(L, narg); - return report(L, status); - } - } - return 0; -} - - -static int handle_luainit (lua_State *L) { - const char *init = getenv("LUA_INIT"); - if (init == NULL) return 0; /* status OK */ - else if (init[0] == '@') - return dofile(L, init+1); - else - return dostring(L, init, "=LUA_INIT"); -} - - -struct Smain { - int argc; - char **argv; - int status; -}; - - -static int pmain (lua_State *L) { - struct Smain *s = (struct Smain *)lua_touserdata(L, 1); - int status; - int interactive = 1; - if (s->argv[0] && s->argv[0][0]) progname = s->argv[0]; - globalL = L; - lua_userinit(L); /* open libraries */ - status = handle_luainit(L); - if (status == 0) { - status = handle_argv(L, s->argv, &interactive); - if (status == 0 && interactive) dotty(L); - } - s->status = status; - return 0; -} - - -int main (int argc, char *argv[]) { - int status; - struct Smain s; - lua_State *L = lua_open(); /* create state */ - if (L == NULL) { - l_message(argv[0], "cannot create state: not enough memory"); - return EXIT_FAILURE; - } - s.argc = argc; - s.argv = argv; - status = lua_cpcall(L, &pmain, &s); - report(L, status); - lua_close(L); - return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS; -} - |
