summaryrefslogtreecommitdiff
path: root/etc/min.c
diff options
context:
space:
mode:
Diffstat (limited to 'etc/min.c')
-rw-r--r--etc/min.c47
1 files changed, 19 insertions, 28 deletions
diff --git a/etc/min.c b/etc/min.c
index 45731c9d..bc1c6821 100644
--- a/etc/min.c
+++ b/etc/min.c
@@ -1,46 +1,37 @@
/*
* min.c -- a minimal Lua interpreter
-* loads stdin only with minimal error handling.
-* no interaction, and no standard library, only a "print" function.
+* only dynamic loading is enabled -- all libraries must be dynamically loaded
+* no interaction, only batch execution
*/
#include <stdio.h>
#include "lua.h"
+#include "lualib.h"
+#include "lauxlib.h"
-static int print(lua_State *L)
+static int run(lua_State *L)
{
- int n=lua_gettop(L);
- int i;
- for (i=1; i<=n; i++)
+ char **argv=lua_touserdata(L,1);
+ lua_register(L,"error",lua_error);
+ luaopen_loadlib(L);
+ while (*++argv)
{
- if (i>1) printf("\t");
- if (lua_isstring(L,i))
- printf("%s",lua_tostring(L,i));
- else if (lua_isnil(L,i))
- printf("%s","nil");
- else if (lua_isboolean(L,i))
- printf("%s",lua_toboolean(L,i) ? "true" : "false");
- else
- printf("%s:%p",lua_typename(L,lua_type(L,i)),lua_topointer(L,i));
+ if (luaL_loadfile(L,*argv)) lua_error(L); else lua_call(L,0,0);
}
- printf("\n");
return 0;
}
-static const char *getF(lua_State *L, void *ud, size_t *size)
-{
- FILE *f=(FILE *)ud;
- static char buff[512];
- if (feof(f)) return NULL;
- *size=fread(buff,1,sizeof(buff),f);
- return (*size>0) ? buff : NULL;
-}
+#define report(s) fprintf(stderr,"%s\n",s)
-int main(void)
+int main(int argc, char *argv[])
{
lua_State *L=lua_open();
- lua_register(L,"print",print);
- if (lua_load(L,getF,stdin,"=stdin") || lua_pcall(L,0,0,0))
- fprintf(stderr,"%s\n",lua_tostring(L,-1));
+ if (L==NULL)
+ {
+ report("not enough memory for state");
+ return 1;
+ }
+ if (lua_cpcall(L,run,argv)) report(lua_tostring(L,-1));
+ lua_close(L);
return 0;
}