+#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include "main.h"
long BLANK, CASE, I, K, L, NEG, NPARMS, PARM, PRMTYP, STATE;
/* Print the message which starts at LINES(N). Precede it with a blank line
- * unless BLKLIN is false. */
+ * unless game.blklin is false. */
if(N == 0)return;
- BLANK=BLKLIN;
+ BLANK=game.blklin;
K=N;
NPARMS=1;
L10: L=IABS(LINES[K])-1;
#define WORD1X (*wORD1X)
#define WORD2 (*wORD2)
#define WORD2X (*wORD2X)
-void fGETIN(long *wORD1, long *wORD1X, long *wORD2, long *wORD2X) {
+void fGETIN(FILE *input, long *wORD1, long *wORD1X, long *wORD2, long *wORD2X) {
long JUNK;
-/* Get a command from the adventurer. snarf out the first word, pad it with
+/* Get a command from the adventurer. Snarf out the first word, pad it with
* blanks, and return it in WORD1. Chars 6 thru 10 are returned in WORD1X, in
* case we need to print out the whole word in an error message. Any number of
* blanks may follow the word. If a second word appears, it is returned in
* WORD2 (chars 6 thru 10 in WORD2X), else WORD2 is -1. */
-L10: if(BLKLIN)TYPE0();
- MAPLIN(stdin);
- if(feof(stdin)) score(1);
+L10: if(game.blklin)TYPE0();
+ MAPLIN(input);
+ if(input == stdin && feof(stdin)) score(1);
WORD1=GETTXT(true,true,true,0);
- if(BLKLIN && WORD1 < 0) goto L10;
+ if(game.blklin && WORD1 < 0) goto L10;
WORD1X=GETTXT(false,true,true,0);
L12: JUNK=GETTXT(false,true,true,0);
if(JUNK > 0) goto L12;
#undef WORD1X
#undef WORD2
#undef WORD2X
-#define GETIN(WORD1,WORD1X,WORD2,WORD2X) fGETIN(&WORD1,&WORD1X,&WORD2,&WORD2X)
+#define GETIN(SRC,WORD1,WORD1X,WORD2,WORD2X) fGETIN(SRC,&WORD1,&WORD1X,&WORD2,&WORD2X)
#undef YES
-long fYES(long X, long Y, long Z) {
+long fYES(FILE *input, long X, long Y, long Z) {
long YES, REPLY, JUNK1, JUNK2, JUNK3;
* if no, print Z and return false. */
L1: RSPEAK(X);
- GETIN(REPLY,JUNK1,JUNK2,JUNK3);
+ GETIN(input, REPLY,JUNK1,JUNK2,JUNK3);
if(REPLY == MAKEWD(250519) || REPLY == MAKEWD(25)) goto L10;
if(REPLY == MAKEWD(1415) || REPLY == MAKEWD(14)) goto L20;
RSPEAK(185);
/* Start toting an object, removing it from the list of things at its former
* location. Incr holdng unless it was already being toted. If OBJECT>100
- * (moving "fixed" second loc), don't change PLACE or HOLDNG. */
+ * (moving "fixed" second loc), don't change PLACE or game.holdng. */
if(OBJECT > 100) goto L5;
if(PLACE[OBJECT] == -1)return;
PLACE[OBJECT]= -1;
- HOLDNG=HOLDNG+1;
+ game.holdng=game.holdng+1;
L5: if(ATLOC[WHERE] != OBJECT) goto L6;
ATLOC[WHERE]=LINK[OBJECT];
return;
;
/* Place an object at a given loc, prefixing it onto the ATLOC list. Decr
- * HOLDNG if the object was being toted. */
+ * game.holdng if the object was being toted. */
if(OBJECT > 100) goto L1;
- if(PLACE[OBJECT] == -1)HOLDNG=HOLDNG-1;
+ if(PLACE[OBJECT] == -1)game.holdng=game.holdng-1;
PLACE[OBJECT]=WHERE;
goto L2;
L1: {long x = OBJECT-100; FIXED[x]=WHERE;}
ATDWRF=0;
- if(DFLAG < 2)return(ATDWRF);
+ if(game.dflag < 2)return(ATDWRF);
ATDWRF= -1;
for (I=1; I<=5; I++) {
if(DLOC[I] == WHERE) goto L2;
if(MAP2[1] == 0)MPINIT();
+ if (!oldstyle && isatty(0))
+ fputs("> ", stdout);
IGNORE(fgets(INLINE+1,sizeof(INLINE)-1,OPENED));
- if (!feof(OPENED)) {
+ if (feof(OPENED)) {
+ if (logfp)
+ fclose(logfp);
+ } else {
+ if (logfp)
+ IGNORE(fputs(INLINE+1, logfp));
LNLENG=0;
for (I=1; I<=sizeof(INLINE) && INLINE[I]!=0; I++) {
VAL=INLINE[I]+1;