diff options
| author | Lua Team <team@lua.org> | 1998-07-11 12:00:00 +0000 |
|---|---|---|
| committer | repogen <> | 1998-07-11 12:00:00 +0000 |
| commit | 377347776f1f3d820f92151f70bec667f96d5e6b (patch) | |
| tree | cdb3ba26158df33547dfe765547177afcee119d1 /src/lua | |
| parent | 4f8c5d0f284e1f4da717aea5008915f185cd2e05 (diff) | |
| download | lua-github-3.1.tar.gz | |
Lua 3.13.1
Diffstat (limited to 'src/lua')
| -rw-r--r-- | src/lua/Makefile | 32 | ||||
| -rw-r--r-- | src/lua/README | 20 | ||||
| -rw-r--r-- | src/lua/lua.c | 194 |
3 files changed, 246 insertions, 0 deletions
diff --git a/src/lua/Makefile b/src/lua/Makefile new file mode 100644 index 00000000..1ec83706 --- /dev/null +++ b/src/lua/Makefile @@ -0,0 +1,32 @@ +# makefile for lua interpreter + +LUA= ../.. + +include $(LUA)/config + +EXTRA_DEFS= $(POSIX) + +OBJS= lua.o +SRCS= lua.c + +T= $(BIN)/lua + +all: $T + +$T: $(OBJS) $(LIB)/liblua.a $(LIB)/liblualib.a + $(CC) -o $@ $(OBJS) -L$(LIB) -llua -llualib -lm + +$(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 new file mode 100644 index 00000000..31340429 --- /dev/null +++ b/src/lua/README @@ -0,0 +1,20 @@ +This client is a sample lua interpreter. +It can be used as a batch interpreter and interactively. +Here are the options it understands: + + -v print version information + -d turn debug on + -e stat dostring `stat' + -q interactive mode without prompt + -i interactive mode with prompt + - executes stdin as a file + a=b sets global `a' with string `b' (no need to quote b) + name dofile `name' + +If no options are given, then it reads and executes lines from stdin. +In this case, each line must contain a complete statement. +To span a statement across several lines, end each line with a backslash '\'. +To change the prompt, set the global variable _PROMPT to whatever you want. + +This interpreter is good for using Lua as a standalone language. +For a minimal interpreter, see etc/min.c. diff --git a/src/lua/lua.c b/src/lua/lua.c new file mode 100644 index 00000000..a6a92f71 --- /dev/null +++ b/src/lua/lua.c @@ -0,0 +1,194 @@ +/* +** $Id: lua.c,v 1.14 1998/02/11 20:56:05 roberto Exp $ +** Lua stand-alone interpreter +** See Copyright Notice in lua.h +*/ + + +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "lua.h" +#include "luadebug.h" +#include "lualib.h" + + +#ifndef OLD_ANSI +#include <locale.h> +#else +#define setlocale(a,b) 0 +#endif + +#ifdef _POSIX_SOURCE +#include <unistd.h> +#else +#define isatty(x) (x==0) /* assume stdin is a tty */ +#endif + + +typedef void (*handler)(int); /* type for signal actions */ + +static void laction (int i); + +static handler lreset (void) +{ + lua_linehook = NULL; + lua_callhook = NULL; + return signal(SIGINT, laction); +} + +static void lstop (void) +{ + lreset(); + lua_error("interrupted!"); +} + +static void laction (int i) +{ + lua_linehook = (lua_LHFunction)lstop; + lua_callhook = (lua_CHFunction)lstop; +} + +static int ldo (int (*f)(char *), char *name) +{ + int res; + handler h = lreset(); + res = f(name); /* dostring | dofile */ + signal(SIGINT, h); /* restore old action */ + return res; +} + + +static void print_message (void) +{ + fprintf(stderr, +"Lua: command line options:\n" +" -v print version information\n" +" -d turn debug on\n" +" -e stat dostring `stat'\n" +" -q interactive mode without prompt\n" +" -i interactive mode with prompt\n" +" - executes stdin as a file\n" +" a=b sets global `a' with string `b'\n" +" name dofile `name'\n\n"); +} + + +static void assign (char *arg) +{ + if (strlen(arg) >= 500) + fprintf(stderr, "lua: shell argument too long"); + else { + char buffer[500]; + char *eq = strchr(arg, '='); + lua_pushstring(eq+1); + strncpy(buffer, arg, eq-arg); + buffer[eq-arg] = 0; + lua_setglobal(buffer); + } +} + +#define BUF_SIZE 512 + +static void manual_input (int prompt) +{ + int cont = 1; + while (cont) { + char buffer[BUF_SIZE]; + int i = 0; + lua_beginblock(); + if (prompt) + printf("%s", lua_getstring(lua_getglobal("_PROMPT"))); + for(;;) { + int c = getchar(); + if (c == EOF) { + cont = 0; + break; + } + else if (c == '\n') { + if (i>0 && buffer[i-1] == '\\') + buffer[i-1] = '\n'; + else break; + } + else if (i >= BUF_SIZE-1) { + fprintf(stderr, "lua: argument line too long\n"); + break; + } + else buffer[i++] = c; + } + buffer[i] = 0; + ldo(lua_dostring, buffer); + lua_endblock(); + } + printf("\n"); +} + + +int main (int argc, char *argv[]) +{ + int i; + setlocale(LC_ALL, ""); + lua_iolibopen(); + lua_strlibopen(); + lua_mathlibopen(); + lua_pushstring("> "); lua_setglobal("_PROMPT"); + if (argc < 2) { /* no arguments? */ + if (isatty(0)) { + printf("%s %s\n", LUA_VERSION, LUA_COPYRIGHT); + manual_input(1); + } + else + ldo(lua_dofile, NULL); /* executes stdin as a file */ + } + else for (i=1; i<argc; i++) { + if (argv[i][0] == '-') { /* option? */ + switch (argv[i][1]) { + case 0: + ldo(lua_dofile, NULL); /* executes stdin as a file */ + break; + case 'i': + manual_input(1); + break; + case 'q': + manual_input(0); + break; + case 'd': + lua_debug = 1; + break; + case 'v': + printf("%s %s\n(written by %s)\n\n", + LUA_VERSION, LUA_COPYRIGHT, LUA_AUTHORS); + break; + case 'e': + i++; + if (ldo(lua_dostring, argv[i]) != 0) { + fprintf(stderr, "lua: error running argument `%s'\n", argv[i]); + return 1; + } + break; + default: + print_message(); + exit(1); + } + } + else if (strchr(argv[i], '=')) + assign(argv[i]); + else { + int result = ldo(lua_dofile, argv[i]); + if (result) { + if (result == 2) { + fprintf(stderr, "lua: cannot execute file "); + perror(argv[i]); + } + exit(1); + } + } + } +#ifdef DEBUG + lua_close(); +#endif + return 0; +} + |
