Untangle gotos
Some LXXXX refactored as functions with more meaningful names Remove unused globals
This commit is contained in:
parent
467a255653
commit
5632f5eba4
1 changed files with 231 additions and 172 deletions
309
compile.c
309
compile.c
|
@ -22,16 +22,8 @@ const char ascii_to_advent[] = {0, 74, 75, 76, 77, 78, 79, 80, 81, 82, 0, 0, 85,
|
||||||
long LNLENG;
|
long LNLENG;
|
||||||
long LNPOSN;
|
long LNPOSN;
|
||||||
char INLINE[LINESIZE+1];
|
char INLINE[LINESIZE+1];
|
||||||
long I;
|
|
||||||
long K;
|
|
||||||
long KK;
|
|
||||||
long L;
|
|
||||||
long LOC;
|
|
||||||
long NEWLOC;
|
long NEWLOC;
|
||||||
long OBJ;
|
|
||||||
long OLDLOC;
|
long OLDLOC;
|
||||||
long SECT;
|
|
||||||
long VERB;
|
|
||||||
|
|
||||||
// Storage for what comes out of the database
|
// Storage for what comes out of the database
|
||||||
long LINUSE;
|
long LINUSE;
|
||||||
|
@ -68,6 +60,14 @@ void BUG(long);
|
||||||
void MAPLIN(FILE*);
|
void MAPLIN(FILE*);
|
||||||
long GETNUM(FILE*);
|
long GETNUM(FILE*);
|
||||||
int read_database(FILE*);
|
int read_database(FILE*);
|
||||||
|
void read_messages(FILE*, long);
|
||||||
|
void read_section3_stuff(FILE*);
|
||||||
|
void read_vocabulary(FILE*);
|
||||||
|
void read_initial_locations(FILE*);
|
||||||
|
void read_action_verb_message_nr(FILE*);
|
||||||
|
void read_conditions(FILE*);
|
||||||
|
void read_hints(FILE*);
|
||||||
|
void read_sound_text(FILE*);
|
||||||
void write_0d(FILE*, FILE*, long, char*);
|
void write_0d(FILE*, FILE*, long, char*);
|
||||||
void write_1d(FILE*, FILE*, long[], long, char*);
|
void write_1d(FILE*, FILE*, long[], long, char*);
|
||||||
void write_hints(FILE*, FILE*, long[][5], long, long, char*);
|
void write_hints(FILE*, FILE*, long[][5], long, long, char*);
|
||||||
|
@ -94,40 +94,36 @@ long GETTXT(long SKIP,long ONEWRD, long UPPER) {
|
||||||
if(LNPOSN != SPLITTING)
|
if(LNPOSN != SPLITTING)
|
||||||
SPLITTING = -1;
|
SPLITTING = -1;
|
||||||
GETTXT= -1;
|
GETTXT= -1;
|
||||||
L10:
|
while (true) {
|
||||||
if(LNPOSN > LNLENG)
|
if(LNPOSN > LNLENG)
|
||||||
return(GETTXT);
|
return(GETTXT);
|
||||||
if((!SKIP) || INLINE[LNPOSN] != 0)
|
if((!SKIP) || INLINE[LNPOSN] != 0)
|
||||||
goto L11;
|
break;
|
||||||
LNPOSN=LNPOSN+1;
|
LNPOSN=LNPOSN+1;
|
||||||
goto L10;
|
}
|
||||||
|
|
||||||
L11:
|
|
||||||
GETTXT=0;
|
GETTXT=0;
|
||||||
for (int I=1; I<=5; I++) {
|
for (int I=1; I<=5; I++) {
|
||||||
GETTXT=GETTXT*64;
|
GETTXT=GETTXT*64;
|
||||||
if(LNPOSN > LNLENG || (ONEWRD && INLINE[LNPOSN] == 0))
|
if(LNPOSN > LNLENG || (ONEWRD && INLINE[LNPOSN] == 0))
|
||||||
continue;
|
continue;
|
||||||
CHAR=INLINE[LNPOSN];
|
CHAR=INLINE[LNPOSN];
|
||||||
if(CHAR >= 63)
|
if(CHAR < 63) {
|
||||||
goto L12;
|
|
||||||
SPLITTING = -1;
|
SPLITTING = -1;
|
||||||
if(UPPER && CHAR >= 37)
|
if(UPPER && CHAR >= 37)
|
||||||
CHAR=CHAR-26;
|
CHAR=CHAR-26;
|
||||||
GETTXT=GETTXT+CHAR;
|
GETTXT=GETTXT+CHAR;
|
||||||
goto L14;
|
LNPOSN=LNPOSN+1;
|
||||||
|
continue;
|
||||||
L12:
|
}
|
||||||
if(SPLITTING == LNPOSN)
|
if(SPLITTING != LNPOSN) {
|
||||||
goto L13;
|
|
||||||
GETTXT=GETTXT+63;
|
GETTXT=GETTXT+63;
|
||||||
SPLITTING = LNPOSN;
|
SPLITTING = LNPOSN;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
L13:
|
|
||||||
GETTXT=GETTXT+CHAR-63;
|
GETTXT=GETTXT+CHAR-63;
|
||||||
SPLITTING = -1;
|
SPLITTING = -1;
|
||||||
L14:
|
|
||||||
LNPOSN=LNPOSN+1;
|
LNPOSN=LNPOSN+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,24 +215,33 @@ long GETNUM(FILE *source) {
|
||||||
if(source != NULL) MAPLIN(source);
|
if(source != NULL) MAPLIN(source);
|
||||||
GETNUM = 0;
|
GETNUM = 0;
|
||||||
|
|
||||||
while (INLINE[LNPOSN] == 0)
|
while (INLINE[LNPOSN] == 0) {
|
||||||
{
|
|
||||||
if (LNPOSN > LNLENG) return(GETNUM);
|
if (LNPOSN > LNLENG) return(GETNUM);
|
||||||
++LNPOSN;
|
++LNPOSN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(INLINE[LNPOSN] != 9)
|
||||||
|
{
|
||||||
SIGN=1;
|
SIGN=1;
|
||||||
if(INLINE[LNPOSN] != 9) goto L32;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
SIGN= -1;
|
SIGN= -1;
|
||||||
L30: LNPOSN=LNPOSN+1;
|
LNPOSN=LNPOSN+1;
|
||||||
L32: if(LNPOSN > LNLENG || INLINE[LNPOSN] == 0) goto L42;
|
}
|
||||||
|
while (!(LNPOSN > LNLENG || INLINE[LNPOSN] == 0))
|
||||||
|
{
|
||||||
DIGIT=INLINE[LNPOSN]-64;
|
DIGIT=INLINE[LNPOSN]-64;
|
||||||
if(DIGIT < 0 || DIGIT > 9) goto L40;
|
if(DIGIT < 0 || DIGIT > 9)
|
||||||
|
{
|
||||||
|
GETNUM=0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
GETNUM=GETNUM*10+DIGIT;
|
GETNUM=GETNUM*10+DIGIT;
|
||||||
goto L30;
|
LNPOSN=LNPOSN+1;
|
||||||
|
}
|
||||||
|
|
||||||
L40: GETNUM=0;
|
GETNUM=GETNUM*SIGN;
|
||||||
L42: GETNUM=GETNUM*SIGN;
|
|
||||||
LNPOSN=LNPOSN+1;
|
LNPOSN=LNPOSN+1;
|
||||||
return(GETNUM);
|
return(GETNUM);
|
||||||
}
|
}
|
||||||
|
@ -274,161 +279,215 @@ int read_database(FILE* database) {
|
||||||
|
|
||||||
/* Start new data section. Sect is the section number. */
|
/* Start new data section. Sect is the section number. */
|
||||||
|
|
||||||
L1002: SECT=GETNUM(database);
|
while(true)
|
||||||
|
{
|
||||||
|
long SECT=GETNUM(database);
|
||||||
OLDLOC= -1;
|
OLDLOC= -1;
|
||||||
switch (SECT) {
|
switch (SECT)
|
||||||
|
{
|
||||||
case 0: return(0);
|
case 0: return(0);
|
||||||
case 1: goto L1004;
|
case 1: read_messages(database, SECT); break;
|
||||||
case 2: goto L1004;
|
case 2: read_messages(database, SECT); break;
|
||||||
case 3: goto L1030;
|
case 3: read_section3_stuff(database); break;
|
||||||
case 4: goto L1040;
|
case 4: read_vocabulary(database); break;
|
||||||
case 5: goto L1004;
|
case 5: read_messages(database, SECT); break;
|
||||||
case 6: goto L1004;
|
case 6: read_messages(database, SECT); break;
|
||||||
case 7: goto L1050;
|
case 7: read_initial_locations(database); break;
|
||||||
case 8: goto L1060;
|
case 8: read_action_verb_message_nr(database); break;
|
||||||
case 9: goto L1070;
|
case 9: read_conditions(database); break;
|
||||||
case 10: goto L1004;
|
case 10: read_messages(database, SECT); break;
|
||||||
case 11: goto L1080;
|
case 11: read_hints(database); break;
|
||||||
case 12: break;
|
case 12: break;
|
||||||
case 13: goto L1090;
|
case 13: read_sound_text(database); break;
|
||||||
case 14: goto L1004;
|
case 14: read_messages(database, SECT); break;
|
||||||
default: BUG(9);
|
default: BUG(9);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Sections 1, 2, 5, 6, 10, 14. Read messages and set up pointers. */
|
/* Sections 1, 2, 5, 6, 10, 14. Read messages and set up pointers. */
|
||||||
|
void read_messages(FILE* database, long SECT)
|
||||||
L1004: KK=LINUSE;
|
{
|
||||||
L1005: LINUSE=KK;
|
long KK=LINUSE;
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
long LOC;
|
||||||
|
LINUSE=KK;
|
||||||
LOC=GETNUM(database);
|
LOC=GETNUM(database);
|
||||||
if(LNLENG >= LNPOSN+70)BUG(0);
|
if(LNLENG >= LNPOSN+70)BUG(0);
|
||||||
if(LOC == -1) goto L1002;
|
if(LOC == -1) return;
|
||||||
if(LNLENG < LNPOSN)BUG(1);
|
if(LNLENG < LNPOSN)BUG(1);
|
||||||
L1006: KK=KK+1;
|
do {
|
||||||
|
KK=KK+1;
|
||||||
if(KK >= LINSIZ)BUG(2);
|
if(KK >= LINSIZ)BUG(2);
|
||||||
LINES[KK]=GETTXT(false,false,false);
|
LINES[KK]=GETTXT(false,false,false);
|
||||||
if(LINES[KK] != -1) goto L1006;
|
}
|
||||||
|
while(LINES[KK] != -1);
|
||||||
LINES[LINUSE]=KK;
|
LINES[LINUSE]=KK;
|
||||||
if(LOC == OLDLOC) goto L1005;
|
if(LOC == OLDLOC) continue;
|
||||||
OLDLOC=LOC;
|
OLDLOC=LOC;
|
||||||
LINES[LINUSE]= -KK;
|
LINES[LINUSE]= -KK;
|
||||||
if(SECT == 14) goto L1014;
|
if(SECT == 14)
|
||||||
if(SECT == 10) goto L1012;
|
{
|
||||||
if(SECT == 6) goto L1011;
|
TRNVLS=TRNVLS+1;
|
||||||
if(SECT == 5) goto L1010;
|
|
||||||
if(LOC > LOCSIZ)BUG(10);
|
|
||||||
if(SECT == 1) goto L1008;
|
|
||||||
|
|
||||||
STEXT[LOC]=LINUSE;
|
|
||||||
goto L1005;
|
|
||||||
|
|
||||||
L1008: LTEXT[LOC]=LINUSE;
|
|
||||||
goto L1005;
|
|
||||||
|
|
||||||
L1010: if(LOC > 0 && LOC <= 100)PTEXT[LOC]=LINUSE;
|
|
||||||
goto L1005;
|
|
||||||
|
|
||||||
L1011: if(LOC > RTXSIZ)BUG(6);
|
|
||||||
RTEXT[LOC]=LINUSE;
|
|
||||||
goto L1005;
|
|
||||||
|
|
||||||
L1012: CLSSES=CLSSES+1;
|
|
||||||
if(CLSSES > CLSMAX)BUG(11);
|
|
||||||
CTEXT[CLSSES]=LINUSE;
|
|
||||||
CVAL[CLSSES]=LOC;
|
|
||||||
goto L1005;
|
|
||||||
|
|
||||||
L1014: TRNVLS=TRNVLS+1;
|
|
||||||
if(TRNVLS > TRNSIZ)BUG(11);
|
if(TRNVLS > TRNSIZ)BUG(11);
|
||||||
TTEXT[TRNVLS]=LINUSE;
|
TTEXT[TRNVLS]=LINUSE;
|
||||||
TRNVAL[TRNVLS]=LOC;
|
TRNVAL[TRNVLS]=LOC;
|
||||||
goto L1005;
|
continue;
|
||||||
|
}
|
||||||
|
if(SECT == 10)
|
||||||
|
{
|
||||||
|
CLSSES=CLSSES+1;
|
||||||
|
if(CLSSES > CLSMAX)BUG(11);
|
||||||
|
CTEXT[CLSSES]=LINUSE;
|
||||||
|
CVAL[CLSSES]=LOC;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(SECT == 6)
|
||||||
|
{
|
||||||
|
if(LOC > RTXSIZ)BUG(6);
|
||||||
|
RTEXT[LOC]=LINUSE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(SECT == 5)
|
||||||
|
{
|
||||||
|
if(LOC > 0 && LOC <= 100)PTEXT[LOC]=LINUSE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(LOC > LOCSIZ)BUG(10);
|
||||||
|
if(SECT == 1)
|
||||||
|
{
|
||||||
|
LTEXT[LOC]=LINUSE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
STEXT[LOC]=LINUSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The stuff for section 3 is encoded here. Each "from-location" gets a
|
/* The stuff for section 3 is encoded here. Each "from-location" gets a
|
||||||
* contiguous section of the "TRAVEL" array. Each entry in travel is
|
* contiguous section of the "TRAVEL" array. Each entry in travel is
|
||||||
* NEWLOC*1000 + KEYWORD (from section 4, motion verbs), and is negated if
|
* NEWLOC*1000 + KEYWORD (from section 4, motion verbs), and is negated if
|
||||||
* this is the last entry for this location. KEY(N) is the index in travel
|
* this is the last entry for this location. KEY(N) is the index in travel
|
||||||
* of the first option at location N. */
|
* of the first option at location N. */
|
||||||
|
void read_section3_stuff(FILE* database)
|
||||||
L1030: LOC=GETNUM(database);
|
{
|
||||||
if(LOC == -1) goto L1002;
|
long LOC;
|
||||||
NEWLOC=GETNUM(NULL);
|
while((LOC=GETNUM(database)) != -1)
|
||||||
if(KEY[LOC] != 0) goto L1033;
|
{
|
||||||
|
long NEWLOC=GETNUM(NULL);
|
||||||
|
long L;
|
||||||
|
if(KEY[LOC] == 0)
|
||||||
|
{
|
||||||
KEY[LOC]=TRVS;
|
KEY[LOC]=TRVS;
|
||||||
goto L1035;
|
}
|
||||||
L1033: TRVS--; TRAVEL[TRVS]= -TRAVEL[TRVS]; TRVS++;
|
else
|
||||||
L1035: L=GETNUM(NULL);
|
{
|
||||||
if(L == 0) goto L1039;
|
TRAVEL[TRVS-1]= -TRAVEL[TRVS-1];
|
||||||
|
}
|
||||||
|
while((L=GETNUM(NULL)) != 0)
|
||||||
|
{
|
||||||
TRAVEL[TRVS]=NEWLOC*1000+L;
|
TRAVEL[TRVS]=NEWLOC*1000+L;
|
||||||
TRVS=TRVS+1;
|
TRVS=TRVS+1;
|
||||||
if(TRVS == TRVSIZ)BUG(3);
|
if(TRVS == TRVSIZ)BUG(3);
|
||||||
goto L1035;
|
}
|
||||||
L1039: TRVS--; TRAVEL[TRVS]= -TRAVEL[TRVS]; TRVS++;
|
TRAVEL[TRVS-1]= -TRAVEL[TRVS-1];
|
||||||
goto L1030;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Here we read in the vocabulary. KTAB(N) is the word number, ATAB(N) is
|
/* Here we read in the vocabulary. KTAB(N) is the word number, ATAB(N) is
|
||||||
* the corresponding word. The -1 at the end of section 4 is left in KTAB
|
* the corresponding word. The -1 at the end of section 4 is left in KTAB
|
||||||
* as an end-marker. */
|
* as an end-marker. */
|
||||||
|
void read_vocabulary(FILE* database)
|
||||||
L1040:
|
{
|
||||||
for (TABNDX=1; TABNDX<=TABSIZ; TABNDX++) {
|
for (TABNDX=1; TABNDX<=TABSIZ; TABNDX++)
|
||||||
|
{
|
||||||
KTAB[TABNDX]=GETNUM(database);
|
KTAB[TABNDX]=GETNUM(database);
|
||||||
if(KTAB[TABNDX] == -1) goto L1002;
|
if(KTAB[TABNDX] == -1) return;
|
||||||
ATAB[TABNDX]=GETTXT(true,true,true);
|
ATAB[TABNDX]=GETTXT(true,true,true);
|
||||||
} /* end loop */
|
} /* end loop */
|
||||||
BUG(4);
|
BUG(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Read in the initial locations for each object. Also the immovability info.
|
/* Read in the initial locations for each object. Also the immovability info.
|
||||||
* plac contains initial locations of objects. FIXD is -1 for immovable
|
* plac contains initial locations of objects. FIXD is -1 for immovable
|
||||||
* objects (including the snake), or = second loc for two-placed objects. */
|
* objects (including the snake), or = second loc for two-placed objects. */
|
||||||
|
void read_initial_locations(FILE* database)
|
||||||
L1050: OBJ=GETNUM(database);
|
{
|
||||||
if(OBJ == -1) goto L1002;
|
long OBJ;
|
||||||
|
while((OBJ=GETNUM(database)) != -1)
|
||||||
|
{
|
||||||
PLAC[OBJ]=GETNUM(NULL);
|
PLAC[OBJ]=GETNUM(NULL);
|
||||||
FIXD[OBJ]=GETNUM(NULL);
|
FIXD[OBJ]=GETNUM(NULL);
|
||||||
goto L1050;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Read default message numbers for action verbs, store in ACTSPK. */
|
/* Read default message numbers for action verbs, store in ACTSPK. */
|
||||||
|
void read_action_verb_message_nr(FILE* database)
|
||||||
L1060: VERB=GETNUM(database);
|
{
|
||||||
if(VERB == -1) goto L1002;
|
long VERB;
|
||||||
|
while((VERB=GETNUM(database)) != -1)
|
||||||
|
{
|
||||||
ACTSPK[VERB]=GETNUM(NULL);
|
ACTSPK[VERB]=GETNUM(NULL);
|
||||||
goto L1060;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Read info about available liquids and other conditions, store in COND. */
|
/* Read info about available liquids and other conditions, store in COND. */
|
||||||
|
void read_conditions(FILE* database)
|
||||||
L1070: K=GETNUM(database);
|
{
|
||||||
if(K == -1) goto L1002;
|
long K;
|
||||||
L1071: LOC=GETNUM(NULL);
|
while((K=GETNUM(database)) != -1)
|
||||||
if(LOC == 0) goto L1070;
|
{
|
||||||
|
long LOC;
|
||||||
|
while((LOC=GETNUM(NULL)) != 0)
|
||||||
|
{
|
||||||
if(is_set(COND[LOC],K)) BUG(8);
|
if(is_set(COND[LOC],K)) BUG(8);
|
||||||
COND[LOC]=COND[LOC] + (1l << K);
|
COND[LOC]=COND[LOC] + (1l << K);
|
||||||
goto L1071;
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Read data for hints. */
|
/* Read data for hints. */
|
||||||
|
void read_hints(FILE* database)
|
||||||
L1080: HNTMAX=0;
|
{
|
||||||
L1081: K=GETNUM(database);
|
long K;
|
||||||
if(K == -1) goto L1002;
|
HNTMAX=0;
|
||||||
|
while((K=GETNUM(database)) != -1)
|
||||||
|
{
|
||||||
if(K <= 0 || K > HNTSIZ)BUG(7);
|
if(K <= 0 || K > HNTSIZ)BUG(7);
|
||||||
for (int I=1; I<=4; I++) {
|
for (int I=1; I<=4; I++)
|
||||||
|
{
|
||||||
HINTS[K][I] =GETNUM(NULL);
|
HINTS[K][I] =GETNUM(NULL);
|
||||||
} /* end loop */
|
} /* end loop */
|
||||||
HNTMAX=(HNTMAX>K ? HNTMAX : K);
|
HNTMAX=(HNTMAX>K ? HNTMAX : K);
|
||||||
goto L1081;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Read the sound/text info, store in OBJSND, OBJTXT, LOCSND. */
|
/* Read the sound/text info, store in OBJSND, OBJTXT, LOCSND. */
|
||||||
|
void read_sound_text(FILE* database)
|
||||||
L1090: K=GETNUM(database);
|
{
|
||||||
if(K == -1) goto L1002;
|
long K;
|
||||||
KK=GETNUM(NULL);
|
while((K=GETNUM(database)) != -1)
|
||||||
I=GETNUM(NULL);
|
{
|
||||||
if(I == 0) goto L1092;
|
long KK=GETNUM(NULL);
|
||||||
|
long I=GETNUM(NULL);
|
||||||
|
if(I != 0)
|
||||||
|
{
|
||||||
OBJSND[K]=(KK>0 ? KK : 0);
|
OBJSND[K]=(KK>0 ? KK : 0);
|
||||||
OBJTXT[K]=(I>0 ? I : 0);
|
OBJTXT[K]=(I>0 ? I : 0);
|
||||||
goto L1090;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
L1092: LOCSND[K]=KK;
|
LOCSND[K]=KK;
|
||||||
goto L1090;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finish constructing internal data format */
|
/* Finish constructing internal data format */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue