From a520a327be9e16725d7b2cf85551eabe984d84a5 Mon Sep 17 00:00:00 2001 From: ketmar Date: Fri, 16 Mar 2012 16:26:05 +0200 Subject: [PATCH] alot of things changed in code file format; preparing for room local scripts --- src/awasm.c | 220 ++++++++++++++++++++++++++++++++++++++++++------------ src/awish.c | 12 ++- src/gameglobals.c | 98 ++++++++++++++++++------ src/gameglobals.h | 10 ++- 4 files changed, 264 insertions(+), 76 deletions(-) diff --git a/src/awasm.c b/src/awasm.c index 9f77f2f..105a2df 100644 --- a/src/awasm.c +++ b/src/awasm.c @@ -359,6 +359,7 @@ static int nextToken (void) { typedef struct LabelRefInfo { struct LabelRefInfo *next; int pc; + int size; } LabelRefInfo; @@ -367,8 +368,9 @@ typedef struct LabelInfo { char *name; int type; // LB_XXXX int value; // code && <0: not defined yet (forward ref) - int ext; // extern? + int ext; // extern (<0), public(>0), normal(0) LabelRefInfo *fixes; // for undefined code labels + LabelRefInfo *refs; // for externals int used; } LabelInfo; @@ -389,7 +391,7 @@ static LabelRefInfo *lrefRemoveDups (LabelRefInfo *list) { int dup = 0; // if (list != NULL) { - for (LabelRefInfo *r = list; r != c; r = r->next) if (r->pc == c->pc) { dup = 1; break; } + for (LabelRefInfo *r = list; r != c; r = r->next) if (r->pc == c->pc && r->size == c->size) { dup = 1; break; } } // if (dup) { @@ -414,12 +416,11 @@ static LabelRefInfo *lrefRemoveDups (LabelRefInfo *list) { static LabelRefInfo *addLabelRefToList (LabelRefInfo *list, int pc) { LabelRefInfo *res; // - //for (res = list; res != NULL; res = res->next) if (res->pc == pc) return list; - // res = calloc(1, sizeof(LabelRefInfo)); if (res == NULL) fatal("out of memory"); res->next = list; res->pc = pc; + res->size = 2; return res; } @@ -434,10 +435,22 @@ static void freeLabelRefList (LabelRefInfo *list) { } +static void addExternRef (LabelInfo *l, int pc, int size) { + if (l != NULL && l->ext < 0) { + if (size <= 0) { + size = (l->type == LB_CODE || l->type == LB_CONST || l->type == LB_SVAR) ? 2 : 1; + } + l->refs = addLabelRefToList(l->refs, pc); + l->refs->size = size; + } +} + + static void addLabelRef (LabelInfo *l, int pc) { if (l != NULL) { l->used = 1; - if (l->type == LB_CODE) { + addExternRef(l, pc, -1); + if (l->type == LB_CODE && l->ext >= 0) { // record fixup info for undefined code labels if (l->value < 0) l->fixes = addLabelRefToList(l->fixes, pc); // record reference info for code labels @@ -463,7 +476,7 @@ static void fixupLabelRefs (LabelInfo *l, int pc) { static void checkLabels (void) { for (LabelInfo *l = labels; l != NULL; l = l->next) { - if (l->type == LB_CODE && l->value < 0) fatal("undefined %slabel: '%s'", l->used?"":"not referenced ", l->name); + if (l->type == LB_CODE && l->ext >= 0 && l->value < 0) fatal("undefined %slabel: '%s'", l->used?"":"not referenced ", l->name); if (!l->used) { l->used = -1; fprintf(stderr, "WARNING: unused %s label '%s'\n", ltnames[l->type], l->name); } } } @@ -476,6 +489,7 @@ static void freeLabels (void) { // labels = l->next; freeLabelRefList(l->fixes); + freeLabelRefList(l->refs); free(l->name); free(l); } @@ -489,10 +503,11 @@ static void freeLocalLabels (int onlyVars) { LabelInfo *n = l->next; // if ((!onlyVars || l->type != LB_CODE) && l->name[0] == '.') { - if (l->type == LB_CODE && l->value < 0) fatal("undefined %slabel: '%s'", l->used?"":"not referenced ", l->name); + if (l->type == LB_CODE && l->ext >= 0 && l->value < 0) fatal("undefined %slabel: '%s'", l->used?"":"not referenced ", l->name); if (!l->used) { l->used = -1; fprintf(stderr, "WARNING: unused %s label '%s'\n", ltnames[l->type], l->name); } //if (l->type == LB_CODE && l->value < 0) fatal("undefined label: '%s'", l->name); freeLabelRefList(l->fixes); + freeLabelRefList(l->refs); free(l->name); free(l); if (p != NULL) p->next = n; else labels = n; @@ -526,6 +541,7 @@ static LabelInfo *addLabel (const char *name) { l->value = -1; l->ext = 0; l->fixes = NULL; + l->refs = NULL; l->next = labels; labels = l; return l; @@ -658,10 +674,11 @@ static void emitOperand (OperandInfo *op) { // from label op->l->used = 1; switch (op->l->type) { - case LB_GVAR: emitByte(op->l->value|0x80); break; - case LB_TVAR: emitByte(op->l->value); break; + case LB_GVAR: addLabelRef(op->l, pc); emitByte(op->l->value|0x80); break; + case LB_TVAR: addLabelRef(op->l, pc); emitByte(op->l->value); break; case LB_SVAR: emitByte(127); // special + addLabelRef(op->l, pc); emitByte(op->l->value&0xff); emitByte((op->l->value>>8)&0xff); break; @@ -1070,7 +1087,7 @@ static void parseInlcude (void) { } -static void parseVarList (int type, int local) { +static void parseVarList (int type, int local, int gotext) { for (;;) { LabelInfo *l; // @@ -1078,19 +1095,33 @@ static void parseVarList (int type, int local) { if (tstr[0] == '.' && local <= 0) fatal("invalid variable name: '%s'", tstr); if (tstr[0] != '.' && local > 0) fatal("invalid variable name: '%s'", tstr); l = findLabel(tstr); - if (l != NULL) fatal("duplicate variable or label: '%s'", tstr); - l = addLabel(tstr); - l->type = type; - if (local > 0 && vtloc <= vtlast) fatal("too many local vars"); - l->value = local>0?(--vtloc):(type==LB_GVAR?vglast++:vtlast++); - if (local < 0) l->ext = 1; + if (l != NULL) { + if (gotext) { + if (l->ext >= 0) fatal("can't declare existing label as extern: '%s'", tstr); + if (l->type != type) fatal("can't change existing extern label type: '%s'", tstr); + } else { + fatal("duplicate variable or label: '%s'", tstr); + } + } + if (l == NULL) { + l = addLabel(tstr); + l->type = type; + if (local > 0 && vtloc <= vtlast) fatal("too many local vars"); + if (gotext) { + l->value = 0; + } else { + l->value = (local>0)?(--vtloc):(type==LB_GVAR?vglast++:vtlast++); + } + if (local < 0) l->ext = 1; + } + if (gotext) l->ext = -1; if (l->value > 126) fatal("too many vars"); if (nextToken() != ',') break; } } -static void parseExterns (void) { +static void parsePublics (void) { for (;;) { LabelInfo *l; // @@ -1130,19 +1161,32 @@ static void parseLocList (void) { } -static void parseConst (int ext) { +static void parseConst (int ext, int gotext) { LabelInfo *l; // if (nextToken() != TK_ID) fatal("identifier expected"); if (tstr[0] == '.') fatal("invalid constant name: '%s'", tstr); l = findLabel(tstr); - if (l != NULL) fatal("constant must be unique: '%s'", tstr); - l = addLabel(tstr); - if (nextToken() == '=') nextToken(); - if (token != TK_NUM) fatal("constant must be numeric"); - l->type = LB_CONST; - l->value = tint; - l->ext = ext; + if (l != NULL) { + if (gotext) { + if (l->ext >= 0) fatal("can't declare existing label as extern: '%s'", tstr); + if (l->type != LB_CONST) fatal("can't change existing extern label type: '%s'", tstr); + } else { + fatal("constant must be unique: '%s'", tstr); + } + } + if (l == NULL) { + l = addLabel(tstr); + l->type = LB_CONST; + l->value = 0; + } + if (!gotext) { + if (nextToken() == '=') nextToken(); + if (token != TK_NUM) fatal("constant must be numeric"); + l->value = tint; + } + if (ext) l->ext = 1; + if (gotext) l->ext = -1; nextToken(); } @@ -1251,11 +1295,14 @@ static void doReturn (void) { } -static void parseLabel (void) { +static void parseLabel (int gotext) { LabelInfo *l; // + if (gotext && tstr[0] == '.') fatal("can't declare local extern label: '%s'", tstr); if (tstr[0] != '.' && tstr[0] != '@') { - if (procname[0]) fatal("you can not define non-special global labels inside proc ('%s')", procname); + if (!gotext) { + if (procname[0]) fatal("you can not define non-special global labels inside proc ('%s')", procname); + } freeLocalLabels(0); // vars and code } if (tstr[0] == '@') { @@ -1266,6 +1313,10 @@ static void parseLabel (void) { } l = findLabel(tstr); if (l != NULL) { + if (gotext) { + if (l->ext >= 0) fatal("can't declare existing label as extern: '%s'", tstr); + if (l->type != LB_CODE) fatal("can't change existing extern label type: '%s'", tstr); + } if (l->type != LB_CODE || l->value >= 0) fatal("duplicate label: '%s'", tstr); fixupLabelRefs(l, pc); } else { @@ -1273,6 +1324,7 @@ static void parseLabel (void) { l->type = LB_CODE; l->value = pc; } + if (gotext) l->ext = -1; nextToken(); } @@ -1287,6 +1339,7 @@ static void parseDB (void) { if (l->type == LB_CODE) fatal("bad label type: '%s'", l->name); l->used = 1; tint = l->value; + addExternRef(l, pc, 1); } else if (token != TK_NUM) { fatal("number expected"); } @@ -1310,6 +1363,7 @@ static void parseDW (void) { //fatal("unknown label: '%s'", tstr); } addLabelRef(l, pc); + addExternRef(l, pc, 2); tint = l->value; } else if (token != TK_NUM) { fatal("number expected"); @@ -1399,6 +1453,7 @@ static void parseDAscii (int zeroend) { if (l == NULL) fatal("unknown label: '%s'", tstr); if (l->type == LB_CODE) fatal("bad label type: '%s'", l->name); l->used = 1; + addExternRef(l, pc, 1); tint = l->value; } else if (token != TK_NUM) { fatal("number expected"); @@ -1413,7 +1468,9 @@ static void parseDAscii (int zeroend) { static void process (void) { + int gotext = 0; LabelInfo *l = addLabel("retval"); + // l->type = LB_TVAR; l->value = VM_VARS_SIZE-1; // @@ -1424,45 +1481,81 @@ static void process (void) { int opc; // if (token == TK_LABELDEF) { + if (strcmp(tstr, "extern") == 0) { + if (gotext) fatal("double 'extern'"); + gotext = 1; + nextToken(); + continue; + } // new label or operator if (strcmp(tstr, "include") == 0) { parseInlcude(); + continue; } else if (strcmp(tstr, "defloc") == 0) { + if (gotext) fatal("extern labels must not be locals"); parseLocList(); } else if (strcmp(tstr, "defgvar") == 0) { - parseVarList(LB_GVAR, 0); + parseVarList(LB_GVAR, 0, gotext); } else if (strcmp(tstr, "defevar") == 0) { // extern global - parseVarList(LB_GVAR, -1); + parseVarList(LB_GVAR, -1, gotext); } else if (strcmp(tstr, "deftvar") == 0) { freeLocalLabels(1); // only vars vtloc = VM_VARS_SIZE; - parseVarList(LB_TVAR, 0); + parseVarList(LB_TVAR, 0, gotext); } else if (strcmp(tstr, "defetvar") == 0) { freeLocalLabels(1); // only vars vtloc = VM_VARS_SIZE; - parseVarList(LB_TVAR, -1); + parseVarList(LB_TVAR, -1, gotext); } else if (strcmp(tstr, "deflvar") == 0) { - parseVarList(LB_TVAR, 1); - } else if (strcmp(tstr, "extern") == 0) { - parseExterns(); + if (gotext) fatal("extern labels must not be locals"); + parseVarList(LB_TVAR, 1, gotext); + } else if (strcmp(tstr, "public") == 0) { + if (gotext) fatal("invalid extern label declaration"); + parsePublics(); } else if (strcmp(tstr, "proc") == 0 || strcmp(tstr, "eproc") == 0) { + if (gotext) fatal("invalid extern label declaration"); parseProc(tstr[0] == 'e'); } else if (strcmp(tstr, "endp") == 0) { + if (gotext) fatal("invalid extern label declaration"); parseEndP(); } else if (strcmp(tstr, "const") == 0 || strcmp(tstr, "econst") == 0) { - parseConst(tstr[0] == 'e'); + parseConst(tstr[0] == 'e', gotext); } else if (strcmp(tstr, "db") == 0) { + if (gotext) fatal("invalid extern label declaration"); parseDB(); } else if (strcmp(tstr, "dw") == 0) { + if (gotext) fatal("invalid extern label declaration"); parseDW(); } else if (strcmp(tstr, "da") == 0) { + if (gotext) fatal("invalid extern label declaration"); parseDAscii(0); } else if (strcmp(tstr, "dz") == 0) { + if (gotext) fatal("invalid extern label declaration"); parseDAscii(1); } else { - parseLabel(); + parseLabel(gotext); } + gotext = 0; continue; + } else { + if (gotext) { + LabelInfo *l; + // + if (token != TK_ID) fatal("label declaration expected after 'extern'"); + if (tstr[0] == '.') fatal("extern label can't be local: '%s'", tstr); + l = findLabel(tstr); + if (l != NULL) { + if (l->ext >= 0) fatal("can't declare existing label as extern: '%s'", tstr); + if (l->type != LB_CODE) fatal("can't change existing extern label type: '%s'", tstr); + } else { + l = addLabel(tstr); + l->type = LB_CODE; + l->value = 0; + l->ext = -1; + } + nextToken(); + continue; + } } // if (token < TK_VM_OPERATOR) fatal("mnemonics expected"); @@ -1608,14 +1701,12 @@ static int cfWriteRels (FILE *fl) { } -static int cfWriteLabels (FILE *fl) { +static int cfWritePublicLabels (FILE *fl) { for (LabelInfo *l = labels; l != NULL; l = l->next) { - if (l->ext) { + if (l->ext >= 0 && l->name[0]) { int len = strlen(l->name); // - if (len < 1) continue; - // - if (cfWriteByte(fl, l->type) != 0) return -1; + if (cfWriteByte(fl, l->type|(l->ext>0?0x80:0)) != 0) return -1; // switch (l->type) { case LB_GVAR: @@ -1640,27 +1731,60 @@ static int cfWriteLabels (FILE *fl) { } +static int cfWriteExtLabels (FILE *fl) { + for (LabelInfo *l = labels; l != NULL; l = l->next) { + if (l->ext < 0 && l->name[0] && l->refs != NULL) { + int len = strlen(l->name), rcnt = 0; + // + if (cfWriteByte(fl, l->type) != 0) return -1; + if (len > 255) len = 255; + if (cfWriteByte(fl, len) != 0) return -1; + for (int f = 0; f < len; ++f) if (cfWriteByte(fl, (unsigned char)(l->name[f])) != 0) return -1; + // + for (LabelRefInfo *r = l->refs; r != NULL; r = r->next) ++rcnt; + if (cfWriteWord(fl, rcnt) != 0) return -1; + for (LabelRefInfo *r = l->refs; r != NULL; r = r->next) { + if (cfWriteByte(fl, r->size) != 0) return -1; + if (cfWriteWord(fl, r->pc) != 0) return -1; + } + } + } + return 0; +} + + static int writeCodeFile (FILE *fl) { static const char *sign = "AVM1"; - int lcnt = 0; + int lcnt = 0, elcnt = 0; int rcnt = 0; // relrefs = lrefRemoveDups(relrefs); for (LabelRefInfo *r = relrefs; r != NULL; r = r->next) ++rcnt; - for (LabelInfo *l = labels; l != NULL; l = l->next) if (l->ext && l->name[0]) ++lcnt; - fprintf(stderr, "%d bytes of code, %d public labels, %d fixups\n", pc, lcnt, rcnt); + for (LabelInfo *l = labels; l != NULL; l = l->next) { + if (l->name[0]) { + if (l->ext >= 0) ++lcnt; + if (l->ext < 0) { + l->refs = lrefRemoveDups(l->refs); + if (l->refs != NULL) ++elcnt; + } + } + } + fprintf(stderr, "%d bytes of code, %d public labels, %d fixups, %d externs\n", pc, lcnt, rcnt, elcnt); // if (fwrite(sign, 4, 1, fl) != 1) return -1; // code size if (cfWriteWord(fl, pc) != 0) return -1; - // number of labels - if (cfWriteWord(fl, lcnt) != 0) return -1; // number of fixups if (cfWriteWord(fl, rcnt) != 0) return -1; + // number of extern labels + if (cfWriteWord(fl, elcnt) != 0) return -1; + // number of labels + if (cfWriteWord(fl, lcnt) != 0) return -1; // if (cfWriteCode(fl) != 0) return -1; if (cfWriteRels(fl) != 0) return -1; - if (cfWriteLabels(fl) != 0) return -1; + if (cfWriteExtLabels(fl) != 0) return -1; + if (cfWritePublicLabels(fl) != 0) return -1; // return 0; } @@ -1687,6 +1811,7 @@ int main (int argc, char *argv[]) { //while (nextToken() != TK_EOF) printf("%d [%s] %d\n", token, tstr, tint); return 0; process(); while (ictx != NULL) closeFile(); + freeLocalLabels(0); // vars and code checkLabels(); //if (argc > 3) dumpGlobalVars(argv[3]); { @@ -1703,5 +1828,6 @@ int main (int argc, char *argv[]) { } } freeLabels(); + freeLabelRefList(relrefs); return 0; } diff --git a/src/awish.c b/src/awish.c index 35ff38d..5f8deaa 100644 --- a/src/awish.c +++ b/src/awish.c @@ -351,13 +351,13 @@ int main (int argc, char *argv[]) { } } // + if (vmInitialize() != 0) fatal("can't init VM"); + // memset(vmGVars, 0, sizeof(vmGVars)); - //vmGVars[GVAR_KEY_QUIT] = 0; - //vmGVars[GVAR_KEY_START] = 0; - vmGVars[GVAR_GOOBERS] = goobers; vmRSTCB = awishRST; // - if (vmInitialize() != 0) fatal("can't init VM"); + addLabel("flag_skip_title", LB_GVAR, 120, 1); // 1: public + vmGVars[120] = 0; // vmCodeSize = 100; if ((csz = loadVMCode(&resfile, vmCodeSize)) < 1) { @@ -367,6 +367,10 @@ int main (int argc, char *argv[]) { vmCodeSize += csz; initLabels(); // + //vmGVars[GVAR_KEY_QUIT] = 0; + //vmGVars[GVAR_KEY_START] = 0; + vmGVars[GVAR_GOOBERS] = goobers; + // vmSetPC(0, CODE_ENTRY_TITLE); if (vmExecuteBSR(0, CODE_ENTRY_MAIN_INIT, 0) != 0) fatal("can't initialize game"); if (goobers) fprintf(stderr, "MAX LEVEL: %d\n", vmGVars[GVAR_MAX_LEVEL]); diff --git a/src/gameglobals.c b/src/gameglobals.c index d7a9ffb..055ff43 100644 --- a/src/gameglobals.c +++ b/src/gameglobals.c @@ -68,7 +68,7 @@ void freeLabelsUntilMark (void) { } -static void labelAddMark (void) { +void labelAddMark (void) { LabelInfo *l = malloc(sizeof(LabelInfo)); // if (l == NULL) fatal("out of memory"); @@ -76,10 +76,29 @@ static void labelAddMark (void) { l->type = LB_MARK; l->value = -1; l->next = labels; + l->pub = 0; labels = l; } +LabelInfo *addLabel (const char *name, int type, int value, int pub) { + if (name != NULL && name[0]) { + LabelInfo *l = malloc(sizeof(LabelInfo)); + // + if (l == NULL) fatal("out of memory"); + l->name = strdup(name); + if (l->name == NULL) fatal("out of memory"); + l->type = type; + l->value = value; + l->pub = pub; + l->next = labels; + labels = l; + return l; + } + return NULL; +} + + #define SECRET (42) @@ -110,9 +129,8 @@ static void labelAddMark (void) { int loadVMCode (ResFile *resfile, int pc) { int rsz = 0, pos = 0; char sign[4]; - int csize, lcnt, rcnt; + int csize, lcnt, rcnt, elcnt; uint8_t *buf = loadResFile(resfile, 93, &rsz); - int *rels = NULL; // if (buf == NULL) return -1; for (int f = 4; f < rsz; ++f) buf[f] ^= SECRET; @@ -121,24 +139,20 @@ int loadVMCode (ResFile *resfile, int pc) { if (memcmp(sign, "AVM1", 4) != 0) goto quitbufonly; // XREADW(csize, quitbufonly); - XREADW(lcnt, quitbufonly); - XREADW(rcnt, quitbufonly); + XREADW(rcnt, quitbufonly); // fixups + XREADW(elcnt, quitbufonly); // extern labels + XREADW(lcnt, quitbufonly); // labels if (pc < 0 || pc+csize > 65535) goto quitbufonly; // - if (goobers) fprintf(stderr, "code: %d bytes, %d public labels, %d relocations\n", csize, lcnt, rcnt); + if (goobers) fprintf(stderr, "code: %d bytes, %d public labels, %d relocations, %d externs\n", csize, lcnt, rcnt, elcnt); // XREAD(vmCode+pc, csize, quitbufonly); // - if (rcnt > 0) { - rels = calloc(rcnt, sizeof(int)); - if (rels == NULL) fatal("out of memory"); - for (int f = 0; f < rcnt; ++f) XREADW(rels[f], quitbufonly); - } // do relocations for (int f = 0; f < rcnt; ++f) { int rel, newpc, val; // - rel = rels[f]; + XREADW(rel, quitbufonly); if (rel < 0 || rel+1 >= csize) goto quitbufonly; newpc = pc+rel; // fix here // get old value @@ -152,15 +166,58 @@ int loadVMCode (ResFile *resfile, int pc) { vmCode[newpc+1] = (val>>8)&0xff; } // - labelAddMark(); + // load extern labels and perform fixups + for (int f = 0; f < elcnt; ++f) { + char name[258]; + int type, namelen; + int rcnt; + // + XREADB(type, quitbufonly); + XREADB(namelen, quitbufonly); + XREAD(name, namelen, quitbufonly); + XREADW(rcnt, quitbufonly); + // + if (type < LB_MIN_TYPE || type > LB_MAX_TYPE) goto quitbufonly; + if (namelen < 1) goto quitbufonly; + name[namelen] = 0; + // + for (int c = 0; c < rcnt; ++c) { + int xpc, size, val; + LabelInfo *l; + // + XREADB(size, quitbufonly); + XREADW(xpc, quitbufonly); + // + if (size != 1 && size != 2) goto quitbufonly; + if (xpc < 0 || xpc+size > csize) goto quitbufonly; + // + xpc += pc; + l = findLabel(name); + if (l == NULL) { + if (goobers) fprintf(stderr, "VM: unknown extern: '%s'\n", name); + goto quitbufonly; + } + val = l->value; + if (l->type == LB_GVAR) val |= 0x80; + fprintf(stderr, "%d: [%s]: ofs=%d, size=%d, value=%d (%d)\n", c, l->name, xpc, size, val, vmCode[xpc]); + if (size == 1 && (val < -128 || val > 255)) { + if (goobers) fprintf(stderr, "VM: extern too big: '%s'\n", name); + goto quitbufonly; + } + vmCode[xpc+0] = val&0xff; + if (size == 2) vmCode[xpc+1] = (val>>8)&0xff; + } + } // + labelAddMark(); // for this code labels for (int f = 0; f < lcnt; ++f) { unsigned char type, namelen, b; + char name[258]; int value; // XREADB(type, quit); // - switch (type) { + switch (type&0x7f) { case LB_GVAR: case LB_TVAR: XREADB(b, quit); @@ -181,16 +238,10 @@ int loadVMCode (ResFile *resfile, int pc) { } // XREADB(namelen, quit); - LabelInfo *l = malloc(sizeof(LabelInfo)); + XREAD(name, namelen, quit); + name[namelen] = 0; // - if (l == NULL) fatal("out of memory"); - l->name = calloc(namelen+1, 1); - if (l->name == NULL) fatal("out of memory"); - l->type = type; - l->value = value; - l->next = labels; - labels = l; - XREAD(l->name, namelen, quit); + if (namelen > 0) addLabel(name, type&0x7f, value, type&0x80?1:0); //if (l->type == LB_CODE) printf("%d/%d: [%s] %d : %d\n", f, lcnt, l->name, l->value-pc, l->value); } // @@ -199,7 +250,6 @@ int loadVMCode (ResFile *resfile, int pc) { quit: freeLabelsUntilMark(); quitbufonly: - if (rels) free(rels); free(buf); return -1; } diff --git a/src/gameglobals.h b/src/gameglobals.h index ca2747c..76a13fb 100644 --- a/src/gameglobals.h +++ b/src/gameglobals.h @@ -39,11 +39,13 @@ extern SpriteBank banks[256]; enum { - LB_GVAR, + LB_MIN_TYPE = 0, + LB_GVAR = 0, LB_TVAR, LB_SVAR, LB_CODE, LB_CONST, + LB_MAX_TYPE, LB_MARK = -1 }; @@ -53,6 +55,7 @@ typedef struct LabelInfo { char *name; int type; int value; + int pub; // public? } LabelInfo; //extern LabelInfo *labels; @@ -63,6 +66,11 @@ extern void fatal (const char *fmt, ...) __attribute__((__noreturn__)) __attribu extern int loadVMCode (ResFile *resfile, int pc); extern void freeLabels (void); +extern void freeLabelsUntilMark (void); + +extern void labelAddMark (void); +extern LabelInfo *addLabel (const char *name, int type, int value, int pub); + extern LabelInfo *findLabel (const char *name); extern int findPC (const char *name); -- 2.11.4.GIT