From a678b68b39f21f8b2853e45c6138d815a82a3423 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 19 Jun 2017 17:21:45 -0400 Subject: [PATCH] Mostly confine assumptions about what token_t is to misc.c 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 | 3 ++- advent.h | 3 +++ init.c | 2 +- main.c | 9 +++++---- misc.c | 17 +++++++++++++++++ 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/actions.c b/actions.c index 6cdc61d..2a223bc 100644 --- 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). */ diff --git a/advent.h b/advent.h index f199489..ff62476 100644 --- 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 36f00b1..0e52a32 100644 --- a/init.c +++ b/init.c @@ -131,7 +131,7 @@ * 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 f79c68c..1db050f 100644 --- 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 ee2ac25..ba834fd 100644 --- 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) -- 2.31.1