Mostly confine assumptions about what token_t is to misc.c
authorEric S. Raymond <esr@thyrsus.com>
Mon, 19 Jun 2017 21:21:45 +0000 (17:21 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Mon, 19 Jun 2017 21:21:45 +0000 (17:21 -0400)
The token_t things like WD* are presently longs and will someday be
char[6].  By introducing some trivial functions - wordeq(),
wordempty(), and wordclear() - we mostly hide the difference.

All runtime knowledge about packing now lives only in misc.c and the
list of magic WORD_* defines in advent.h.  Outside this, literals are
now accessed through #define names that could expand to either longs
or strings.

Still to be done: WD* values are sometiimes compated to zero in
ways implying they can be negative. Must figure out wat thus means.

actions.c
advent.h
init.c
main.c
misc.c

index 6cdc61dbb9cd857207f4b355ce3bfb693f8669f4..2a223bc9a9e40b42626530ee93d8820937d1d0db 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -1054,7 +1054,8 @@ int action(FILE *input, enum speechpart part, token_t verb, token_t obj)
 
     switch (part) {
     case intransitive:
-        if (WD2 > 0 && verb != SAY) return (2800);
+        if (WD2 > 0 && verb != SAY)
+           return GO_WORD2;
         if (verb == SAY)obj = WD2;
         if (obj == 0 || obj == INTRANSITIVE) {
             /*  Analyse an intransitive verb (ie, no object given yet). */
index f199489e7034939236b463fcddf7157c2d34c83a..ff62476379a7f16dda8212109ef28a52cbc02cb5 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -91,6 +91,9 @@ extern void* xmalloc(size_t size);
 extern char* xstrdup(const char*);
 extern void packed_to_token(long, char token[]);
 extern void speak(const char*);
+extern bool wordeq(token_t, token_t);
+extern bool wordempty(token_t);
+extern void wordclear(token_t *);
 extern void PSPEAK(vocab_t, int);
 extern void RSPEAK(vocab_t);
 extern void SETPRM(long, long, long);
diff --git a/init.c b/init.c
index 36f00b198e4f3986591c68d7a20019d35a79155c..0e52a32c5ce3d66b35f0cf3743d0675c07e32d3a 100644 (file)
--- a/init.c
+++ b/init.c
  *     apply to players whose scores are higher than the previous N but not
  *     higher than this N.  Note that these scores probably change with every
  *     modification (and particularly expansion) of the program.
- *  SECTION 11: Hints.  Each line contains a hint number (add 10 to get cond
+ *  Section 11: Hints.  Each line contains a hint number (add 10 to get cond
  *     bit; see section 9), the number of turns he must be at the right loc(s)
  *     before triggering the hint, the points deducted for taking the hint,
  *     the message number (section 6) of the question, and the message number
diff --git a/main.c b/main.c
index f79c68c0f3e4eaa412ac3947b2176b38d330daf5..1db050f91583e7f42bfcbb2ff9ce440c1aefc0a7 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1057,8 +1057,9 @@ L2607:
         if (V1 == ENTER && WD2 > 0) {
             WD1 = WD2;
             WD1X = WD2X;
-            WD2 = 0;
+            wordclear(&WD2);
         } else {
+           /* FIXME: Magic numbers */
             if (!((V1 != 1000 + WATER && V1 != 1000 + OIL) ||
                   (V2 != 1000 + PLANT && V2 != 1000 + DOOR))) {
                 if (AT(V2 - 1000))
@@ -1068,12 +1069,12 @@ L2607:
                 WD1 = MAKEWD(WORD_CATCH);
         }
 L2620:
-        if (WD1 == MAKEWD(WORD_WEST)) {
+        if (wordeq(WD1, MAKEWD(WORD_WEST))) {
             ++game.iwest;
             if (game.iwest == 10)
                 RSPEAK(W_IS_WEST);
         }
-        if (WD1 == MAKEWD(WORD_GO) && WD2 != 0) {
+        if (wordeq(WD1, MAKEWD(WORD_GO)) && !wordempty(WD2)) {
             if (++igo == 10)
                 RSPEAK(GO_UNNEEDED);
         }
@@ -1130,7 +1131,7 @@ Laction:
             /* Get second word for analysis. */
             WD1 = WD2;
             WD1X = WD2X;
-            WD2 = 0;
+            wordclear(&WD2);
             goto L2620;
         case GO_UNKNOWN:
             /*  Random intransitive verbs come here.  Clear obj just in case
diff --git a/misc.c b/misc.c
index ee2ac25cd95a90a07b559548240959359f7391bd..ba834fdffd44b84cef98268a2e2cbadc8dea63b2 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -50,6 +50,23 @@ void packed_to_token(long packed, char token[6])
     }
 }
 
+/* Hide the fact that wods are corrently packed longs */
+
+bool wordeq(token_t a, token_t b)
+{
+    return a == b;
+}
+
+bool wordempty(token_t a)
+{
+    return a == 0;
+}
+
+void wordclear(token_t *v)
+{
+    *v = 0;
+}
+
 /*  I/O routines (SPEAK, PSPEAK, RSPEAK, SETPRM, GETIN, YES) */
 
 void speak(const char* msg)