commit 15f3ab09eb0bb4a8e08d9da7124a658e975eb954
parent c7e834f424f97f3b300cda931e607c37612cd2a4
Author: Luiz Henrique de Figueiredo <lhf@tecgraf.puc-rio.br>
Date: Fri, 23 Feb 1996 16:04:18 -0300
load bytecodes from files
Diffstat:
A | undump.c | | | 134 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 134 insertions(+), 0 deletions(-)
diff --git a/undump.c b/undump.c
@@ -0,0 +1,134 @@
+/*
+** undump.c
+** load bytecodes from files
+*/
+
+char *rcs_undump="$Id$";
+
+#include <stdio.h>
+#include <string.h>
+#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;
+}