/* ** lua.c ** Linguagem para Usuarios de Aplicacao */ char *rcs_lua="$Id: lua.c,v 1.16 1997/06/09 17:29:16 roberto Exp roberto $"; #include <stdio.h> #include <string.h> #include "lua.h" #include "auxlib.h" #include "lualib.h" #ifdef _POSIX_SOURCE #include <unistd.h> #else #define isatty(x) (x==0) /* assume stdin is a tty */ #endif #define DEBUG 1 static void testC (void) { #if DEBUG #define getnum(s) ((*s++) - '0') #define getname(s) (nome[0] = *s++, nome) static int locks[10]; lua_Object reg[10]; char nome[2]; char *s = luaL_check_string(1); nome[1] = 0; while (1) { switch (*s++) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': lua_pushnumber(*(s-1) - '0'); break; case 'c': reg[getnum(s)] = lua_createtable(); break; case 'P': reg[getnum(s)] = lua_pop(); break; case 'g': { int n = getnum(s); reg[n] = lua_getglobal(getname(s)); break; } case 'G': { int n = getnum(s); reg[n] = lua_rawgetglobal(getname(s)); break; } case 'l': locks[getnum(s)] = lua_ref(1); break; case 'L': locks[getnum(s)] = lua_ref(0); break; case 'r': { int n = getnum(s); reg[n] = lua_getref(locks[getnum(s)]); break; } case 'u': lua_unref(locks[getnum(s)]); break; case 'p': { int n = getnum(s); reg[n] = lua_getparam(getnum(s)); break; } case '=': lua_setglobal(getname(s)); break; case 's': lua_pushstring(getname(s)); break; case 'o': lua_pushobject(reg[getnum(s)]); break; case 'f': lua_call(getname(s)); break; case 'i': reg[getnum(s)] = lua_gettable(); break; case 'I': reg[getnum(s)] = lua_rawgettable(); break; case 't': lua_settable(); break; case 'T': lua_rawsettable(); break; default: luaL_verror("unknown command in `testC': %c", *(s-1)); } if (*s == 0) return; if (*s++ != ' ') lua_error("missing ` ' between commands in `testC'"); } #else lua_error("`testC' not active"); #endif } static void manual_input (void) { if (isatty(0)) { char buffer[250]; while (fgets(buffer, sizeof(buffer), stdin) != 0) { lua_beginblock(); lua_dostring(buffer); lua_endblock(); } } else lua_dofile(NULL); /* executes stdin as a file */ } int main (int argc, char *argv[]) { int i; int result = 0; iolib_open (); strlib_open (); mathlib_open (); lua_register("testC", testC); if (argc < 2) manual_input(); else for (i=1; i<argc; i++) { if (strcmp(argv[i], "-") == 0) manual_input(); else if (strcmp(argv[i], "-v") == 0) printf("%s %s\n(written by %s)\n\n", LUA_VERSION, LUA_COPYRIGHT, LUA_AUTHORS); else if ((strcmp(argv[i], "-e") == 0 && i++) || strchr(argv[i], '=')) { if (lua_dostring(argv[i]) != 0) { fprintf(stderr, "lua: error running argument `%s'\n", argv[i]); return 1; } } else { result = lua_dofile (argv[i]); if (result) { if (result == 2) { fprintf(stderr, "lua: cannot execute file "); perror(argv[i]); } return 1; } } } return result; }