X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/e55a4c69ad6dfa55e6a3262864f6dce13f495ba3..7f8ce380c17b94dcfdd0e409539a85f0cac815f3:/adventure/io.c diff --git a/adventure/io.c b/adventure/io.c index e3c80e89..eae7695c 100644 --- a/adventure/io.c +++ b/adventure/io.c @@ -1,4 +1,4 @@ -/* $NetBSD: io.c,v 1.12 2000/01/09 17:17:19 jsm Exp $ */ +/* $NetBSD: io.c,v 1.22 2009/08/25 06:56:52 dholland Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -17,11 +17,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -43,7 +39,7 @@ #if 0 static char sccsid[] = "@(#)io.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: io.c,v 1.12 2000/01/09 17:17:19 jsm Exp $"); +__RCSID("$NetBSD: io.c,v 1.22 2009/08/25 06:56:52 dholland Exp $"); #endif #endif /* not lint */ @@ -56,23 +52,34 @@ __RCSID("$NetBSD: io.c,v 1.12 2000/01/09 17:17:19 jsm Exp $"); #include "hdr.h" #include "extern.h" - +static int next(void); +static void rdesc(int); +static void rdefault(void); +static void rhints(void); +static void rliq(void); +static void rlocs(void); +static int rnum(void); +static void rtrav(void); +static void rvoc(void); + +/* get command from user */ +/* no prompt, usually */ void -getin(wrd1, wrd2) /* get command from user */ - char **wrd1, **wrd2; /* no prompt, usually */ +getin(char **wrd1, char **wrd2) { char *s; static char wd1buf[MAXSTR], wd2buf[MAXSTR]; - int first, numch; + int first, numch, c; *wrd1 = wd1buf; /* return ptr to internal str */ *wrd2 = wd2buf; wd2buf[0] = 0; /* in case it isn't set here */ for (s = wd1buf, first = 1, numch = 0;;) { - if ((*s = getchar()) >= 'A' && *s <= 'Z') + c = getchar(); + if ((*s = (char)c) >= 'A' && *s <= 'Z') *s = *s - ('A' - 'a'); /* convert to upper case */ - switch (*s) { /* start reading from user */ + switch (c) { /* start reading from user */ case '\n': *s = 0; return; @@ -104,9 +111,9 @@ getin(wrd1, wrd2) /* get command from user */ } } +/* confirm with rspeak */ int -yes(x, y, z) /* confirm with rspeak */ - int x, y, z; +yes(int x, int y, int z) { int result = TRUE; /* pacify gcc */ int ch; @@ -132,9 +139,9 @@ yes(x, y, z) /* confirm with rspeak */ return (result); } +/* confirm with mspeak */ int -yesm(x, y, z) /* confirm with mspeak */ - int x, y, z; +yesm(int x, int y, int z) { int result = TRUE; /* pacify gcc */ int ch; @@ -161,19 +168,20 @@ yesm(x, y, z) /* confirm with mspeak */ } /* FILE *inbuf,*outbuf; */ -char *inptr; /* Pointer into virtual disk */ +static char *inptr; /* Pointer into virtual disk */ -int outsw = 0; /* putting stuff to data file? */ +static int outsw = 0; /* putting stuff to data file? */ -const char iotape[] = "Ax3F'\003tt$8h\315qer*h\017nGKrX\207:!l"; -const char *tape = iotape; /* pointer to encryption tape */ +static const char iotape[] = "Ax3F'\003tt$8h\315qer*h\017nGKrX\207:!l"; +static const char *tape = iotape; /* pointer to encryption tape */ -int -next() -{ /* next virtual char, bump adr */ +/* next virtual char, bump adr */ +static int +next(void) +{ int ch; - ch = (*inptr ^ random()) & 0xFF; /* Decrypt input data */ + ch = (*inptr ^ random()) & 0xFF; /* Decrypt input data */ if (outsw) { /* putting data in tmp file */ if (*tape == 0) tape = iotape; /* rewind encryption tape */ @@ -183,18 +191,19 @@ next() return (ch); } -char breakch; /* tell which char ended rnum */ +static char breakch; /* tell which char ended rnum */ +/* "read" data from virtual file */ void -rdata() -{ /* "read" data from virtual file */ +rdata(void) +{ int sect; char ch; inptr = data_file; /* Pointer to virtual data file */ srandom(SEED); /* which is lightly encrypted. */ - clsses = 1; + classes = 1; for (;;) { /* read data sections */ sect = next() - '0'; /* 1st digit of section number */ #ifdef VERBOSE @@ -235,7 +244,7 @@ rdata() rlocs(); break; case 8: /* action defaults */ - rdflt(); + rdefault(); break; case 9: /* liquid assets */ rliq(); @@ -259,12 +268,12 @@ rdata() } } -char nbf[12]; +static char nbf[12]; - -int -rnum() -{ /* read initial location num */ +/* read initial location num */ +static int +rnum(void) +{ char *s; tape = iotape; /* restart encryption tape */ for (s = nbf, *s = 0;; s++) @@ -277,11 +286,11 @@ rnum() return (atoi(nbf)); /* convert it to integer */ } -char *seekhere; +static char *seekhere; -void -rdesc(sect) /* read description-format msgs */ - int sect; +/* read description-format msgs */ +static void +rdesc(int sect) { int locc; char *seekstart, *maystart; @@ -290,8 +299,9 @@ rdesc(sect) /* read description-format msgs */ outsw = 1; /* these msgs go into tmp file */ for (oldloc = -1, seekstart = seekhere;;) { maystart = inptr; /* maybe starting new entry */ - if ((locc = rnum()) != oldloc && oldloc >= 0 /* finished msg */ - && !(sect == 5 && (locc == 0 || locc >= 100))) { /* unless sect 5 */ + if ((locc = rnum()) != oldloc && oldloc >= 0 /* finished msg */ + /* unless sect 5 */ + && !(sect == 5 && (locc == 0 || locc >= 100))) { switch (sect) { /* now put it into right table */ case 1:/* long descriptions */ ltext[oldloc].seekadr = seekhere; @@ -306,18 +316,18 @@ rdesc(sect) /* read description-format msgs */ ptext[oldloc].txtlen = maystart - seekstart; break; case 6:/* random messages */ - if (oldloc > RTXSIZ) + if (oldloc >= RTXSIZE) errx(1,"Too many random msgs"); rtext[oldloc].seekadr = seekhere; rtext[oldloc].txtlen = maystart - seekstart; break; case 10: /* class messages */ - ctext[clsses].seekadr = seekhere; - ctext[clsses].txtlen = maystart - seekstart; - cval[clsses++] = oldloc; + ctext[classes].seekadr = seekhere; + ctext[classes].txtlen = maystart - seekstart; + cval[classes++] = oldloc; break; case 12: /* magic messages */ - if (oldloc > MAGSIZ) + if (oldloc >= MAGSIZE) errx(1,"Too many magic msgs"); mtext[oldloc].seekadr = seekhere; mtext[oldloc].txtlen = maystart - seekstart; @@ -333,7 +343,7 @@ rdesc(sect) /* read description-format msgs */ return; } if (sect != 5 || (locc > 0 && locc < 100)) { - if (oldloc != locc) /* starting a new message */ + if (oldloc != locc) /* starting a new message */ seekstart = maystart; oldloc = locc; } @@ -341,9 +351,10 @@ rdesc(sect) /* read description-format msgs */ } } -void -rtrav() -{ /* read travel table */ +/* read travel table */ +static void +rtrav(void) +{ int locc; struct travlist *t = NULL; char *s; @@ -351,7 +362,8 @@ rtrav() int len, m, n, entries = 0; for (oldloc = -1;;) { /* get another line */ - if ((locc = rnum()) != oldloc && oldloc >= 0) { /* end of entry */ + /* end of entry */ + if ((locc = rnum()) != oldloc && oldloc >= 0 && t) { t->next = 0; /* terminate the old entry */ /* printf("%d:%d entries\n",oldloc,entries); */ /* twrite(oldloc); */ @@ -359,8 +371,8 @@ rtrav() if (locc == -1) return; if (locc != oldloc) { /* getting a new entry */ - t = travel[locc] = (struct travlist *) malloc(sizeof(struct travlist)); - if ( t == NULL) + t = travel[locc] = calloc(1, sizeof(*t)); + if (t == NULL) err(1, NULL); /* printf("New travel list for %d\n",locc); */ entries = 0; @@ -377,27 +389,30 @@ rtrav() n = atoi(buf); /* newloc mod 1000 = newloc */ } else { /* a long integer */ n = atoi(buf + len - 3); - buf[len - 3] = 0; /* terminate newloc/1000 */ + buf[len - 3] = 0; /* terminate newloc/1000 */ m = atoi(buf); } while (breakch != LF) { /* only do one line at a time */ + if (t == NULL) + abort(); if (entries++) { - t = t->next = (struct travlist *) malloc(sizeof(struct travlist)); - if (t == NULL) + t->next = calloc(1, sizeof(*t)); + if (t->next == NULL) err(1, NULL); + t = t->next; } - t->tverb = rnum(); /* get verb from the file */ + t->tverb = rnum(); /* get verb from the file */ t->tloc = n; /* table entry mod 1000 */ - t->conditions = m; /* table entry / 1000 */ - /* printf("entry %d for %d\n",entries,locc); */ + t->conditions = m; /* table entry / 1000 */ + /* printf("entry %d for %d\n",entries,locc); */ } } } #ifdef DEBUG +/* travel options from this loc */ void -twrite(loq) /* travel options from this loc */ - int loq; +twrite(int loq) { struct travlist *t; printf("If"); @@ -417,17 +432,18 @@ twrite(loq) /* travel options from this loc */ } #endif /* DEBUG */ -void -rvoc() +/* read the vocabulary */ +static void +rvoc(void) { - char *s; /* read the vocabulary */ - int index; + char *s; + int idx; char buf[6]; for (;;) { - index = rnum(); - if (index < 0) + idx = rnum(); + if (idx < 0) break; - for (s = buf, *s = 0;; s++) /* get the word */ + for (s = buf, *s = 0;; s++) /* get the word */ if ((*s = next()) == TAB || *s == '\n' || *s == LF || *s == ' ') break; @@ -435,16 +451,16 @@ rvoc() if (*s != '\n' && *s != LF) FLUSHLF;/* can be comments */ *s = 0; - /* printf("\"%s\"=%d\n",buf,index); */ - vocab(buf, -2, index); + /* printf("\"%s\"=%d\n",buf,idx); */ + vocab(buf, -2, idx); } /* prht(); */ } - -void -rlocs() -{ /* initial object locations */ +/* initial object locations */ +static void +rlocs(void) +{ for (;;) { if ((obj = rnum()) < 0) break; @@ -456,50 +472,54 @@ rlocs() } } -void -rdflt() -{ /* default verb messages */ +/* default verb messages */ +static void +rdefault(void) +{ for (;;) { if ((verb = rnum()) < 0) break; - actspk[verb] = rnum(); + actspeak[verb] = rnum(); } } -void -rliq() -{ /* liquid assets &c: cond bits */ +/* liquid assets &c: cond bits */ +static void +rliq(void) +{ int bitnum; for (;;) { /* read new bit list */ if ((bitnum = rnum()) < 0) break; for (;;) { /* read locs for bits */ - cond[rnum()] |= setbit[bitnum]; + int n = rnum(); + if (n < 0) + break; + cond[n] |= setbit[bitnum]; if (breakch == LF) break; } } } -void -rhints() +static void +rhints(void) { int hintnum, i; - hntmax = 0; + hintmax = 0; for (;;) { if ((hintnum = rnum()) < 0) break; for (i = 1; i < 5; i++) hints[hintnum][i] = rnum(); - if (hintnum > hntmax) - hntmax = hintnum; + if (hintnum > hintmax) + hintmax = hintnum; } } void -rspeak(msg) - int msg; +rspeak(int msg) { if (msg != 0) speak(&rtext[msg]); @@ -507,27 +527,25 @@ rspeak(msg) void -mspeak(msg) - int msg; +mspeak(int msg) { if (msg != 0) speak(&mtext[msg]); } +/* read, decrypt, and print a message (not ptext) */ +/* msg is a pointer to seek address and length of mess */ void -speak(msg) /* read, decrypt, and print a message (not - * ptext) */ - const struct text *msg; /* msg is a pointer to seek address and length - * of mess */ +speak(const struct text *msg) { char *s, nonfirst; s = msg->seekadr; nonfirst = 0; - while (s - msg->seekadr < msg->txtlen) { /* read a line at a time */ + while (s - msg->seekadr < msg->txtlen) { /* read a line at a time */ tape = iotape; /* restart decryption tape */ - while ((*s++ ^ *tape++) != TAB); /* read past loc num */ + while ((*s++ ^ *tape++) != TAB); /* read past loc num */ /* assume tape is longer than location number */ /* plus the lookahead put together */ if ((*s ^ *tape) == '>' && @@ -540,20 +558,18 @@ speak(msg) /* read, decrypt, and print a message (not if (*tape == 0) tape = iotape; /* rewind decryp tape */ putchar(*s ^ *tape); - } while ((*s++ ^ *tape++) != LF); /* better end with LF */ + } while ((*s++ ^ *tape++) != LF); /* better end with LF */ } } - +/* read, decrypt and print a ptext message */ +/* msg is the number of all the p msgs for this place */ +/* assumes object 1 doesn't have prop 1, obj 2 no prop 2 &c */ void -pspeak(m, skip) /* read, decrypt an print a ptext message */ - int m; /* msg is the number of all the p msgs for - * this place */ - int skip; /* assumes object 1 doesn't have prop 1, obj 2 - * no prop 2 &c */ +pspeak(int m, int skip) { char *s, nonfirst; - char *numst, save; + char *numst; struct text *msg; char *tbuf; @@ -566,10 +582,10 @@ pspeak(m, skip) /* read, decrypt an print a ptext message */ nonfirst = 0; while (s - tbuf < msg->txtlen) { /* read line at a time */ tape = iotape; /* restart decryption tape */ - for (numst = s; (*s ^= *tape++) != TAB; s++); /* get number */ + for (numst = s; (*s ^= *tape++) != TAB; s++); /* get number */ - save = *s; /* Temporarily trash the string (cringe) */ - *s++ = 0; /* decrypting number within the string */ + /* Temporarily trash the string (cringe) */ + *s++ = 0; /* decrypting number within the string */ if (atoi(numst) != 100 * skip && skip >= 0) { while ((*s++ ^ *tape++) != LF) /* flush the line */ @@ -586,7 +602,7 @@ pspeak(m, skip) /* read, decrypt an print a ptext message */ if (*tape == 0) tape = iotape; putchar(*s ^ *tape); - } while ((*s++ ^ *tape++) != LF); /* better end with LF */ + } while ((*s++ ^ *tape++) != LF); /* better end with LF */ if (skip < 0) break; }