Resume from file on startup 93/head
authorNHOrus <jy6x2b32pie9@yahoo.com>
Fri, 16 Jun 2017 16:44:23 +0000 (19:44 +0300)
committerNHOrus <jy6x2b32pie9@yahoo.com>
Sat, 17 Jun 2017 06:20:42 +0000 (09:20 +0300)
advent.h
main.c
notes.adoc
saveresume.c

index ffde43c4f450b93959399434e95bdae5631d2151..2044cc265f51c05707df9365cd17667f0ec825d3 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -116,6 +116,7 @@ extern long randrange(long);
 extern void score(enum termination);
 extern int suspend(FILE *);
 extern int resume(FILE *);
+extern int restore(FILE *);
 
 /*
  *  MOD(N,M)   = Arithmetic modulus
diff --git a/main.c b/main.c
index d7ecd7797785b1d324d267af1d70fddfc23f2c57..a6fea59070fffdc6d5e3cc6ec759862f3b61ae46 100644 (file)
--- a/main.c
+++ b/main.c
@@ -43,7 +43,7 @@ long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
                URN, VASE, VEND, VOLCAN, WATER;
 long WD1, WD1X, WD2, WD2X;
 
-FILE  *logfp;
+FILE  *logfp = NULL, *rfp = NULL;
 bool oldstyle = false;
 bool editline = true;
 bool prompt = true;
@@ -53,9 +53,10 @@ extern int action(FILE *, long, long, long);
 
 void sig_handler(int signo)
 {
-    if (signo == SIGINT)
+    if (signo == SIGINT){
        if (logfp != NULL)
            fflush(logfp);
+       }
     exit(0);
 }
 
@@ -79,7 +80,7 @@ int main(int argc, char *argv[])
        
 /*  Options. */
 
-    while ((ch = getopt(argc, argv, "l:os")) != EOF) {
+    while ((ch = getopt(argc, argv, "l:or:s")) != EOF) {
        switch (ch) {
        case 'l':
            logfp = fopen(optarg, "w");
@@ -93,6 +94,14 @@ int main(int argc, char *argv[])
            oldstyle = true;
            editline = prompt = false;
            break;
+       case 'r':
+        rfp = fopen(optarg, "r");
+        if (rfp == NULL)
+        fprintf(stderr,
+            "advent: can't open save file %s for read\n",
+            optarg);
+        signal(SIGINT, sig_handler);
+        break;
        case 's':
            editline = false;
            break;
@@ -125,11 +134,15 @@ int main(int argc, char *argv[])
 
     /*  Start-up, dwarf stuff */
     game.zzword=RNDVOC(3,0);
-    game.novice=YES(stdin, WELCOME_YOU,CAVE_NEARBY,NO_MESSAGE);
     game.newloc = LOC_START;
     game.loc = LOC_START;
     game.limit=330;
-    if (game.novice)game.limit=1000;
+    if (!rfp){
+        game.novice=YES(stdin, WELCOME_YOU,CAVE_NEARBY,NO_MESSAGE);
+        if (game.novice)game.limit=1000;
+    } else {
+        restore(rfp);
+    }
 
     if (logfp)
        fprintf(logfp, "seed %ld\n", seedval);
index fd3504a6f2ce68a4d62668690e3b4542f0cf070e..f1716baf8b4c0a5d924b7c44c4d9fc6de94d7b28 100644 (file)
@@ -73,6 +73,9 @@ necessarily pretty ugly by modern standards. Encryption and
 checksumming have been discarded - it's pointless to try
 tamper-proofing saves when everyone has the source code.
 
+A -r command-line option has been added. It is functionally equivalent 
+to RESTORE command, but faster.
+
 == Translation ==
 
 The 2.5 code was a mechanical C translation of a FORTRAN original.
index e6961d2c60fbcb467d63287704ce637a100f140c..676fa24c28e8320bef8bf831215e723c889bca60 100644 (file)
@@ -86,6 +86,10 @@ int resume(FILE *input)
        linenoiseFree(name);
     }
 
+       return restore(fp);
+}
+
+int restore(FILE* fp){
     IGNORE(fread(&save, sizeof(struct save_t), 1, fp));
     fclose(fp);
     if (save.version != VRSION) {
@@ -101,4 +105,4 @@ int resume(FILE *input)
     return GO_TOP;
 }
 
-/* end */
+/* end */
\ No newline at end of file