More magic-number elimination, and some information hiding.
authorEric S. Raymond <esr@thyrsus.com>
Wed, 7 Jun 2017 04:05:03 +0000 (00:05 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Wed, 7 Jun 2017 04:05:03 +0000 (00:05 -0400)
advent.h
compile.c
misc.c

index 3e5dc9a39e918f9dd653dd5aab4104157ec9b774..47548b6baa112e046b3c9735da3397ec17a9fb59 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -10,7 +10,7 @@ typedef struct lcg_state
   unsigned long a, c, m, x;
 } lcg_state;
 
-typedef long token_t;  /* word token - someday this will be a character array */
+typedef long token_t;  /* word token - someday this will be char[TOKLEN+1] */
 typedef long vocab_t;  /* index into a vocabulary array */
 
 struct game_t {
index f8b1167b667a279867c587054b57abd989a89262..b6b038e69be4949f484f620bb230370294e44147 100644 (file)
--- a/compile.c
+++ b/compile.c
@@ -8,6 +8,8 @@
 #define VRBSIZ 35
 #define HNTSIZ 20
 #define TRVSIZ 885
+#define TOKLEN 5
+#define HINTLEN 5
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -55,7 +57,7 @@ long ATAB[TABSIZ + 1];
 long PLAC[NOBJECTS+1];
 long FIXD[NOBJECTS+1];
 long ACTSPK[VRBSIZ + 1];
-long HINTS[HNTSIZ + 1][5];
+long HINTS[HNTSIZ + 1][HINTLEN];
 
 bool is_set(long, long);
 long GETTXT(long, long, long);
@@ -73,7 +75,7 @@ void read_hints(FILE*);
 void read_sound_text(FILE*);
 void write_0d(FILE*, FILE*, long, char*);
 void write_1d(FILE*, FILE*, long[], long, char*);
-void write_hints(FILE*, FILE*, long[][5], long, long, char*);
+void write_hints(FILE*, FILE*, long[][HINTLEN], long, long, char*);
 void write_files(FILE*, FILE*);
 
 bool is_set(long var, long position)
@@ -105,7 +107,7 @@ long GETTXT(long SKIP,long ONEWRD, long UPPER) {
   }
 
   TEXT=0;
-  for (int I=1; I<=5; I++) {
+  for (int I=1; I<=TOKLEN; I++) {
     TEXT=TEXT*64;
     if(LNPOSN > LNLENG || (ONEWRD && INLINE[LNPOSN] == 0))
       continue;
@@ -527,7 +529,7 @@ void write_1d(FILE* c_file, FILE* header_file, long array[], long dim, char* var
   fprintf(header_file, "extern long %s[%ld];\n", varname, dim);
 }
 
-void write_hints(FILE* c_file, FILE* header_file, long matrix[][5], long dim1, long dim2, char* varname)
+void write_hints(FILE* c_file, FILE* header_file, long matrix[][HINTLEN], long dim1, long dim2, char* varname)
 {
   fprintf(c_file, "long %s[][%ld] = {\n", varname, dim2);
   for (int i = 0; i < dim1; ++i)
@@ -556,6 +558,8 @@ void write_files(FILE* c_file, FILE* header_file)
   fprintf(header_file, "#define VRBSIZ 35\n");
   fprintf(header_file, "#define HNTSIZ 20\n");
   fprintf(header_file, "#define TRVSIZ 885\n");
+  fprintf(header_file, "#define TOKLEN %d\n", TOKLEN);
+  fprintf(header_file, "#define HINTLEN %d\n", HINTLEN);
   fprintf(header_file, "\n");
 
   // include the header in the C file
diff --git a/misc.c b/misc.c
index 5c71c744d7067f4806e5664e2878324c8ce82ff0..6b617904046efb3bfb402615e431296c1eb96736 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -245,7 +245,7 @@ long GETTXT(bool SKIP,bool ONEWRD, bool UPPER) {
   }
 
   TEXT=0;
-  for (int I=1; I<=5; I++) {
+  for (int I=1; I<=TOKLEN; I++) {
     TEXT=TEXT*64;
     if(LNPOSN > LNLENG || (ONEWRD && INLINE[LNPOSN] == 0))
       continue;
@@ -275,12 +275,13 @@ long GETTXT(bool SKIP,bool ONEWRD, bool UPPER) {
 token_t MAKEWD(long LETTRS) {
 long I, L, WORD;
 
-/*  Combine five uppercase letters (represented by pairs of decimal digits
- *  in lettrs) to form a 30-bit value matching the one that GETTXT would
- *  return given those characters plus trailing blanks.  Caution:
- *  lettrs will overflow 31 bits if 5-letter word starts with V-Z.  As a
- *  kludgey workaround, you can increment a letter by 5 by adding 50 to
- *  the next pair of digits. */
+/*  Combine TOKLEN (currently 5) uppercase letters (represented by
+ *  pairs of decimal digits in lettrs) to form a 30-bit value matching
+ *  the one that GETTXT would return given those characters plus
+ *  trailing blanks.  Caution: lettrs will overflow 31 bits if
+ *  5-letter word starts with V-Z.  As a kludgey workaround, you can
+ *  increment a letter by 5 by adding 50 to the next pair of
+ *  digits. */
 
        WORD=0;
        I=1;
@@ -299,15 +300,17 @@ long I, L, WORD;
 void fPUTTXT(token_t WORD, long *sTATE, long CASE) {
 long ALPH1, ALPH2, BYTE, DIV, I, W;
 
-/*  Unpack the 30-bit value in word to obtain up to 5 integer-encoded chars,
- *  and store them in inline starting at LNPOSN.  If LNLENG>=LNPOSN, shift
- *  existing characters to the right to make room.  STATE will be zero when
- *  puttxt is called with the first of a sequence of words, but is thereafter
- *  unchanged by the caller, so PUTTXT can use it to maintain state across
- *  calls.  LNPOSN and LNLENG are incremented by the number of chars stored.
- *  If CASE=1, all letters are made uppercase; if -1, lowercase; if 0, as is.
- *  any other value for case is the same as 0 but also causes trailing blanks
- *  to be included (in anticipation of subsequent additional text). */
+/*  Unpack the 30-bit value in word to obtain up to TOKLEN (currently
+ *  5) integer-encoded chars, and store them in inline starting at
+ *  LNPOSN.  If LNLENG>=LNPOSN, shift existing characters to the right
+ *  to make room.  STATE will be zero when puttxt is called with the
+ *  first of a sequence of words, but is thereafter unchanged by the
+ *  caller, so PUTTXT can use it to maintain state across calls.
+ *  LNPOSN and LNLENG are incremented by the number of chars stored.
+ *  If CASE=1, all letters are made uppercase; if -1, lowercase; if 0,
+ *  as is.  any other value for case is the same as 0 but also causes
+ *  trailing blanks to be included (in anticipation of subsequent
+ *  additional text). */
 
 
        ALPH1=13*CASE+24;
@@ -316,7 +319,7 @@ long ALPH1, ALPH2, BYTE, DIV, I, W;
 /*  ALPH1&2 DEFINE RANGE OF WRONG-CASE CHARS, 11-36 OR 37-62 OR EMPTY. */
        DIV=64L*64L*64L*64L;
        W=WORD;
-       /* 18 */ for (I=1; I<=5; I++) {
+       /* 18 */ for (I=1; I<=TOKLEN; I++) {
        if(W <= 0 && STATE == 0 && labs(CASE) <= 1)return;
        BYTE=W/DIV;
        if(STATE != 0 || BYTE != 63) goto L12;