Fix a bug in RNDVOC() that prevented the reservoir magic word for working.
authorJason S. Ninneman <jsn@mbar.us>
Mon, 29 May 2017 21:22:52 +0000 (14:22 -0700)
committerJason S. Ninneman <jsn@mbar.us>
Mon, 29 May 2017 21:22:52 +0000 (14:22 -0700)
To do this, I first had to refactor the code into proper C, just so I could understand it. Then I found another layer of encryption around the value itself. Finally, I discovered that the line to actually set the new magic word was placed such that it was using a global index instead of the local one.

misc.c

diff --git a/misc.c b/misc.c
index e95439c01e67aaab20c523a31fb5dc31f5cbc96b..93dce3b073b51f87dfcd0192b26a0b15fc2f75ad 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -778,35 +778,33 @@ long randrange(long range)
 
 #undef RNDVOC
 long fRNDVOC(long CHAR, long FORCE) {
-long DIV, J, RNDVOC;
-
 /*  Searches the vocabulary for a word whose second character is char, and
  *  changes that word such that each of the other four characters is a
  *  random letter.  If force is non-zero, it is used as the new word.
  *  Returns the new word. */
 
+       long RNDVOC;
 
        RNDVOC=FORCE;
 
        if (RNDVOC == 0) {
          for (int I = 1; I <= 5; I++) {
-           J = 11 + randrange(26);
+           long J = 11 + randrange(26);
            if (I == 2)
              J = CHAR;
            RNDVOC = RNDVOC * 64 + J;
          }
        }
 
-       J = 10000;
-       DIV = 64L * 64L * 64L;
-
+       long DIV = 64L * 64L * 64L;
        for (int I = 1; I <= TABSIZ; I++) {
-         J = J + 7;
-         if (MOD((ATAB[I]-J*J)/DIV, 64L) == CHAR)
-           break;
+         if (MOD(ATAB[I]/DIV, 64L) == CHAR)
+           {
+             ATAB[I] = RNDVOC;
+             break;
+           }
        }
 
-       ATAB[I] = RNDVOC + J * J;
        return(RNDVOC);
 }