From 15f3ab09eb0bb4a8e08d9da7124a658e975eb954 Mon Sep 17 00:00:00 2001 From: Luiz Henrique de Figueiredo Date: Fri, 23 Feb 1996 16:04:38 -0300 Subject: [PATCH] load bytecodes from files --- undump.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 undump.c diff --git a/undump.c b/undump.c new file mode 100644 index 00000000..c3abd366 --- /dev/null +++ b/undump.c @@ -0,0 +1,134 @@ +/* +** undump.c +** load bytecodes from files +*/ + +char *rcs_undump="$Id$"; + +#include +#include +#include "luac.h" + +static void warn(char *s) +{ + fprintf(stderr,"luac: %s\n",s); +} + +static void panic(char *s) +{ + warn(s); + exit(1); +} + +static void Unthread(Byte *p, int i, int v) +{ + while (i!=0) + { + CodeWord c; + Byte *q=p+i; + get_word(c,q); + q=p+i; + i=c.w; + c.w=v; + q[0]=c.m.c1; + q[1]=c.m.c2; + } +} + +static char* LoadBlock(int size, FILE *D) +{ + char *b=luaI_malloc(size); + fread(b,size,1,D); + return b; +} + +static int LoadWord(FILE *D) +{ + Word w; + fread(&w,sizeof(w),1,D); + return w; +} + +static char* LoadString(FILE *D) +{ + return LoadBlock(LoadWord(D),D); +} + +static char* LoadCode(int size, FILE *D) +{ + return LoadBlock(size,D); +} + +static TFunc* LoadFunction(FILE *D) +{ + TFunc *tf=new(TFunc); + tf->size=LoadWord(D); + tf->marked=LoadWord(D); + tf->lineDefined=LoadWord(D); + tf->fileName=LoadString(D); + tf->code=LoadCode(tf->size,D); + while (1) + { + int c=getc(D); + if (c=='V') + { + int i=LoadWord(D); + char *s=LoadString(D); + int v=luaI_findsymbolbyname(s); + Unthread(tf->code,i,v); + } + else if (c=='S') + { + int i=LoadWord(D); + char *s=LoadString(D); + int v=luaI_findconstantbyname(s); + Unthread(tf->code,i,v); + } + else + { +PrintFunction(tf); + ungetc(c,D); + return tf; + } + } +} + +static void LoadHeader(FILE *D) +{ + char *s=LoadString(D); + Word w,tw=TEST_WORD; + float f,tf=TEST_FLOAT; + if (strcmp(s,SIGNATURE)!=0) panic("bad signature"); + getc(D); /* skip version */ + fread(&w,sizeof(w),1,D); /* a word for testing byte ordering */ + if (w!=tw) warn("different byte order"); + fread(&f,sizeof(f),1,D); /* a float for testing byte ordering */ + if (f!=tf) warn("different float representation"); +} + +static void LoadChunk(FILE *D) +{ + LoadHeader(D); + while (1) + { + int c=getc(D); + if (c=='F') LoadFunction(D); else { ungetc(c,D); return; } + } +} + +void Undump(FILE *D) +{ + while (1) + { + int c=getc(D); + if (c==ESC) LoadChunk(D); else + if (c==EOF) return; else + panic("not a lua binary file"); + } +} + +int main(int argc, char* argv[]) +{ + Undump(stdin); + return 0; +}