Imported from ../lua-3.1.tar.gz.
[lua.git] / src / lua / lua.c
bloba6a92f71de8be429654a67fa12d0a361e506fa04
1 /*
2 ** $Id: lua.c,v 1.14 1998/02/11 20:56:05 roberto Exp $
3 ** Lua stand-alone interpreter
4 ** See Copyright Notice in lua.h
5 */
8 #include <signal.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
13 #include "lua.h"
14 #include "luadebug.h"
15 #include "lualib.h"
18 #ifndef OLD_ANSI
19 #include <locale.h>
20 #else
21 #define setlocale(a,b) 0
22 #endif
24 #ifdef _POSIX_SOURCE
25 #include <unistd.h>
26 #else
27 #define isatty(x) (x==0) /* assume stdin is a tty */
28 #endif
31 typedef void (*handler)(int); /* type for signal actions */
33 static void laction (int i);
35 static handler lreset (void)
37 lua_linehook = NULL;
38 lua_callhook = NULL;
39 return signal(SIGINT, laction);
42 static void lstop (void)
44 lreset();
45 lua_error("interrupted!");
48 static void laction (int i)
50 lua_linehook = (lua_LHFunction)lstop;
51 lua_callhook = (lua_CHFunction)lstop;
54 static int ldo (int (*f)(char *), char *name)
56 int res;
57 handler h = lreset();
58 res = f(name); /* dostring | dofile */
59 signal(SIGINT, h); /* restore old action */
60 return res;
64 static void print_message (void)
66 fprintf(stderr,
67 "Lua: command line options:\n"
68 " -v print version information\n"
69 " -d turn debug on\n"
70 " -e stat dostring `stat'\n"
71 " -q interactive mode without prompt\n"
72 " -i interactive mode with prompt\n"
73 " - executes stdin as a file\n"
74 " a=b sets global `a' with string `b'\n"
75 " name dofile `name'\n\n");
79 static void assign (char *arg)
81 if (strlen(arg) >= 500)
82 fprintf(stderr, "lua: shell argument too long");
83 else {
84 char buffer[500];
85 char *eq = strchr(arg, '=');
86 lua_pushstring(eq+1);
87 strncpy(buffer, arg, eq-arg);
88 buffer[eq-arg] = 0;
89 lua_setglobal(buffer);
93 #define BUF_SIZE 512
95 static void manual_input (int prompt)
97 int cont = 1;
98 while (cont) {
99 char buffer[BUF_SIZE];
100 int i = 0;
101 lua_beginblock();
102 if (prompt)
103 printf("%s", lua_getstring(lua_getglobal("_PROMPT")));
104 for(;;) {
105 int c = getchar();
106 if (c == EOF) {
107 cont = 0;
108 break;
110 else if (c == '\n') {
111 if (i>0 && buffer[i-1] == '\\')
112 buffer[i-1] = '\n';
113 else break;
115 else if (i >= BUF_SIZE-1) {
116 fprintf(stderr, "lua: argument line too long\n");
117 break;
119 else buffer[i++] = c;
121 buffer[i] = 0;
122 ldo(lua_dostring, buffer);
123 lua_endblock();
125 printf("\n");
129 int main (int argc, char *argv[])
131 int i;
132 setlocale(LC_ALL, "");
133 lua_iolibopen();
134 lua_strlibopen();
135 lua_mathlibopen();
136 lua_pushstring("> "); lua_setglobal("_PROMPT");
137 if (argc < 2) { /* no arguments? */
138 if (isatty(0)) {
139 printf("%s %s\n", LUA_VERSION, LUA_COPYRIGHT);
140 manual_input(1);
142 else
143 ldo(lua_dofile, NULL); /* executes stdin as a file */
145 else for (i=1; i<argc; i++) {
146 if (argv[i][0] == '-') { /* option? */
147 switch (argv[i][1]) {
148 case 0:
149 ldo(lua_dofile, NULL); /* executes stdin as a file */
150 break;
151 case 'i':
152 manual_input(1);
153 break;
154 case 'q':
155 manual_input(0);
156 break;
157 case 'd':
158 lua_debug = 1;
159 break;
160 case 'v':
161 printf("%s %s\n(written by %s)\n\n",
162 LUA_VERSION, LUA_COPYRIGHT, LUA_AUTHORS);
163 break;
164 case 'e':
165 i++;
166 if (ldo(lua_dostring, argv[i]) != 0) {
167 fprintf(stderr, "lua: error running argument `%s'\n", argv[i]);
168 return 1;
170 break;
171 default:
172 print_message();
173 exit(1);
176 else if (strchr(argv[i], '='))
177 assign(argv[i]);
178 else {
179 int result = ldo(lua_dofile, argv[i]);
180 if (result) {
181 if (result == 2) {
182 fprintf(stderr, "lua: cannot execute file ");
183 perror(argv[i]);
185 exit(1);
189 #ifdef DEBUG
190 lua_close();
191 #endif
192 return 0;