Add -l option to enable command logging.
authorEric S. Raymond <esr@thyrsus.com>
Tue, 23 May 2017 12:57:35 +0000 (08:57 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Tue, 23 May 2017 12:57:35 +0000 (08:57 -0400)
advent.txt
main.c
main.h
misc.c

index f286e83a388cbae9ef9525ed041fd8adb032f93f..9b955aac2bf5850d9877520231e1da1553966ba4 100644 (file)
@@ -24,6 +24,10 @@ port of the 1976 ancestor of this game.  To avoid a name collision,
 this game builds as 'advent', reflecting the fact that the PDP-10
 on which it originally ran limited filenames to 6 characters.
 
+== OPTIONS ==
+
+-l:: Log commands to specified file.
+
 == ENVIRONMENT VARIABLES ==
 ADVENTURE::
    Path to the text database file describing Colossal Cave.
diff --git a/main.c b/main.c
index 1cbf9e99255efc9a46c0a9306a0b50aa6a557698..378c1886e1ac4947c8b4e771f2f0aa47b37b8822 100644 (file)
--- a/main.c
+++ b/main.c
@@ -6,6 +6,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdbool.h>
+#include <getopt.h>
 #include "main.h"
 
 #include "misc.h"
@@ -39,6 +40,7 @@ long ABBNUM, ACTSPK[36], AMBER, ATTACK, AXE, BACK, BATTER, BEAR, BIRD, BLOOD, BO
                 TRVSIZ = 885, TTEXT[6], TURNS, URN, V1, V2, VASE, VEND, VERB,
                VOLCAN, VRBSIZ = 35, VRSION = 25, WATER, WD1, WD1X, WD2, WD2X,
                WZDARK = false, ZZWORD;
+FILE  *logfp;
 
 extern void initialise();
 extern void score(long);
@@ -49,6 +51,7 @@ extern int action(long);
  */
 
 int main(int argc, char *argv[]) {
+       int ch;
 
 /*  Adventure (rev 2: 20 treasures) */
 
@@ -58,6 +61,20 @@ int main(int argc, char *argv[]) {
  *             Errata fixed: 78/12/25 */
 
 
+/*  Options. */
+
+       while ((ch = getopt(argc, argv, "l:")) != EOF) {
+               switch (ch) {
+               case 'l':
+                       logfp = fopen(optarg, "w+");
+                       if (logfp == NULL)
+                               fprintf(stderr,
+                                       "advent: can't open logfile %s for write\n",
+                                       optarg);
+                       break;
+               }
+       }
+
 /* Logical variables:
  *
  *  CLOSED says whether we're all the way closed
@@ -90,8 +107,6 @@ int main(int argc, char *argv[]) {
        RSPEAK(201);
        exit(0);
 
-
-
 /*  Start-up, dwarf stuff */
 
 L1:    SETUP= -1;
diff --git a/main.h b/main.h
index 9dc7b3dbcc224980f57256f456772452e217c5e0..7a1d1c8ac94637a5b19d109ad0525214b604eb53 100644 (file)
--- a/main.h
+++ b/main.h
@@ -4,3 +4,4 @@ extern long ABB[], ATAB[], ATLOC[], BLKLIN, DFLAG, DLOC[], FIXED[], HOLDNG,
                KTAB[], *LINES, LINK[], LNLENG, LNPOSN,
                PARMS[], PLACE[], PTEXT[], RTEXT[], TABSIZ;
 extern signed char INLINE[LINESIZE+1], MAP1[], MAP2[];
+extern FILE *logfp;
diff --git a/misc.c b/misc.c
index 8f0a2b21680dc11522f1057e02d5d5da501cf442..fafc15c5255d382a8397ff04e72d9b31a52a5d19 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -885,7 +885,12 @@ long I, VAL;
        if(MAP2[1] == 0)MPINIT();
 
        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;