- long rnd = force;
-
- if (rnd == 0) {
- for (int i = 1; i <= 5; i++) {
- long j = 11 + randrange(26);
- if (i == 2)
- j = second;
- rnd = rnd * 64 + j;
- }
- }
-
- long div = 64L * 64L * 64L;
- for (int i = 1; i <= TABSIZ; i++) {
- if (MOD(ATAB[i] / div, 64L) == second) {
- ATAB[i] = rnd;
- break;
- }
- }
-
- return rnd;
-}
-
-void BUG(long num)
-/* The following conditions are currently considered fatal bugs. Numbers < 20
- * are detected while reading the database; the others occur at "run time".
- * 0 Message line > 70 characters
- * 1 Null line in message
- * 2 Too many words of messages
- * 3 Too many travel options
- * 4 Too many vocabulary words
- * 5 Required vocabulary word not found
- * 6 Too many RTEXT messages
- * 7 Too many hints
- * 8 Location has cond bit being set twice
- * 9 Invalid section number in database
- * 10 Too many locations
- * 11 Too many class or turn messages
- * 20 Special travel (500>L>300) exceeds goto list
- * 21 Ran off end of vocabulary table
- * 22 Vocabulary type (N/1000) not between 0 and 3
- * 23 Intransitive action verb exceeds goto list
- * 24 Transitive action verb exceeds goto list
- * 25 Conditional travel entry with no alternative
- * 26 Location has no travel entries
- * 27 Hint number exceeds goto list
- * 28 Invalid month returned by date function
- * 29 Too many parameters given to SETPRM */
-{
-
- printf("Fatal error %ld. See source code for interpretation.\n", num);
- exit(0);
-}
-
-/* Machine dependent routines (MAPLIN, SAVEIO) */
-
-bool MAPLIN(FILE *fp)
-{
- bool eof;
-
- /* Read a line of input, from the specified input source.
- * This logic is complicated partly because it has to serve
- * several cases with different requirements and partly because
- * of a quirk in linenoise().
- *
- * The quirk shows up when you paste a test log from the clipboard
- * to the program's command prompt. While fgets (as expected)
- * consumes it a line at a time, linenoise() returns the first
- * line and discards the rest. Thus, there needs to be an
- * editline (-s) option to fall back to fgets while still
- * prompting. Note that linenoise does behave properly when
- * fed redirected stdin.
- *
- * The logging is a bit of a mess because there are two distinct cases
- * in which you want to echo commands. One is when shipping them to
- * a log under the -l option, in which case you want to suppress
- * prompt generation (so test logs are unadorned command sequences).
- * On the other hand, if you redirected stdin and are feeding the program
- * a logfile, you *do* want prompt generation - it makes checkfiles
- * easier to read when the commands are marked by a preceding prompt.
- */
- do {
- if (!editline) {
- if (prompt)
- fputs("> ", stdout);
- IGNORE(fgets(rawbuf, sizeof(rawbuf) - 1, fp));
- eof = (feof(fp));
- } else {
- char *cp = linenoise("> ");
- eof = (cp == NULL);
- if (!eof) {
- strncpy(rawbuf, cp, sizeof(rawbuf) - 1);
- linenoiseHistoryAdd(rawbuf);
- strncat(rawbuf, "\n", sizeof(rawbuf) - strlen(rawbuf) - 1);
- linenoiseFree(cp);
- }
- }
- } while
- (!eof && rawbuf[0] == '#');
- if (eof) {
- if (logfp && fp == stdin)
- fclose(logfp);
- return false;
- } else {
- FILE *efp = NULL;
- if (logfp && fp == stdin)
- efp = logfp;
- else if (!isatty(0))
- efp = stdout;
- if (efp != NULL) {
- if (prompt && efp == stdout)
- fputs("> ", efp);
- IGNORE(fputs(rawbuf, efp));
- }
- strcpy(INLINE + 1, rawbuf);
- /* translate the chars to integers in the range 0-126 and store
- * them in the common array "INLINE". Integer values are as follows:
- * 0 = space [ASCII CODE 40 octal, 32 decimal]
- * 1-2 = !" [ASCII 41-42 octal, 33-34 decimal]
- * 3-10 = '()*+,-. [ASCII 47-56 octal, 39-46 decimal]
- * 11-36 = upper-case letters
- * 37-62 = lower-case letters
- * 63 = percent (%) [ASCII 45 octal, 37 decimal]
- * 64-73 = digits, 0 through 9
- * Remaining characters can be translated any way that is convenient;
- * The above mappings are required so that certain special
- * characters are known to fit in 6 bits and/or can be easily spotted.
- * Array elements beyond the end of the line should be filled with 0,
- * and LNLENG should be set to the index of the last character.
- *
- * If the data file uses a character other than space (e.g., tab) to
- * separate numbers, that character should also translate to 0.
- *
- * This procedure may use the map1,map2 arrays to maintain static data for
- * the mapping. MAP2(1) is set to 0 when the program starts
- * and is not changed thereafter unless the routines on this page choose
- * to do so. */
- LNLENG = 0;
- for (long i = 1; i <= (long)sizeof(INLINE) && INLINE[i] != 0; i++) {
- long val = INLINE[i];
- INLINE[i] = ascii_to_advent[val];
- if (INLINE[i] != 0)
- LNLENG = i;
- }
- LNPOSN = 1;
- return true;