Flush log on interrupt, just for convenience.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 27130aac1d8735421025b912fafaf9d9915a8782..7834084eac3ed27472688c23bade12ac7475eafc 100644 (file)
--- a/main.c
+++ b/main.c
@@ -7,7 +7,7 @@
 #include <stdio.h>
 #include <stdbool.h>
 #include <getopt.h>
-#include <string.h>
+#include <signal.h>
 #include "main.h"
 
 #include "misc.h"
@@ -17,8 +17,7 @@ long ABB[186], ATAB[331], ATLOC[186], BLKLIN = true, DFLAG,
                KTAB[331], *LINES, LINK[201], LNLENG, LNPOSN,
                PARMS[26], PLACE[101], PTEXT[101], RTEXT[278],
                SETUP = 0, TABSIZ = 330;
-signed char INLINE[LINESIZE+1], MAP1[129], MAP2[129];
-signed char raw_input[LINESIZE+1];
+signed char rawbuf[LINESIZE], INLINE[LINESIZE+1], MAP1[129], MAP2[129];
 
 long ABBNUM, ACTSPK[36], AMBER, ATTACK, AXE, BACK, BATTER, BEAR, BIRD, BLOOD, BONUS,
                 BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST, CHLOC, CHLOC2,
@@ -50,6 +49,14 @@ extern void initialise();
 extern void score(long);
 extern int action(FILE *, long);
 
+void sig_handler(int signo)
+{
+    if (signo == SIGINT)
+       if (logfp != NULL)
+           fflush(logfp);
+    exit(0);
+}
+
 /*
  * MAIN PROGRAM
  */
@@ -58,7 +65,6 @@ static bool do_command(FILE *);
 
 int main(int argc, char *argv[]) {
        int ch;
-       time_t starttime = time(NULL);
 
 /*  Adventure (rev 2: 20 treasures) */
 
@@ -78,6 +84,7 @@ int main(int argc, char *argv[]) {
                                fprintf(stderr,
                                        "advent: can't open logfile %s for write\n",
                                        optarg);
+                       signal(SIGINT, sig_handler);
                        break;
                case 'o':
                    oldstyle = true;
@@ -102,7 +109,8 @@ int main(int argc, char *argv[]) {
        lcgstate.a = 1093;
        lcgstate.c = 221587;
        lcgstate.m = 1048576;
-       set_seed((long)starttime);
+       long seedval = (long)time(NULL);
+       set_seed(seedval);
 
 /*  Read the database if we have not yet done so */
 
@@ -136,7 +144,8 @@ L1: SETUP= -1;
        if(NOVICE)LIMIT=1000;
 
        if (logfp)
-           fprintf(logfp, "seed %ld\n", starttime);
+           fprintf(logfp, "seed %ld\n", seedval);
+       
        for (;;) {
            if (!do_command(stdin))
                break;
@@ -144,11 +153,23 @@ L1:       SETUP= -1;
        score(1);
 }
 
+static bool fallback_handler(signed char *buf)
+/* fallback handler for commands not handled by FORTRANish parser */
+{
+    long sv;
+    if (sscanf(buf, "seed %ld", &sv) == 1) {
+       set_seed(sv);
+       printf("Seed set to %ld\n", sv);
+       return true;
+    }
+    return false;
+}
+
 static bool do_command(FILE *cmdin) {
 
 /*  Can't leave cave once it's closing (except by main office). */
 
-L2:    if(!OUTSID(NEWLOC) || NEWLOC == 0 || !CLOSNG) goto L71;
+       if(!OUTSID(NEWLOC) || NEWLOC == 0 || !CLOSNG) goto L71;
        RSPEAK(130);
        NEWLOC=LOC;
        if(!PANIC)CLOCK2=15;
@@ -456,19 +477,10 @@ L2800:    WD1=WD2;
 /*  Gee, I don't understand. */
 
 L3000: SETPRM(1,WD1,WD1X);
-        /* This is a kludge. The command parser we inherited from the base 2.5
-         * barfs on numeric tokens. It will fall through to here when it sees
-         * seed NNNN. Instead of barfing, go straight to the action processor
-         * where it will examine the raw input. This will fo away when we get
-         * rid of the obfuscated FORTRANoid input processing.
-         */
-        if (strncmp(raw_input, "seed", 4) == 0) {
-            I=4090; K=34;
-            goto Laction;
-        } else {
-            RSPEAK(254);
-            goto L2600;
-        }
+        if (fallback_handler(rawbuf))
+            return true;
+       RSPEAK(254);
+        goto L2600;
 
 /* Verb and object analysis moved to separate module. */