From: John L. <jr...@us...> - 2005-06-06 23:06:27
|
Update of /cvsroot/wxlua/wxLua/modules/lua/src/lua In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14733/wxLua/modules/lua/src/lua Added Files: Makefile README lua.c lua.dsp Log Message: moved files to the modules directory structure --- NEW FILE: README --- This is lua, a sample 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 -- stop handling options This interpreter is suitable for using Lua as a standalone 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 (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) to be "openstdlibs(L)+myinit(L)". Here, openstdlibs is a function in lua.c that 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. * Finally, remember to link your C code when building lua. For other customizations, see ../../etc/config.c. --- NEW FILE: lua.dsp --- # Microsoft Developer Studio Project File - Name="lua" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=lua - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "lua.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "lua.mak" CFG="lua - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "lua - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "lua - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "lua - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /FdRelease\lua.pdb /c # ADD CPP /nologo /MD /W4 /GX /O2 /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /FdRelease\lua.pdb /c # ADD BASE RSC /l 0x809 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 /nologo /subsystem:console /machine:I386 /out:"..\..\..\bin\lua.exe" # ADD LINK32 /nologo /subsystem:console /machine:I386 /out:"..\..\..\bin\lua.exe" !ELSEIF "$(CFG)" == "lua - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /FdDebug\luad.pdb /c # ADD CPP /nologo /MDd /W4 /Gm /GX /ZI /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /FdDebug\luad.pdb /c # ADD BASE RSC /l 0x809 /d "_DEBUG" # ADD RSC /l 0x809 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /out:"..\..\..\bin\luad.exe" # ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /out:"..\..\..\bin\luad.exe" !ENDIF # Begin Target # Name "lua - Win32 Release" # Name "lua - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\lua.c # End Source File # Begin Source File SOURCE=..\LAPI.C # End Source File # Begin Source File SOURCE=..\LAPI.H # End Source File # Begin Source File SOURCE=..\LIB\LAUXLIB.C # End Source File # Begin Source File SOURCE=..\LIB\LBASELIB.C # End Source File # Begin Source File SOURCE=..\LCODE.C # End Source File # Begin Source File SOURCE=..\LCODE.H # End Source File # Begin Source File SOURCE=..\LIB\LDBLIB.C # End Source File # Begin Source File SOURCE=..\LDEBUG.C # End Source File # Begin Source File SOURCE=..\LDEBUG.H # End Source File # Begin Source File SOURCE=..\LDLLMAIN.C # End Source File # Begin Source File SOURCE=..\LDO.C # End Source File # Begin Source File SOURCE=..\LDO.H # End Source File # Begin Source File SOURCE=..\ldump.c # End Source File # Begin Source File SOURCE=..\LFUNC.C # End Source File # Begin Source File SOURCE=..\LFUNC.H # End Source File # Begin Source File SOURCE=..\LGC.C # End Source File # Begin Source File SOURCE=..\LGC.H # End Source File # Begin Source File SOURCE=..\LIB\LIOLIB.C # End Source File # Begin Source File SOURCE=..\LLEX.C # End Source File # Begin Source File SOURCE=..\LLEX.H # End Source File # Begin Source File SOURCE=..\LLIMITS.H # End Source File # Begin Source File SOURCE=..\LIB\LMATHLIB.C # End Source File # Begin Source File SOURCE=..\LMEM.C # End Source File # Begin Source File SOURCE=..\LMEM.H # End Source File # Begin Source File SOURCE=..\lib\loadlib.c # End Source File # Begin Source File SOURCE=..\LOBJECT.C # End Source File # Begin Source File SOURCE=..\LOBJECT.H # End Source File # Begin Source File SOURCE=..\LOPCODES.C # End Source File # Begin Source File SOURCE=..\LOPCODES.H # End Source File # Begin Source File SOURCE=..\LPARSER.C # End Source File # Begin Source File SOURCE=..\LPARSER.H # End Source File # Begin Source File SOURCE=..\..\lslua50m.def # End Source File # Begin Source File SOURCE=..\LSTATE.C # End Source File # Begin Source File SOURCE=..\LSTATE.H # End Source File # Begin Source File SOURCE=..\LSTRING.C # End Source File # Begin Source File SOURCE=..\LSTRING.H # End Source File # Begin Source File SOURCE=..\LIB\LSTRLIB.C # End Source File # Begin Source File SOURCE=..\LTABLE.C # End Source File # Begin Source File SOURCE=..\LTABLE.H # End Source File # Begin Source File SOURCE=..\lib\ltablib.c # End Source File # Begin Source File SOURCE=..\LTESTS.C # End Source File # Begin Source File SOURCE=..\LTM.C # End Source File # Begin Source File SOURCE=..\LTM.H # End Source File # Begin Source File SOURCE=..\LUNDUMP.C # End Source File # Begin Source File SOURCE=..\LUNDUMP.H # End Source File # Begin Source File SOURCE=..\LVM.C # End Source File # Begin Source File SOURCE=..\LVM.H # End Source File # Begin Source File SOURCE=..\LZIO.C # End Source File # Begin Source File SOURCE=..\LZIO.H # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\include\ldlgdyn.h # End Source File # Begin Source File SOURCE=..\..\include\lua.h # End Source File # Begin Source File SOURCE=..\..\include\luadebug.h # End Source File # Begin Source File SOURCE=..\..\include\lualib.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # Begin Group "Lua Test files" # PROP Default_Filter "" # Begin Source File SOURCE=..\..\test\arraysample.lua # End Source File # Begin Source File SOURCE=..\..\test\bisect.lua # End Source File # Begin Source File SOURCE=..\..\test\bug18102000.lua # End Source File # Begin Source File SOURCE="..\..\test\cf-for.lua" # End Source File # Begin Source File SOURCE=..\..\test\cf.lua # End Source File # Begin Source File SOURCE=..\..\test\factorial.lua # End Source File # Begin Source File SOURCE=..\..\test\fib.lua # End Source File # Begin Source File SOURCE=..\..\test\globals.lua # End Source File # Begin Source File SOURCE=..\..\test\hello.lua # End Source File # Begin Source File SOURCE=..\..\test\life.lua # End Source File # Begin Source File SOURCE=..\..\test\lisp.lua # End Source File # Begin Source File SOURCE=..\..\test\old.lua # End Source File # Begin Source File SOURCE=..\..\test\qp.lua # End Source File # Begin Source File SOURCE=..\..\test\save.lua # End Source File # Begin Source File SOURCE=..\..\test\sort.lua # End Source File # Begin Source File SOURCE=..\..\test\table.lua # End Source File # Begin Source File SOURCE=..\..\test\test.lua # End Source File # Begin Source File SOURCE=..\..\test\test7.lua # End Source File # Begin Source File SOURCE=..\..\test\test7sub.lua # End Source File # Begin Source File SOURCE=..\..\test\test8.lua # End Source File # Begin Source File SOURCE="..\..\test\trace-calls.lua" # End Source File # Begin Source File SOURCE="..\..\test\trace-globals.lua" # End Source File # Begin Source File SOURCE=..\..\test\undefined.lua # End Source File # Begin Source File SOURCE=..\..\test\webform.lua # End Source File # End Group # End Target # End Project --- NEW FILE: Makefile --- # 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) --- NEW FILE: lua.c --- /* ** $Id: lua.c,v 1.1 2005/06/06 23:06:17 jrl1 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 /* ** definition of `isatty' */ #ifdef _POSIX_C_SOURCE #include <unistd.h> #define stdin_is_tty() isatty(0) #else #define stdin_is_tty() 1 /* assume stdin is a tty */ #endif #ifndef PROMPT #define PROMPT "> " #endif #ifndef PROMPT2 #define PROMPT2 ">> " #endif #ifndef PROGNAME #define PROGNAME "lua" #endif #ifndef lua_userinit #define lua_userinit(L) openstdlibs(L) #endif #ifndef LUA_EXTRALIBS #define LUA_EXTRALIBS /* empty */ #endif static lua_State *L = NULL; static const char *progname = PROGNAME; static const luaL_reg lualibs[] = { {"base", luaopen_base}, {"table", luaopen_table}, {"io", luaopen_io}, {"string", luaopen_string}, {"math", luaopen_math}, {"debug", luaopen_debug}, {"loadlib", luaopen_loadlib}, /* add your libraries here */ LUA_EXTRALIBS {NULL, NULL} }; 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(L, 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 (int status) { const char *msg; if (status) { msg = lua_tostring(L, -1); if (msg == NULL) msg = "(error with no message)"; l_message(progname, msg); lua_pop(L, 1); } return status; } static int lcall (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 void getargs (char *argv[], int n) { int i; lua_newtable(L); for (i=0; argv[i]; i++) { lua_pushnumber(L, i - n); lua_pushstring(L, argv[i]); lua_rawset(L, -3); } /* arg.n = maximum index in table `arg' */ lua_pushliteral(L, "n"); lua_pushnumber(L, i-n-1); lua_rawset(L, -3); } static int docall (int status) { if (status == 0) status = lcall(0, 1); return report(status); } static int file_input (const char *name) { return docall(luaL_loadfile(L, name)); } static int dostring (const char *s, const char *name) { return docall(luaL_loadbuffer(L, s, strlen(s), name)); } static int load_file (const char *name) { lua_pushliteral(L, "require"); lua_rawget(L, LUA_GLOBALSINDEX); if (!lua_isfunction(L, -1)) { /* no `require' defined? */ lua_pop(L, 1); return file_input(name); } else { lua_pushstring(L, name); return report(lcall(1, 1)); } } /* ** this macro can be used by some `history' system to save lines ** read in manual input */ #ifndef lua_saveline #define lua_saveline(L,line) /* empty */ #endif /* ** 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 (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 (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 load_string (void) { int status; lua_settop(L, 0); if (lua_readline(L, get_prompt(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(status)) break; /* cannot try to add lines? */ if (lua_readline(L, get_prompt(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 manual_input (void) { int status; const char *oldprogname = progname; progname = NULL; while ((status = load_string()) != -1) { if (status == 0) status = lcall(0, 0); report(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 handle_argv (char *argv[], int *interactive) { if (argv[1] == NULL) { /* no more arguments? */ if (stdin_is_tty()) { print_version(); manual_input(); } else file_input(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': { file_input(NULL); /* executes stdin as a file */ break; } case 'i': { *interactive = 1; break; } case 'v': { print_version(); break; } case 'e': { const char *chunk = argv[i] + 2; if (*chunk == '\0') chunk = argv[++i]; if (chunk == NULL) { print_usage(); return 1; } if (dostring(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 (load_file(filename)) return 1; /* stop if file fails */ break; } case 'c': { l_message(progname, "option `-c' is deprecated"); break; } case 's': { l_message(progname, "option `-s' is deprecated"); break; } default: { print_usage(); return 1; } } } endloop: if (argv[i] != NULL) { const char *filename = argv[i]; getargs(argv, i); /* collect arguments */ lua_setglobal(L, "arg"); return file_input(filename); /* stop scanning arguments */ } } return 0; } static void openstdlibs (lua_State *l) { const luaL_reg *lib = lualibs; for (; lib->func; lib++) { lib->func(l); /* open library */ lua_settop(l, 0); /* discard any results */ } } static int handle_luainit (void) { const char *init = getenv("LUA_INIT"); if (init == NULL) return 0; /* status OK */ else if (init[0] == '@') return file_input(init+1); else return dostring(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 = 0; if (s->argv[0] && s->argv[0][0]) progname = s->argv[0]; L = l; lua_userinit(l); /* open libraries */ status = handle_luainit(); if (status == 0) { status = handle_argv(s->argv, &interactive); if (status == 0 && interactive) manual_input(); } 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(status); lua_close(l); return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS; } |