refactored fallback_handler() to use command_t, isolating from side effects
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index c3fc353c22281231c0db22ed137416c8d2868435..e2fdadb60ba0a2219d51cd1030f3d686c18f4e80 100644 (file)
--- a/main.c
+++ b/main.c
@@ -134,10 +134,13 @@ int main(int argc, char *argv[])
     terminate(quitgame);
 }
 
-static bool fallback_handler(char *buf)
+static bool fallback_handler(struct command_t command)
 /* fallback handler for commands not handled by FORTRANish parser */
 {
     long sv;
+    char buf[LINESIZE];
+    sprintf(buf, "%s %s", command.raw1, command.raw2);
+
     if (sscanf(buf, "seed %ld", &sv) == 1) {
         set_seed(sv);
         printf("Seed set to %ld\n", sv);
@@ -433,9 +436,7 @@ static bool dwarfmove(void)
         }
     }
 
-    /*  Now we know what's happening.  Let's tell the poor sucker about it.
-     *  Note that various of the "knife" messages must have specific relative
-     *  positions in the rspeak database. */
+    /*  Now we know what's happening.  Let's tell the poor sucker about it. */
     if (game.dtotal == 0)
         return true;
     rspeak(game.dtotal == 1 ? DWARF_SINGLE : DWARF_PACK, game.dtotal);
@@ -975,6 +976,10 @@ static bool do_command()
     long kmod, defn;
     static long igo = 0;
     static struct command_t command;
+    char inputbuf[LINESIZE];
+    char word1[TOKLEN + 1];
+    char word2[TOKLEN + 1];
+
     command.verb = 0;
 
     /*  Can't leave cave once it's closing (except by main office). */
@@ -1036,7 +1041,7 @@ static bool do_command()
 
         listobjects();
 
-L2012:
+Lclearobj:
         game.oldobj = command.obj;
 
 L2600:
@@ -1060,7 +1065,6 @@ L2600:
 
         /* This is where we get a new command from the user */
         char* input;
-        char inputbuf[LINESIZE];
 
         for (;;) {
             input = get_input();
@@ -1081,13 +1085,12 @@ L2600:
 
         tokenize(inputbuf, &command);
 
-        char word1[TOKLEN + 1];
-        char word2[TOKLEN + 1];
         packed_to_token(command.wd1, word1);
         packed_to_token(command.wd2, word2);
         command.id1 = get_vocab_id(word1);
         command.id2 = get_vocab_id(word2);
-
+        
+        //command = get_command_input();
 L2607:
         ++game.turns;
 
@@ -1119,7 +1122,7 @@ L2607:
             } else {
                 rspeak(WHERE_QUERY);
             }
-            goto L2012;
+            goto Lclearobj;
         }
         if (command.id1 == ENTER && command.id2 != WORD_NOT_FOUND && command.id2 != WORD_EMPTY) {
             /* command.wd1 = command.wd2; */
@@ -1151,7 +1154,7 @@ Lookup:
         defn = get_vocab_id(word1);
         if (defn == WORD_NOT_FOUND) {
             /* Gee, I don't understand. */
-            if (fallback_handler(inputbuf))
+            if (fallback_handler(command))
                 continue;
             sspeak(DONT_KNOW, command.raw1);
             goto L2600;
@@ -1172,7 +1175,7 @@ Lookup:
             break;
         case 3:
             speak(specials[kmod].message);
-            goto L2012;
+            goto Lclearobj;
         default:
             BUG(VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3); // LCOV_EXCL_LINE
         }
@@ -1187,7 +1190,7 @@ Laction:
         case GO_TOP:
             continue;  /* back to top of main interpreter loop */
         case GO_CLEAROBJ:
-            goto L2012;
+            goto Lclearobj;
         case GO_CHECKHINT:
             goto L2600;
         case GO_CHECKFOO:
@@ -1197,7 +1200,7 @@ Laction:
         case GO_WORD2:
             /* Get second word for analysis. */
             command.wd1 = command.wd2;
-            strcpy(command.raw1, command.raw2);
+            strncpy(command.raw1, command.raw2, LINESIZE - 1);
             wordclear(&command.wd2);
             command.raw2[0] = '\0';
             goto L2620;