Allow cheat to generate save files with bogus numbers.
authorAaron Traas <aaron@traas.org>
Tue, 27 Jun 2017 14:46:26 +0000 (10:46 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Tue, 27 Jun 2017 20:13:49 +0000 (16:13 -0400)
Also remove pre-built save file for resumefail.log

advent.h
cheat.c
saveresume.c
tests/Makefile
tests/resume_badversion.testsave [deleted file]
tests/resumefail2.log

index cf529caf2d4db3161ebb2b44f2e916e5404e9651..2c95e979606548973b84417c51f93103cb8ef580 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -127,7 +127,7 @@ extern unsigned long get_next_lcg_value(void);
 extern long randrange(long);
 extern long score(enum termination);
 extern void terminate(enum termination) __attribute__((noreturn));
-extern int savefile(FILE *);
+extern int savefile(FILE *, long);
 extern int suspend(void);
 extern int resume(void);
 extern int restore(FILE *);
diff --git a/cheat.c b/cheat.c
index cb20eb7a3f3ac3eea1bcf36e8c4cd48c8b872ec4..fecfdc260e9e7054bf0194a410a97bf2f7a6caf4 100644 (file)
--- a/cheat.c
+++ b/cheat.c
@@ -25,10 +25,11 @@ int main(int argc, char *argv[])
     char *savefilename = NULL;
     long numdie = 0;
     long saved = 1;
+    long version = 0;
 
     /*  Options. */
-    const char* opts = "d:s:o:";
-    const char* usage = "Usage: %s [-d numdie] [-s numsaves] -o savefilename \n";
+    const char* opts = "d:s:v:o:";
+    const char* usage = "Usage: %s [-d numdie] [-s numsaves] [-v version] -o savefilename \n";
     while ((ch = getopt(argc, argv, opts)) != EOF) {
         switch (ch) {
         case 'd':
@@ -37,6 +38,9 @@ int main(int argc, char *argv[])
         case 's':
             saved = (long)atoi(optarg);
             break;
+        case 'v':
+            version = (long)atoi(optarg);;
+            break;
         case 'o':
             savefilename = optarg;
             break;
@@ -47,6 +51,8 @@ int main(int argc, char *argv[])
                     "        -d number of deaths. Signed integer value.'\n");
             fprintf(stderr,
                     "        -s number of saves. Signed integer value.\n");
+            fprintf(stderr,
+                    "        -v version number of save format.\n");
             fprintf(stderr,
                     "        -o file name of save game to write.\n");
             exit(-1);
@@ -87,11 +93,13 @@ int main(int argc, char *argv[])
     fp = fopen(savefilename, WRITE_MODE);
     if (fp == NULL)
     {
-        printf("Can't open file %s. Exiting.\n", savefilename);
+        fprintf(stderr,
+                "Can't open file %s. Exiting.\n", savefilename);
         exit(-1);
     }        
 
-    savefile(fp);
+    savefile(fp, version);
+    
     printf("cheat: %s created.\n", savefilename);
     return 0;
 }
index 3546378a5ae6d4e7e6ae44db7fb18b7e91beeb46..f4c694fddb66a5feca64cd9d6eaab2570699139c 100644 (file)
@@ -27,7 +27,7 @@ struct save_t {
 };
 struct save_t save;
 
-int savefile(FILE *fp)
+int savefile(FILE *fp, long version)
     /* Save game to file. No input or output from user. */
 {
     long i, k;
@@ -35,7 +35,9 @@ int savefile(FILE *fp)
     k = i + 650 * k;
     save.savetime = k;
     save.mode = -1;
-    save.version = VRSION;
+    
+    save.version = (version == 0) ? VRSION : version;
+    
     memcpy(&save.game, &game, sizeof(struct game_t));
     IGNORE(fwrite(&save, sizeof(struct save_t), 1, fp));
     return(0);
@@ -68,8 +70,7 @@ int suspend(void)
         linenoiseFree(name);
     }
 
-    savefile(fp);
-    IGNORE(fwrite(&save, sizeof(struct save_t), 1, fp));
+    savefile(fp, VRSION);
     fclose(fp);
     rspeak(RESUME_HELP);
     exit(0);
index cbef1424c8a38de300cc5fb4bb3ef11a1a76ea2e..21fceb75071a383791d16d743fe15e47b7873b92 100644 (file)
@@ -37,8 +37,10 @@ buildregress:
        done; \
        rm -f scratch.tmp
 regress:
-       $(ECHO) -n "Generate cheat file: "
+       $(ECHO) -n "Generate save file with -1000 deaths: "
        ../cheat -d -1000 -o cheat_numdie.adv
+       $(ECHO) -n "Generate save file with version -1337: "
+       ../cheat -v -1337 -o resume_badversion.adv
        @for file in $(TESTLOADS); do \
            $(ECHO) -n "  $${file} "; grep '##' $${file}.log  || echo ' ## (no description)'; \
            OPTS=`sed -n /#options:/s///p <$${file}.log`; \
diff --git a/tests/resume_badversion.testsave b/tests/resume_badversion.testsave
deleted file mode 100644 (file)
index ce3206a..0000000
Binary files a/tests/resume_badversion.testsave and /dev/null differ
index 92d7ab9889f105c1cc1b4e8b38a727d96b15a3a3..e8dcaf8eb6946de8808aa1373310a54b3a27ee89 100644 (file)
@@ -3,4 +3,4 @@ n
 seed 1240742801
 resume
 y
-resume_badversion.testsave
\ No newline at end of file
+resume_badversion.adv
\ No newline at end of file