diff options
| -rw-r--r-- | inout.c | 111 | ||||
| -rw-r--r-- | inout.h | 2 | ||||
| -rw-r--r-- | lex.c | 30 | ||||
| -rw-r--r-- | lex.h | 7 | ||||
| -rw-r--r-- | makefile | 34 | ||||
| -rw-r--r-- | opcode.c | 52 | ||||
| -rw-r--r-- | opcode.h | 3 | ||||
| -rw-r--r-- | undump.c | 105 | ||||
| -rw-r--r-- | undump.h | 7 |
9 files changed, 149 insertions, 202 deletions
| @@ -5,22 +5,24 @@ | |||
| 5 | ** Also provides some predefined lua functions. | 5 | ** Also provides some predefined lua functions. |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | char *rcs_inout="$Id: inout.c,v 2.59 1997/05/26 14:42:51 roberto Exp roberto $"; | 8 | char *rcs_inout="$Id: inout.c,v 2.60 1997/06/09 17:28:14 roberto Exp roberto $"; |
| 9 | 9 | ||
| 10 | #include <stdio.h> | 10 | #include <stdio.h> |
| 11 | #include <string.h> | 11 | #include <string.h> |
| 12 | 12 | ||
| 13 | #include "auxlib.h" | 13 | #include "auxlib.h" |
| 14 | #include "lex.h" | 14 | #include "fallback.h" |
| 15 | #include "opcode.h" | 15 | #include "hash.h" |
| 16 | #include "inout.h" | 16 | #include "inout.h" |
| 17 | #include "table.h" | 17 | #include "lex.h" |
| 18 | #include "tree.h" | ||
| 19 | #include "lua.h" | 18 | #include "lua.h" |
| 20 | #include "hash.h" | ||
| 21 | #include "luamem.h" | 19 | #include "luamem.h" |
| 22 | #include "fallback.h" | ||
| 23 | #include "luamem.h" | 20 | #include "luamem.h" |
| 21 | #include "opcode.h" | ||
| 22 | #include "table.h" | ||
| 23 | #include "tree.h" | ||
| 24 | #include "undump.h" | ||
| 25 | #include "zio.h" | ||
| 24 | 26 | ||
| 25 | 27 | ||
| 26 | /* Exported variables */ | 28 | /* Exported variables */ |
| @@ -34,73 +36,58 @@ char *luaI_typenames[] = { /* ORDER LUA_T */ | |||
| 34 | NULL | 36 | NULL |
| 35 | }; | 37 | }; |
| 36 | 38 | ||
| 37 | static FILE *fp; | ||
| 38 | static char *st; | ||
| 39 | 39 | ||
| 40 | /* | ||
| 41 | ** Function to get the next character from the input file | ||
| 42 | */ | ||
| 43 | static int fileinput (void) | ||
| 44 | { | ||
| 45 | int c = fgetc(fp); | ||
| 46 | return (c == EOF) ? 0 : c; | ||
| 47 | } | ||
| 48 | 40 | ||
| 49 | /* | 41 | int lua_dofile (char *filename) |
| 50 | ** Function to get the next character from the input string | ||
| 51 | */ | ||
| 52 | static int stringinput (void) | ||
| 53 | { | 42 | { |
| 54 | return *st++; | 43 | int status; |
| 55 | } | 44 | int c; |
| 45 | FILE *f = (filename == NULL) ? stdin : fopen(filename, "r"); | ||
| 46 | if (f == NULL) | ||
| 47 | return 2; | ||
| 48 | lua_parsedfile = luaI_createfixedstring(filename?filename:"(stdin)")->str; | ||
| 49 | c = fgetc(f); | ||
| 50 | ungetc(c, f); | ||
| 51 | if (c == ID_CHUNK) { | ||
| 52 | ZIO z; | ||
| 53 | f = freopen(filename, "rb", f); /* set binary mode */ | ||
| 54 | zFopen(&z, f); | ||
| 55 | lua_setinput(&z); | ||
| 56 | status = luaI_undump(&z); | ||
| 57 | zclose(&z); | ||
| 58 | } | ||
| 59 | else { | ||
| 60 | ZIO z; | ||
| 61 | if (c == '#') | ||
| 62 | while ((c=fgetc(f)) != '\n') /* skip first line */; | ||
| 63 | zFopen(&z, f); | ||
| 64 | lua_setinput(&z); | ||
| 65 | status = lua_domain(); | ||
| 66 | zclose(&z); | ||
| 67 | } | ||
| 68 | return status; | ||
| 69 | } | ||
| 56 | 70 | ||
| 57 | /* | ||
| 58 | ** Function to open a file to be input unit. | ||
| 59 | ** Return the file. | ||
| 60 | */ | ||
| 61 | FILE *lua_openfile (char *fn) | ||
| 62 | { | ||
| 63 | lua_setinput (fileinput); | ||
| 64 | if (fn == NULL) | ||
| 65 | { | ||
| 66 | fp = stdin; | ||
| 67 | fn = "(stdin)"; | ||
| 68 | } | ||
| 69 | else | ||
| 70 | fp = fopen (fn, "r"); | ||
| 71 | lua_parsedfile = luaI_createfixedstring(fn)->str; | ||
| 72 | return fp; | ||
| 73 | } | ||
| 74 | 71 | ||
| 75 | /* | ||
| 76 | ** Function to close an opened file | ||
| 77 | */ | ||
| 78 | void lua_closefile (void) | ||
| 79 | { | ||
| 80 | if (fp != stdin) | ||
| 81 | fclose(fp); | ||
| 82 | } | ||
| 83 | 72 | ||
| 84 | /* | ||
| 85 | ** Function to open a string to be input unit | ||
| 86 | */ | ||
| 87 | #define SIZE_PREF 20 /* size of string prefix to appear in error messages */ | 73 | #define SIZE_PREF 20 /* size of string prefix to appear in error messages */ |
| 88 | void lua_openstring (char *s) | 74 | |
| 75 | int lua_dostring (char *str) | ||
| 89 | { | 76 | { |
| 77 | int status; | ||
| 90 | char buff[SIZE_PREF+25]; | 78 | char buff[SIZE_PREF+25]; |
| 91 | lua_setinput(stringinput); | 79 | ZIO z; |
| 92 | st = s; | 80 | if (str == NULL) return 1; |
| 93 | sprintf(buff, "(dostring) >> %.20s%s", s, | 81 | sprintf(buff, "(dostring) >> %.20s%s", str, |
| 94 | (strlen(s) > SIZE_PREF) ? "..." : ""); | 82 | (strlen(str) > SIZE_PREF) ? "..." : ""); |
| 95 | lua_parsedfile = luaI_createfixedstring(buff)->str; | 83 | lua_parsedfile = luaI_createfixedstring(buff)->str; |
| 84 | zsopen(&z, str); | ||
| 85 | lua_setinput(&z); | ||
| 86 | status = lua_domain(); | ||
| 87 | zclose(&z); | ||
| 88 | return status; | ||
| 96 | } | 89 | } |
| 97 | 90 | ||
| 98 | /* | ||
| 99 | ** Function to close an opened string | ||
| 100 | */ | ||
| 101 | void lua_closestring (void) | ||
| 102 | { | ||
| 103 | } | ||
| 104 | 91 | ||
| 105 | 92 | ||
| 106 | 93 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: inout.h,v 1.16 1996/05/28 21:07:32 roberto Exp roberto $ | 2 | ** $Id: inout.h,v 1.17 1997/02/26 17:38:41 roberto Unstable roberto $ |
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | 5 | ||
| @@ -1,4 +1,4 @@ | |||
| 1 | char *rcs_lex = "$Id: lex.c,v 3.4 1997/06/11 14:20:51 roberto Exp $"; | 1 | char *rcs_lex = "$Id: lex.c,v 3.4 1997/06/11 18:56:02 roberto Exp roberto $"; |
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | #include <ctype.h> | 4 | #include <ctype.h> |
| @@ -15,13 +15,13 @@ char *rcs_lex = "$Id: lex.c,v 3.4 1997/06/11 14:20:51 roberto Exp $"; | |||
| 15 | 15 | ||
| 16 | #define MINBUFF 250 | 16 | #define MINBUFF 250 |
| 17 | 17 | ||
| 18 | #define next() (current = input()) | 18 | static int current; /* look ahead character */ |
| 19 | #define save(x) (yytext[tokensize++] = (x)) | 19 | static ZIO *lex_z; |
| 20 | #define save_and_next() (save(current), next()) | ||
| 21 | 20 | ||
| 22 | 21 | ||
| 23 | static int current; /* look ahead character */ | 22 | #define next() (current = zgetc(lex_z)) |
| 24 | static Input input; /* input function */ | 23 | #define save(x) (yytext[tokensize++] = (x)) |
| 24 | #define save_and_next() (save(current), next()) | ||
| 25 | 25 | ||
| 26 | 26 | ||
| 27 | #define MAX_IFS 5 | 27 | #define MAX_IFS 5 |
| @@ -37,14 +37,14 @@ static struct { | |||
| 37 | static int iflevel; /* level of nested $if's */ | 37 | static int iflevel; /* level of nested $if's */ |
| 38 | 38 | ||
| 39 | 39 | ||
| 40 | void lua_setinput (Input fn) | 40 | void lua_setinput (ZIO *z) |
| 41 | { | 41 | { |
| 42 | current = '\n'; | 42 | current = '\n'; |
| 43 | lua_linenumber = 0; | 43 | lua_linenumber = 0; |
| 44 | iflevel = 0; | 44 | iflevel = 0; |
| 45 | ifstate[0].skip = 0; | 45 | ifstate[0].skip = 0; |
| 46 | ifstate[0].elsepart = 1; /* to avoid a free $else */ | 46 | ifstate[0].elsepart = 1; /* to avoid a free $else */ |
| 47 | input = fn; | 47 | lex_z = z; |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | 50 | ||
| @@ -155,7 +155,7 @@ static void ifskip (void) | |||
| 155 | while (ifstate[iflevel].skip) { | 155 | while (ifstate[iflevel].skip) { |
| 156 | if (current == '\n') | 156 | if (current == '\n') |
| 157 | inclinenumber(); | 157 | inclinenumber(); |
| 158 | else if (current == 0) | 158 | else if (current == EOZ) |
| 159 | luaI_auxsyntaxerror("input ends inside a $if"); | 159 | luaI_auxsyntaxerror("input ends inside a $if"); |
| 160 | else next(); | 160 | else next(); |
| 161 | } | 161 | } |
| @@ -183,7 +183,7 @@ static void inclinenumber (void) | |||
| 183 | break; | 183 | break; |
| 184 | case 2: /* endinput */ | 184 | case 2: /* endinput */ |
| 185 | if (!skip) { | 185 | if (!skip) { |
| 186 | current = 0; | 186 | current = EOZ; |
| 187 | iflevel = 0; /* to allow $endinput inside a $if */ | 187 | iflevel = 0; /* to allow $endinput inside a $if */ |
| 188 | } | 188 | } |
| 189 | break; | 189 | break; |
| @@ -216,7 +216,7 @@ static void inclinenumber (void) | |||
| 216 | skipspace(); | 216 | skipspace(); |
| 217 | if (current == '\n') /* pragma must end with a '\n' ... */ | 217 | if (current == '\n') /* pragma must end with a '\n' ... */ |
| 218 | inclinenumber(); | 218 | inclinenumber(); |
| 219 | else if (current != 0) /* or eof */ | 219 | else if (current != EOZ) /* or eof */ |
| 220 | luaI_auxsyntaxerror("invalid pragma format"); | 220 | luaI_auxsyntaxerror("invalid pragma format"); |
| 221 | ifskip(); | 221 | ifskip(); |
| 222 | } | 222 | } |
| @@ -232,7 +232,7 @@ static int read_long_string (char *yytext, int buffsize) | |||
| 232 | yytext = luaI_buffer(buffsize *= 2); | 232 | yytext = luaI_buffer(buffsize *= 2); |
| 233 | switch (current) | 233 | switch (current) |
| 234 | { | 234 | { |
| 235 | case 0: | 235 | case EOZ: |
| 236 | save(0); | 236 | save(0); |
| 237 | return WRONGTOKEN; | 237 | return WRONGTOKEN; |
| 238 | case '[': | 238 | case '[': |
| @@ -295,7 +295,7 @@ int luaY_lex (void) | |||
| 295 | case '-': | 295 | case '-': |
| 296 | save_and_next(); | 296 | save_and_next(); |
| 297 | if (current != '-') return '-'; | 297 | if (current != '-') return '-'; |
| 298 | do { next(); } while (current != '\n' && current != 0); | 298 | do { next(); } while (current != '\n' && current != EOZ); |
| 299 | continue; | 299 | continue; |
| 300 | 300 | ||
| 301 | case '[': | 301 | case '[': |
| @@ -338,7 +338,7 @@ int luaY_lex (void) | |||
| 338 | yytext = luaI_buffer(buffsize *= 2); | 338 | yytext = luaI_buffer(buffsize *= 2); |
| 339 | switch (current) | 339 | switch (current) |
| 340 | { | 340 | { |
| 341 | case 0: | 341 | case EOZ: |
| 342 | case '\n': | 342 | case '\n': |
| 343 | save(0); | 343 | save(0); |
| 344 | return WRONGTOKEN; | 344 | return WRONGTOKEN; |
| @@ -455,7 +455,7 @@ int luaY_lex (void) | |||
| 455 | return NUMBER; | 455 | return NUMBER; |
| 456 | } | 456 | } |
| 457 | 457 | ||
| 458 | case 0: | 458 | case EOZ: |
| 459 | save(0); | 459 | save(0); |
| 460 | if (iflevel > 0) | 460 | if (iflevel > 0) |
| 461 | luaI_syntaxerror("missing $endif"); | 461 | luaI_syntaxerror("missing $endif"); |
| @@ -1,16 +1,15 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** lex.h | 2 | ** lex.h |
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | ** $Id: lex.h,v 1.2 1996/02/14 13:35:51 roberto Exp roberto $ | 4 | ** $Id: lex.h,v 1.3 1996/11/08 12:49:35 roberto Exp roberto $ |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #ifndef lex_h | 7 | #ifndef lex_h |
| 8 | #define lex_h | 8 | #define lex_h |
| 9 | 9 | ||
| 10 | #include "zio.h" | ||
| 10 | 11 | ||
| 11 | typedef int (*Input) (void); | 12 | void lua_setinput (ZIO *z); |
| 12 | |||
| 13 | void lua_setinput (Input fn); | ||
| 14 | void luaI_syntaxerror (char *s); | 13 | void luaI_syntaxerror (char *s); |
| 15 | int luaY_lex (void); | 14 | int luaY_lex (void); |
| 16 | void luaI_addReserved (void); | 15 | void luaI_addReserved (void); |
| @@ -1,4 +1,4 @@ | |||
| 1 | # $Id: makefile,v 1.33 1997/04/06 14:08:08 roberto Exp roberto $ | 1 | # $Id: makefile,v 1.34 1997/06/11 18:57:00 roberto Exp roberto $ |
| 2 | 2 | ||
| 3 | #configuration | 3 | #configuration |
| 4 | 4 | ||
| @@ -32,7 +32,8 @@ LUAOBJS = \ | |||
| 32 | luamem.o \ | 32 | luamem.o \ |
| 33 | func.o \ | 33 | func.o \ |
| 34 | undump.o \ | 34 | undump.o \ |
| 35 | auxlib.o | 35 | auxlib.o \ |
| 36 | zio.o | ||
| 36 | 37 | ||
| 37 | LIBOBJS = \ | 38 | LIBOBJS = \ |
| 38 | iolib.o \ | 39 | iolib.o \ |
| @@ -77,29 +78,32 @@ clear : | |||
| 77 | co $@ | 78 | co $@ |
| 78 | 79 | ||
| 79 | 80 | ||
| 80 | auxlib.o: auxlib.c lua.h auxlib.h | 81 | auxlib.o: auxlib.c lua.h auxlib.h luadebug.h |
| 81 | fallback.o: fallback.c auxlib.h lua.h luamem.h fallback.h opcode.h \ | 82 | fallback.o: fallback.c auxlib.h lua.h luamem.h fallback.h opcode.h \ |
| 82 | types.h tree.h func.h table.h hash.h | 83 | types.h tree.h func.h table.h hash.h |
| 83 | func.o: func.c luadebug.h lua.h table.h tree.h types.h opcode.h func.h \ | 84 | func.o: func.c luadebug.h lua.h table.h tree.h types.h opcode.h func.h \ |
| 84 | luamem.h | 85 | luamem.h |
| 85 | hash.o: hash.c luamem.h opcode.h lua.h types.h tree.h func.h hash.h \ | 86 | hash.o: hash.c luamem.h opcode.h lua.h types.h tree.h func.h hash.h \ |
| 86 | table.h auxlib.h | 87 | table.h auxlib.h |
| 87 | inout.o: inout.c auxlib.h lua.h lex.h opcode.h types.h tree.h func.h \ | 88 | inout.o: inout.c auxlib.h lua.h fallback.h opcode.h types.h tree.h \ |
| 88 | inout.h table.h hash.h luamem.h fallback.h | 89 | func.h hash.h inout.h lex.h zio.h luamem.h table.h undump.h |
| 89 | iolib.o: iolib.c lua.h auxlib.h luadebug.h lualib.h | 90 | iolib.o: iolib.c lua.h auxlib.h luadebug.h lualib.h |
| 90 | lex.o: lex.c auxlib.h lua.h luamem.h tree.h types.h table.h opcode.h \ | 91 | lex.o: lex.c auxlib.h lua.h luamem.h tree.h types.h table.h opcode.h \ |
| 91 | func.h lex.h inout.h luadebug.h parser.h | 92 | func.h lex.h zio.h inout.h luadebug.h parser.h |
| 92 | lua.o: lua.c lua.h auxlib.h lualib.h | 93 | lua.o: lua.c lua.h auxlib.h lualib.h |
| 93 | luamem.o: luamem.c luamem.h lua.h | 94 | luamem.o: luamem.c luamem.h lua.h |
| 94 | mathlib.o: mathlib.c lualib.h lua.h auxlib.h | 95 | mathlib.o: mathlib.c lualib.h lua.h auxlib.h |
| 95 | opcode.o: opcode.c luadebug.h lua.h luamem.h opcode.h types.h tree.h \ | 96 | opcode.o: opcode.c luadebug.h lua.h luamem.h opcode.h types.h tree.h \ |
| 96 | func.h hash.h inout.h table.h fallback.h undump.h auxlib.h | 97 | func.h hash.h inout.h table.h fallback.h auxlib.h lex.h zio.h |
| 97 | parser.o: parser.c luadebug.h lua.h luamem.h lex.h opcode.h types.h \ | 98 | parser.o: parser.c luadebug.h lua.h luamem.h lex.h zio.h opcode.h \ |
| 98 | tree.h func.h hash.h inout.h table.h | 99 | types.h tree.h func.h hash.h inout.h table.h |
| 99 | strlib.o: strlib.c lua.h auxlib.h lualib.h | 100 | strlib.o: strlib.c lua.h auxlib.h lualib.h |
| 100 | table.o: table.c luamem.h auxlib.h lua.h opcode.h types.h tree.h \ | 101 | table.o: table.c luamem.h auxlib.h lua.h func.h types.h tree.h \ |
| 101 | func.h hash.h table.h inout.h fallback.h luadebug.h | 102 | opcode.h hash.h table.h inout.h fallback.h luadebug.h |
| 102 | tree.o: tree.c luamem.h lua.h tree.h types.h lex.h hash.h opcode.h \ | 103 | tree.o: tree.c luamem.h lua.h tree.h types.h lex.h zio.h hash.h \ |
| 103 | func.h table.h fallback.h | 104 | opcode.h func.h table.h fallback.h |
| 104 | undump.o: undump.c opcode.h lua.h types.h tree.h func.h luamem.h \ | 105 | undump.o: undump.c auxlib.h lua.h opcode.h types.h tree.h func.h \ |
| 105 | table.h undump.h | 106 | luamem.h table.h undump.h zio.h |
| 107 | y.tab.o: y.tab.c luadebug.h lua.h luamem.h lex.h zio.h opcode.h \ | ||
| 108 | types.h tree.h func.h hash.h inout.h table.h | ||
| 109 | zio.o: zio.c zio.h | ||
| @@ -3,7 +3,7 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_opcode="$Id: opcode.c,v 4.7 1997/06/09 17:28:14 roberto Exp roberto $"; | 6 | char *rcs_opcode="$Id: opcode.c,v 4.8 1997/06/12 18:27:29 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include <setjmp.h> | 8 | #include <setjmp.h> |
| 9 | #include <stdio.h> | 9 | #include <stdio.h> |
| @@ -18,8 +18,8 @@ char *rcs_opcode="$Id: opcode.c,v 4.7 1997/06/09 17:28:14 roberto Exp roberto $" | |||
| 18 | #include "table.h" | 18 | #include "table.h" |
| 19 | #include "lua.h" | 19 | #include "lua.h" |
| 20 | #include "fallback.h" | 20 | #include "fallback.h" |
| 21 | #include "undump.h" | ||
| 22 | #include "auxlib.h" | 21 | #include "auxlib.h" |
| 22 | #include "lex.h" | ||
| 23 | 23 | ||
| 24 | #define tonumber(o) ((ttype(o) != LUA_T_NUMBER) && (lua_tonumber(o) != 0)) | 24 | #define tonumber(o) ((ttype(o) != LUA_T_NUMBER) && (lua_tonumber(o) != 0)) |
| 25 | #define tostring(o) ((ttype(o) != LUA_T_STRING) && (lua_tostring(o) != 0)) | 25 | #define tostring(o) ((ttype(o) != LUA_T_STRING) && (lua_tostring(o) != 0)) |
| @@ -597,7 +597,8 @@ int luaI_dorun (TFunc *tf) | |||
| 597 | return status; | 597 | return status; |
| 598 | } | 598 | } |
| 599 | 599 | ||
| 600 | static int do_protectedmain (lua_CFunction closef) | 600 | |
| 601 | int lua_domain (void) | ||
| 601 | { | 602 | { |
| 602 | TFunc tf; | 603 | TFunc tf; |
| 603 | int status; | 604 | int status; |
| @@ -614,7 +615,6 @@ static int do_protectedmain (lua_CFunction closef) | |||
| 614 | adjustC(0); /* erase extra slot */ | 615 | adjustC(0); /* erase extra slot */ |
| 615 | status = 1; | 616 | status = 1; |
| 616 | } | 617 | } |
| 617 | closef(); | ||
| 618 | if (status == 0) | 618 | if (status == 0) |
| 619 | status = luaI_dorun(&tf); | 619 | status = luaI_dorun(&tf); |
| 620 | errorJmp = oldErr; | 620 | errorJmp = oldErr; |
| @@ -622,7 +622,6 @@ static int do_protectedmain (lua_CFunction closef) | |||
| 622 | return status; | 622 | return status; |
| 623 | } | 623 | } |
| 624 | 624 | ||
| 625 | |||
| 626 | /* | 625 | /* |
| 627 | ** Execute the given lua function. Return 0 on success or 1 on error. | 626 | ** Execute the given lua function. Return 0 on success or 1 on error. |
| 628 | */ | 627 | */ |
| @@ -640,47 +639,6 @@ int lua_callfunction (lua_Object function) | |||
| 640 | 639 | ||
| 641 | 640 | ||
| 642 | /* | 641 | /* |
| 643 | ** Open file, generate opcode and execute global statement. Return 0 on | ||
| 644 | ** success or non 0 on error. | ||
| 645 | */ | ||
| 646 | int lua_dofile (char *filename) | ||
| 647 | { | ||
| 648 | int status; | ||
| 649 | int c; | ||
| 650 | FILE *f = lua_openfile(filename); | ||
| 651 | if (f == NULL) | ||
| 652 | return 2; | ||
| 653 | c = fgetc(f); | ||
| 654 | ungetc(c, f); | ||
| 655 | if (c == ID_CHUNK) { | ||
| 656 | f = freopen(filename, "rb", f); /* set binary mode */ | ||
| 657 | status = luaI_undump(f); | ||
| 658 | lua_closefile(); | ||
| 659 | } | ||
| 660 | else { | ||
| 661 | if (c == '#') | ||
| 662 | while ((c=fgetc(f)) != '\n') /* skip first line */; | ||
| 663 | status = do_protectedmain(lua_closefile); | ||
| 664 | } | ||
| 665 | return status; | ||
| 666 | } | ||
| 667 | |||
| 668 | /* | ||
| 669 | ** Generate opcode stored on string and execute global statement. Return 0 on | ||
| 670 | ** success or non 0 on error. | ||
| 671 | */ | ||
| 672 | int lua_dostring (char *str) | ||
| 673 | { | ||
| 674 | int status; | ||
| 675 | if (str == NULL) | ||
| 676 | return 1; | ||
| 677 | lua_openstring(str); | ||
| 678 | status = do_protectedmain(lua_closestring); | ||
| 679 | return status; | ||
| 680 | } | ||
| 681 | |||
| 682 | |||
| 683 | /* | ||
| 684 | ** API: set a function as a fallback | 642 | ** API: set a function as a fallback |
| 685 | */ | 643 | */ |
| 686 | lua_Object lua_setfallback (char *name, lua_CFunction fallback) | 644 | lua_Object lua_setfallback (char *name, lua_CFunction fallback) |
| @@ -1058,7 +1016,7 @@ static void call_arith (IMS event) | |||
| 1058 | if (ttype(im) == LUA_T_NIL) { | 1016 | if (ttype(im) == LUA_T_NIL) { |
| 1059 | im = luaI_getim(0, event); /* try a 'global' i.m. */ | 1017 | im = luaI_getim(0, event); /* try a 'global' i.m. */ |
| 1060 | if (ttype(im) == LUA_T_NIL) | 1018 | if (ttype(im) == LUA_T_NIL) |
| 1061 | lua_error("unexpected type at conversion to number"); | 1019 | lua_error("unexpected type at arithmetic operation"); |
| 1062 | } | 1020 | } |
| 1063 | } | 1021 | } |
| 1064 | lua_pushstring(luaI_eventname[event]); | 1022 | lua_pushstring(luaI_eventname[event]); |
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** TeCGraf - PUC-Rio | 2 | ** TeCGraf - PUC-Rio |
| 3 | ** $Id: opcode.h,v 3.32 1997/04/04 22:24:51 roberto Exp roberto $ | 3 | ** $Id: opcode.h,v 3.33 1997/04/11 21:34:53 roberto Exp roberto $ |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | #ifndef opcode_h | 6 | #ifndef opcode_h |
| @@ -166,5 +166,6 @@ TObject *luaI_Address (lua_Object o); | |||
| 166 | void luaI_pushobject (TObject *o); | 166 | void luaI_pushobject (TObject *o); |
| 167 | void luaI_gcIM (TObject *o); | 167 | void luaI_gcIM (TObject *o); |
| 168 | int luaI_dorun (TFunc *tf); | 168 | int luaI_dorun (TFunc *tf); |
| 169 | int lua_domain (void); | ||
| 169 | 170 | ||
| 170 | #endif | 171 | #endif |
| @@ -3,7 +3,7 @@ | |||
| 3 | ** load bytecodes from files | 3 | ** load bytecodes from files |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char* rcs_undump="$Id: undump.c,v 1.21 1996/11/18 11:18:29 lhf Exp lhf $"; | 6 | char* rcs_undump="$Id: undump.c,v 1.24 1997/06/13 11:08:47 lhf Exp $"; |
| 7 | 7 | ||
| 8 | #include <stdio.h> | 8 | #include <stdio.h> |
| 9 | #include <string.h> | 9 | #include <string.h> |
| @@ -12,6 +12,7 @@ char* rcs_undump="$Id: undump.c,v 1.21 1996/11/18 11:18:29 lhf Exp lhf $"; | |||
| 12 | #include "luamem.h" | 12 | #include "luamem.h" |
| 13 | #include "table.h" | 13 | #include "table.h" |
| 14 | #include "undump.h" | 14 | #include "undump.h" |
| 15 | #include "zio.h" | ||
| 15 | 16 | ||
| 16 | static int swapword=0; | 17 | static int swapword=0; |
| 17 | static int swapfloat=0; | 18 | static int swapfloat=0; |
| @@ -147,10 +148,10 @@ static void Unthread(Byte* code, int i, int v) | |||
| 147 | } | 148 | } |
| 148 | } | 149 | } |
| 149 | 150 | ||
| 150 | static int LoadWord(FILE* D) | 151 | static int LoadWord(ZIO* Z) |
| 151 | { | 152 | { |
| 152 | Word w; | 153 | Word w; |
| 153 | fread(&w,sizeof(w),1,D); | 154 | zread(Z,&w,sizeof(w)); |
| 154 | if (swapword) | 155 | if (swapword) |
| 155 | { | 156 | { |
| 156 | Byte* p=(Byte*)&w; | 157 | Byte* p=(Byte*)&w; |
| @@ -160,101 +161,101 @@ static int LoadWord(FILE* D) | |||
| 160 | return w; | 161 | return w; |
| 161 | } | 162 | } |
| 162 | 163 | ||
| 163 | static int LoadSize(FILE* D) | 164 | static int LoadSize(ZIO* Z) |
| 164 | { | 165 | { |
| 165 | Word hi=LoadWord(D); | 166 | Word hi=LoadWord(Z); |
| 166 | Word lo=LoadWord(D); | 167 | Word lo=LoadWord(Z); |
| 167 | int s=(hi<<16)|lo; | 168 | int s=(hi<<16)|lo; |
| 168 | if ((Word)s != s) lua_error("code too long"); | 169 | if ((Word)s != s) lua_error("code too long"); |
| 169 | return s; | 170 | return s; |
| 170 | } | 171 | } |
| 171 | 172 | ||
| 172 | static void* LoadBlock(int size, FILE* D) | 173 | static void* LoadBlock(int size, ZIO* Z) |
| 173 | { | 174 | { |
| 174 | void* b=luaI_malloc(size); | 175 | void* b=luaI_malloc(size); |
| 175 | fread(b,size,1,D); | 176 | zread(Z,b,size); |
| 176 | return b; | 177 | return b; |
| 177 | } | 178 | } |
| 178 | 179 | ||
| 179 | static char* LoadString(FILE* D) | 180 | static char* LoadString(ZIO* Z) |
| 180 | { | 181 | { |
| 181 | int size=LoadWord(D); | 182 | int size=LoadWord(Z); |
| 182 | char *b=luaI_buffer(size); | 183 | char *b=luaI_buffer(size); |
| 183 | fread(b,size,1,D); | 184 | zread(Z,b,size); |
| 184 | return b; | 185 | return b; |
| 185 | } | 186 | } |
| 186 | 187 | ||
| 187 | static char* LoadNewString(FILE* D) | 188 | static char* LoadNewString(ZIO* Z) |
| 188 | { | 189 | { |
| 189 | return LoadBlock(LoadWord(D),D); | 190 | return LoadBlock(LoadWord(Z),Z); |
| 190 | } | 191 | } |
| 191 | 192 | ||
| 192 | static void LoadFunction(FILE* D) | 193 | static void LoadFunction(ZIO* Z) |
| 193 | { | 194 | { |
| 194 | TFunc* tf=new(TFunc); | 195 | TFunc* tf=new(TFunc); |
| 195 | tf->next=NULL; | 196 | tf->next=NULL; |
| 196 | tf->locvars=NULL; | 197 | tf->locvars=NULL; |
| 197 | tf->size=LoadSize(D); | 198 | tf->size=LoadSize(Z); |
| 198 | tf->lineDefined=LoadWord(D); | 199 | tf->lineDefined=LoadWord(Z); |
| 199 | if (IsMain(tf)) /* new main */ | 200 | if (IsMain(tf)) /* new main */ |
| 200 | { | 201 | { |
| 201 | tf->fileName=LoadNewString(D); | 202 | tf->fileName=LoadNewString(Z); |
| 202 | Main=lastF=tf; | 203 | Main=lastF=tf; |
| 203 | } | 204 | } |
| 204 | else /* fix PUSHFUNCTION */ | 205 | else /* fix PUSHFUNCTION */ |
| 205 | { | 206 | { |
| 206 | tf->marked=LoadWord(D); | 207 | tf->marked=LoadWord(Z); |
| 207 | tf->fileName=Main->fileName; | 208 | tf->fileName=Main->fileName; |
| 208 | memcpy(Main->code+tf->marked,&tf,sizeof(tf)); | 209 | memcpy(Main->code+tf->marked,&tf,sizeof(tf)); |
| 209 | lastF=lastF->next=tf; | 210 | lastF=lastF->next=tf; |
| 210 | } | 211 | } |
| 211 | tf->code=LoadBlock(tf->size,D); | 212 | tf->code=LoadBlock(tf->size,Z); |
| 212 | if (swapword || swapfloat) FixCode(tf->code,tf->code+tf->size); | 213 | if (swapword || swapfloat) FixCode(tf->code,tf->code+tf->size); |
| 213 | while (1) /* unthread */ | 214 | while (1) /* unthread */ |
| 214 | { | 215 | { |
| 215 | int c=getc(D); | 216 | int c=zgetc(Z); |
| 216 | if (c==ID_VAR) /* global var */ | 217 | if (c==ID_VAR) /* global var */ |
| 217 | { | 218 | { |
| 218 | int i=LoadWord(D); | 219 | int i=LoadWord(Z); |
| 219 | char* s=LoadString(D); | 220 | char* s=LoadString(Z); |
| 220 | int v=luaI_findsymbolbyname(s); | 221 | int v=luaI_findsymbolbyname(s); |
| 221 | Unthread(tf->code,i,v); | 222 | Unthread(tf->code,i,v); |
| 222 | } | 223 | } |
| 223 | else if (c==ID_STR) /* constant string */ | 224 | else if (c==ID_STR) /* constant string */ |
| 224 | { | 225 | { |
| 225 | int i=LoadWord(D); | 226 | int i=LoadWord(Z); |
| 226 | char* s=LoadString(D); | 227 | char* s=LoadString(Z); |
| 227 | int v=luaI_findconstantbyname(s); | 228 | int v=luaI_findconstantbyname(s); |
| 228 | Unthread(tf->code,i,v); | 229 | Unthread(tf->code,i,v); |
| 229 | } | 230 | } |
| 230 | else | 231 | else |
| 231 | { | 232 | { |
| 232 | ungetc(c,D); | 233 | zungetc(Z); |
| 233 | break; | 234 | break; |
| 234 | } | 235 | } |
| 235 | } | 236 | } |
| 236 | } | 237 | } |
| 237 | 238 | ||
| 238 | static void LoadSignature(FILE* D) | 239 | static void LoadSignature(ZIO* Z) |
| 239 | { | 240 | { |
| 240 | char* s=SIGNATURE; | 241 | char* s=SIGNATURE; |
| 241 | while (*s!=0 && getc(D)==*s) | 242 | while (*s!=0 && zgetc(Z)==*s) |
| 242 | ++s; | 243 | ++s; |
| 243 | if (*s!=0) lua_error("cannot load binary file: bad signature"); | 244 | if (*s!=0) lua_error("cannot load binary file: bad signature"); |
| 244 | } | 245 | } |
| 245 | 246 | ||
| 246 | static void LoadHeader(FILE* D) | 247 | static void LoadHeader(ZIO* Z) |
| 247 | { | 248 | { |
| 248 | Word w,tw=TEST_WORD; | 249 | Word w,tw=TEST_WORD; |
| 249 | float f,tf=TEST_FLOAT; | 250 | float f,tf=TEST_FLOAT; |
| 250 | int version; | 251 | int version; |
| 251 | LoadSignature(D); | 252 | LoadSignature(Z); |
| 252 | version=getc(D); | 253 | version=zgetc(Z); |
| 253 | if (version>0x23) /* after 2.5 */ | 254 | if (version>0x23) /* after 2.5 */ |
| 254 | { | 255 | { |
| 255 | int oldsizeofW=getc(D); | 256 | int oldsizeofW=zgetc(Z); |
| 256 | int oldsizeofF=getc(D); | 257 | int oldsizeofF=zgetc(Z); |
| 257 | int oldsizeofP=getc(D); | 258 | int oldsizeofP=zgetc(Z); |
| 258 | if (oldsizeofW!=2) | 259 | if (oldsizeofW!=2) |
| 259 | luaL_verror( | 260 | luaL_verror( |
| 260 | "cannot load binary file created on machine with sizeof(Word)=%d; " | 261 | "cannot load binary file created on machine with sizeof(Word)=%d; " |
| @@ -266,14 +267,14 @@ static void LoadHeader(FILE* D) | |||
| 266 | if (oldsizeofP!=sizeof(TFunc*)) /* TODO: pack? */ | 267 | if (oldsizeofP!=sizeof(TFunc*)) /* TODO: pack? */ |
| 267 | luaL_verror( | 268 | luaL_verror( |
| 268 | "cannot load binary file created on machine with sizeof(TFunc*)=%d; " | 269 | "cannot load binary file created on machine with sizeof(TFunc*)=%d; " |
| 269 | "expected %d",oldsizeofP,sizeof(TFunc*)); | 270 | "expected %d",oldsizeofP,(int)sizeof(TFunc*)); |
| 270 | } | 271 | } |
| 271 | fread(&w,sizeof(w),1,D); /* test word */ | 272 | zread(Z,&w,sizeof(w)); /* test word */ |
| 272 | if (w!=tw) | 273 | if (w!=tw) |
| 273 | { | 274 | { |
| 274 | swapword=1; | 275 | swapword=1; |
| 275 | } | 276 | } |
| 276 | fread(&f,sizeof(f),1,D); /* test float */ | 277 | zread(Z,&f,sizeof(f)); /* test float */ |
| 277 | if (f!=tf) | 278 | if (f!=tf) |
| 278 | { | 279 | { |
| 279 | Byte* p=(Byte*)&f; | 280 | Byte* p=(Byte*)&f; |
| @@ -286,13 +287,13 @@ static void LoadHeader(FILE* D) | |||
| 286 | } | 287 | } |
| 287 | } | 288 | } |
| 288 | 289 | ||
| 289 | static void LoadChunk(FILE* D) | 290 | static void LoadChunk(ZIO* Z) |
| 290 | { | 291 | { |
| 291 | LoadHeader(D); | 292 | LoadHeader(Z); |
| 292 | while (1) | 293 | while (1) |
| 293 | { | 294 | { |
| 294 | int c=getc(D); | 295 | int c=zgetc(Z); |
| 295 | if (c==ID_FUN) LoadFunction(D); else { ungetc(c,D); break; } | 296 | if (c==ID_FUN) LoadFunction(Z); else { zungetc(Z); break; } |
| 296 | } | 297 | } |
| 297 | } | 298 | } |
| 298 | 299 | ||
| @@ -300,30 +301,26 @@ static void LoadChunk(FILE* D) | |||
| 300 | ** load one chunk from a file. | 301 | ** load one chunk from a file. |
| 301 | ** return list of functions found, headed by main, or NULL at EOF. | 302 | ** return list of functions found, headed by main, or NULL at EOF. |
| 302 | */ | 303 | */ |
| 303 | TFunc* luaI_undump1(FILE* D) | 304 | static TFunc* luaI_undump1(ZIO* Z) |
| 304 | { | 305 | { |
| 305 | while (1) | 306 | int c=zgetc(Z); |
| 307 | if (c==ID_CHUNK) | ||
| 306 | { | 308 | { |
| 307 | int c=getc(D); | 309 | LoadChunk(Z); |
| 308 | if (c==ID_CHUNK) | 310 | return Main; |
| 309 | { | ||
| 310 | LoadChunk(D); | ||
| 311 | return Main; | ||
| 312 | } | ||
| 313 | else if (c==EOF) | ||
| 314 | return NULL; | ||
| 315 | else | ||
| 316 | lua_error("not a lua binary file"); | ||
| 317 | } | 311 | } |
| 312 | else if (c!=EOZ) | ||
| 313 | lua_error("not a lua binary file"); | ||
| 314 | return NULL; | ||
| 318 | } | 315 | } |
| 319 | 316 | ||
| 320 | /* | 317 | /* |
| 321 | ** load and run all chunks in a file | 318 | ** load and run all chunks in a file |
| 322 | */ | 319 | */ |
| 323 | int luaI_undump(FILE* D) | 320 | int luaI_undump(ZIO* Z) |
| 324 | { | 321 | { |
| 325 | TFunc* m; | 322 | TFunc* m; |
| 326 | while ((m=luaI_undump1(D))) | 323 | while ((m=luaI_undump1(Z))) |
| 327 | { | 324 | { |
| 328 | int status=luaI_dorun(m); | 325 | int status=luaI_dorun(m); |
| 329 | luaI_freefunc(m); | 326 | luaI_freefunc(m); |
| @@ -1,10 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** undump.h | 2 | ** undump.h |
| 3 | ** definitions for lua decompiler | 3 | ** definitions for lua decompiler |
| 4 | ** $Id: undump.h,v 1.3 1996/11/14 11:44:34 lhf Exp lhf $ | 4 | ** $Id: undump.h,v 1.4 1997/04/14 12:12:40 lhf Exp roberto $ |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #include "func.h" | 7 | #include "func.h" |
| 8 | #include "zio.h" | ||
| 8 | 9 | ||
| 9 | #define IsMain(f) (f->lineDefined==0) | 10 | #define IsMain(f) (f->lineDefined==0) |
| 10 | 11 | ||
| @@ -19,5 +20,5 @@ | |||
| 19 | #define TEST_WORD 0x1234 /* a word for testing byte ordering */ | 20 | #define TEST_WORD 0x1234 /* a word for testing byte ordering */ |
| 20 | #define TEST_FLOAT 0.123456789e-23 /* a float for testing representation */ | 21 | #define TEST_FLOAT 0.123456789e-23 /* a float for testing representation */ |
| 21 | 22 | ||
| 22 | TFunc* luaI_undump1(FILE* D); /* load one chunk */ | 23 | |
| 23 | int luaI_undump(FILE* D); /* load all chunks */ | 24 | int luaI_undump(ZIO* Z); /* load all chunks */ |
