Remove MAPLIN(). Fold common.[ch] into other files and remove them.
authorJason S. Ninneman <jsn@mbar.us>
Thu, 29 Jun 2017 15:41:32 +0000 (08:41 -0700)
committerJason S. Ninneman <jsn@mbar.us>
Thu, 29 Jun 2017 15:54:35 +0000 (08:54 -0700)
Makefile
advent.h
common.c [deleted file]
common.h [deleted file]
dungeon.c [deleted file]
misc.c
newdungeon.py

index da24dd0dcd50aaea3f6b8d08840444b3bf168255..d16b12b8f0cfb36814af8d3d332b8d6a23da2835 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -36,9 +36,9 @@ ifeq ($(UNAME_S),Linux)
        LIBS=-lrt
 endif
 
-OBJS=main.o init.o actions.o score.o misc.o saveresume.o common.o
-CHEAT_OBJS=cheat.o init.o actions.o score.o misc.o saveresume.o common.o
-SOURCES=$(OBJS:.o=.c) advent.h common.h adventure.text adventure.yaml Makefile control linenoise/linenoise.[ch] newdungeon.py
+OBJS=main.o init.o actions.o score.o misc.o saveresume.o
+CHEAT_OBJS=cheat.o init.o actions.o score.o misc.o saveresume.o
+SOURCES=$(OBJS:.o=.c) advent.h adventure.text adventure.yaml Makefile control linenoise/linenoise.[ch] newdungeon.py
 
 .c.o:
        $(CC) $(CCFLAGS) $(DBX) -c $<
@@ -46,21 +46,19 @@ SOURCES=$(OBJS:.o=.c) advent.h common.h adventure.text adventure.yaml Makefile c
 advent:        $(OBJS) linenoise.o newdb.o
        $(CC) $(CCFLAGS) $(DBX) -o advent $(OBJS) newdb.o linenoise.o $(LDFLAGS) $(LIBS)
 
-main.o:                advent.h common.h newdb.h
+main.o:                advent.h newdb.h
 
-init.o:                advent.h common.h newdb.h
+init.o:                advent.h newdb.h
 
-actions.o:     advent.h common.h newdb.h
+actions.o:     advent.h newdb.h
 
-score.o:       advent.h common.h newdb.h
+score.o:       advent.h newdb.h
 
-misc.o:                advent.h common.h newdb.h
+misc.o:                advent.h newdb.h
 
-cheat.o:       advent.h common.h newdb.h
+cheat.o:       advent.h newdb.h
 
-saveresume.o:  advent.h common.h newdb.h
-
-common.o:      common.h
+saveresume.o:  advent.h newdb.h
 
 newdb.o:       newdb.c newdb.h
        $(CC) $(CCFLAGS) $(DBX) -c newdb.c
index d161d04de8ef7e44bf4226e131d95aa1f6af3d09..7846e8fe2007c3ea2b32f368ca6e4b92be2b50ba 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -3,7 +3,6 @@
 #include <stdbool.h>
 #include <stdarg.h>
 
-#include "common.h"
 #include "newdb.h"
 
 #define LINESIZE       100
 typedef long token_t;  /* word token - someday this will be char[TOKLEN+1] */
 typedef long vocab_t;  /* index into a vocabulary array */
 
+extern const char advent_to_ascii[128];
+extern const char ascii_to_advent[128];
+extern const char new_advent_to_ascii[64];
+extern const char new_ascii_to_advent[128];
+
+enum bugtype {
+   TOO_MANY_VOCABULARY_WORDS,                             // 4
+   REQUIRED_VOCABULARY_WORD_NOT_FOUND,                    // 5
+   INVALID_SECTION_NUMBER_IN_DATABASE,                    // 9
+   SPECIAL_TRAVEL_500_GT_L_GT_300_EXCEEDS_GOTO_LIST = 20, // 20
+   RAN_OFF_END_OF_VOCABULARY_TABLE,                       // 21
+   VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3,       // 22
+   INTRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST,            // 23
+   TRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST,              // 24
+   CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION,           // 25
+   LOCATION_HAS_NO_TRAVEL_ENTRIES,                        // 26
+   HINT_NUMBER_EXCEEDS_GOTO_LIST,                         // 27
+   TOO_MANY_PARAMETERS_GIVEN_TO_SETPRM,                   // 28
+   SPEECHPART_NOT_TRANSITIVE_OR_INTRANSITIVE_OR_UNKNOWN=99, // 99
+   ACTION_RETURNED_PHASE_CODE_BEYOND_END_OF_SWITCH,       // 100
+};
+
+/* Alas, declaring this static confuses the coverage analyzer */
+void bug(enum bugtype, const char *) __attribute__((__noreturn__));
+#define BUG(x) bug(x, #x)
+
 struct game_t {
     unsigned long lcg_a, lcg_c, lcg_m, lcg_x;
     long abbnum;       /* How often to print non-abbreviated descriptions */
diff --git a/common.c b/common.c
deleted file mode 100644 (file)
index 51f7197..0000000
--- a/common.c
+++ /dev/null
@@ -1,68 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include "common.h"
-
-const char advent_to_ascii[] = {
-    ' ', '!', '\"', '\'', '(', ')', '*', '+', ',', '-',
-    '.', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
-    'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
-    'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c',
-    'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
-    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
-    'x', 'y', 'z', '%', '0', '1', '2', '3', '4', '5',
-    '6', '7', '8', '9', '\x00', '\x01', '\x02', '\x03', '\x04', '\x05',
-    '\x06', '\x07', '\x08', '\x00', '\x00', '\x0b', '\x0c', '\r', '\x0e', '\x0f',
-    '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19',
-    '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f', '#', '$', '&', '/',
-    ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']',
-    '^', '_', '`', '{', '|', '}', '~', '\x00',
-};
-
-/* Rendered from the now-gone MPINIT() function */
-const char ascii_to_advent[] = {
-    74, 75, 76, 77, 78, 79, 80, 81, 82, 0,
-    0, 85, 86, 87, 88, 89, 90, 91, 92, 93,
-    94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
-    104, 105, 0, 1, 2, 106, 107, 63, 108, 3,
-    4, 5, 6, 7, 8, 9, 10, 109, 64, 65,
-    66, 67, 68, 69, 70, 71, 72, 73, 110, 111,
-    112, 113, 114, 115, 116, 11, 12, 13, 14, 15,
-    16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
-    26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
-    36, 117, 118, 119, 120, 121, 122, 37, 38, 39,
-    40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
-    50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
-    60, 61, 62, 123, 124, 125, 126, 83,
-};
-
-const char new_advent_to_ascii[] = {
-  ' ', '!', '"', '#', '$', '%', '&', '\'',
-  '(', ')', '*', '+', ',', '-', '.', '/',
-  '0', '1', '2', '3', '4', '5', '6', '7',
-  '8', '9', ':', ';', '<', '=', '>', '?',
-  '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
-  'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
-  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
-  'X', 'Y', 'Z', '\0', '\0', '\0', '\0', '\0',
-};
-
-const char new_ascii_to_advent[] = {
-  63, 63, 63, 63, 63, 63, 63, 63,
-  63, 63, 63, 63, 63, 63, 63, 63,
-  63, 63, 63, 63, 63, 63, 63, 63,
-  63, 63, 63, 63, 63, 63, 63, 63,
-
-  0, 1, 2, 3, 4, 5, 6, 7,
-  8, 9, 10, 11, 12, 13, 14, 15,
-  16, 17, 18, 19, 20, 21, 22, 23,
-  24, 25, 26, 27, 28, 29, 30, 31,
-  32, 33, 34, 35, 36, 37, 38, 39,
-  40, 41, 42, 43, 44, 45, 46, 47,
-  48, 49, 50, 51, 52, 53, 54, 55,
-  56, 57, 58, 59, 60, 61, 62, 63,
-
-  63, 63, 63, 63, 63, 63, 63, 63,
-  63, 63, 63, 63, 63, 63, 63, 63,
-  63, 63, 63, 63, 63, 63, 63, 63,
-  63, 63, 63, 63, 63, 63, 63, 63,
-};
diff --git a/common.h b/common.h
deleted file mode 100644 (file)
index 2aab83d..0000000
--- a/common.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef COMMON_H
-#define COMMON_H
-/* maximum size limits shared by dungeon compiler and runtime */
-
-extern const char advent_to_ascii[128];
-extern const char ascii_to_advent[128];
-extern const char new_advent_to_ascii[64];
-extern const char new_ascii_to_advent[128];
-
-enum bugtype {
-   TOO_MANY_VOCABULARY_WORDS,                             // 4
-   REQUIRED_VOCABULARY_WORD_NOT_FOUND,                    // 5
-   INVALID_SECTION_NUMBER_IN_DATABASE,                    // 9
-   SPECIAL_TRAVEL_500_GT_L_GT_300_EXCEEDS_GOTO_LIST = 20, // 20
-   RAN_OFF_END_OF_VOCABULARY_TABLE,                       // 21
-   VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3,       // 22
-   INTRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST,            // 23
-   TRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST,              // 24
-   CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION,           // 25
-   LOCATION_HAS_NO_TRAVEL_ENTRIES,                        // 26
-   HINT_NUMBER_EXCEEDS_GOTO_LIST,                         // 27
-   TOO_MANY_PARAMETERS_GIVEN_TO_SETPRM,                   // 28
-   SPEECHPART_NOT_TRANSITIVE_OR_INTRANSITIVE_OR_UNKNOWN=99, // 99
-   ACTION_RETURNED_PHASE_CODE_BEYOND_END_OF_SWITCH,       // 100
-};
-
-/* Alas, declaring this static confuses the coverage analyzer */
-void bug(enum bugtype, const char *) __attribute__((__noreturn__));
-
-#define BUG(x) bug(x, #x)
-
-#endif
diff --git a/dungeon.c b/dungeon.c
deleted file mode 100644 (file)
index 5f49068..0000000
--- a/dungeon.c
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * The dungeon compiler. Turns adventure.text into a set of C initializers
- * defining invariant state.
- */
-
-/*  Current limits:
- *     12600 words of message text (LINES, LINSIZ).
- *     330 vocabulary words (KTAB, ATAB, TABSIZ).
- *  There are also limits which cannot be exceeded due to the structure of
- *  the database.  (E.G., The vocabulary uses n/1000 to determine word type,
- *  so there can't be more than 1000 words.)  These upper limits are:
- *     1000 non-synonymous vocabulary words
- *     300 locations
- *     100 objects
- */
-
-/*  Description of the database format
- *
- *
- *  The data file contains several sections.  Each begins with a line containing
- *  a number identifying the section, and ends with a line containing "-1".
- *
- *  Section 4: Vocabulary.  Each line contains a number (n), a tab, and a
- *     five-letter word.  Call M=N/1000.  If M=0, then the word is a motion
- *     verb for use in travelling (see section 3).  Else, if M=1, the word is
- *     an object.  Else, if M=2, the word is an action verb (such as "carry"
- *     or "attack").  Else, if M=3, the word is a special case verb (such as
- *     "dig") and N % 1000 is an index into section 6.  Objects from 50 to
- *     (currently, anyway) 79 are considered treasures (for pirate, closeout).
- *  Section 0: End of database.
- *
- * Other sections are obsolete and ignored */
-
-#define LINESIZE 100
-#define LINSIZ 12600
-#define TABSIZ 330
-#define VRBSIZ 35
-#define TOKLEN 5
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <unistd.h>
-#include <string.h>
-#include "newdb.h"
-#include "common.h"
-
-// Global variables for use in functions below that can gradually disappear as code is cleaned up
-static long LNLENG;
-static long LNPOSN;
-static char INLINE[LINESIZE + 1];
-static long OLDLOC;
-static long LINUSE;
-
-// Storage for what comes out of the database
-long TABNDX;
-long LINES[LINSIZ + 1];
-long KTAB[TABSIZ + 1];
-long ATAB[TABSIZ + 1];
-
-static long GETTXT(long SKIP, long ONEWRD, long UPPER)
-{
-    /*  Take characters from an input line and pack them into 30-bit words.
-     *  Skip says to skip leading blanks.  ONEWRD says stop if we come to a
-     *  blank.  UPPER says to map all letters to uppercase.  If we reach the
-     *  end of the line, the word is filled up with blanks (which encode as 0's).
-     *  If we're already at end of line when GETTXT is called, we return -1. */
-
-    long TEXT;
-    static long SPLITTING = -1;
-
-    if (LNPOSN != SPLITTING)
-        SPLITTING = -1;
-    TEXT = -1;
-    while (true) {
-        if (LNPOSN > LNLENG)
-            return (TEXT);
-        if ((!SKIP) || INLINE[LNPOSN] != 0)
-            break;
-        LNPOSN = LNPOSN + 1;
-    }
-
-    TEXT = 0;
-    for (int I = 1; I <= TOKLEN; I++) {
-        TEXT = TEXT * 64;
-        if (LNPOSN > LNLENG || (ONEWRD && INLINE[LNPOSN] == 0))
-            continue;
-        char current = INLINE[LNPOSN];
-        if (current < 63) {
-            SPLITTING = -1;
-            if (UPPER && current >= 37)
-                current = current - 26;
-            TEXT = TEXT + current;
-            LNPOSN = LNPOSN + 1;
-            continue;
-        }
-        if (SPLITTING != LNPOSN) {
-            TEXT = TEXT + 63;
-            SPLITTING = LNPOSN;
-            continue;
-        }
-
-        TEXT = TEXT + current - 63;
-        SPLITTING = -1;
-        LNPOSN = LNPOSN + 1;
-    }
-
-    return (TEXT);
-}
-
-static void MAPLIN(FILE *OPENED)
-{
-    /*  Read a line of input, from the specified input source,
-     *  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 "TYPE" routine below is used to map them back to characters when
-     *  necessary.  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. */
-
-    do {
-        if (NULL == fgets(INLINE + 1, sizeof(INLINE) - 1, OPENED)) {
-            printf("Failed fgets()\n");
-        }
-    } while (!feof(OPENED) && INLINE[1] == '#');
-
-    LNLENG = 0;
-    for (size_t i = 1; i < sizeof(INLINE) && INLINE[i] != 0; ++i) {
-        char val = INLINE[i];
-        INLINE[i] = ascii_to_advent[(unsigned)val];
-        if (INLINE[i] != 0)
-            LNLENG = i;
-    }
-    LNPOSN = 1;
-}
-
-static long GETNUM(FILE *source)
-{
-    /*  Obtain the next integer from an input line.  If K>0, we first read a
-     *  new input line from a file; if K<0, we read a line from the keyboard;
-     *  if K=0 we use a line that has already been read (and perhaps partially
-     *  scanned).  If we're at the end of the line or encounter an illegal
-     *  character (not a digit, hyphen, or blank), we return 0. */
-
-    long GETNUM, sign;
-
-    if (source != NULL) MAPLIN(source);
-    GETNUM = 0;
-
-    while (INLINE[LNPOSN] == 0) {
-        if (LNPOSN > LNLENG) return (GETNUM);
-        ++LNPOSN;
-    }
-
-    if (INLINE[LNPOSN] != 9) {
-        sign = 1;
-    } else {
-        sign = -1;
-        LNPOSN = LNPOSN + 1;
-    }
-    while (!(LNPOSN > LNLENG || INLINE[LNPOSN] == 0)) {
-        long DIGIT = INLINE[LNPOSN] - 64;
-        if (DIGIT < 0 || DIGIT > 9) {
-            GETNUM = 0;
-            break;
-        }
-        GETNUM = GETNUM * 10 + DIGIT;
-        LNPOSN = LNPOSN + 1;
-    }
-
-    GETNUM = GETNUM * sign;
-    LNPOSN = LNPOSN + 1;
-    return (GETNUM);
-}
-
-/*  Sections 1, 2, 5, 6, 10, 14.  Skip these, they're all in YAML now. */
-static void read_messages(FILE* database)
-{
-    while (true) {
-       do {
-           if (NULL == fgets(INLINE + 1, sizeof(INLINE) - 1, database)) {
-               printf("Failed fgets()\n");
-           }
-       } while (!feof(database) && INLINE[1] == '#');
-       if (strncmp(INLINE + 1, "-1\n", 3) == 0)
-           break;
-    }
-}
-
-/*  The stuff for section 3 is encoded here.  Each "from-location" gets a
- *  contiguous section of the "travel" array.  Each entry in travel is
- *  newloc*1000 + KEYWORD (from section 4, motion verbs), and is negated if
- *  this is the last entry for this location.  KEY(N) is the index in travel
- *  of the first option at location N. */
-static void read_section3_stuff(FILE* database)
-{
-    long loc;
-    while ((loc = GETNUM(database)) != -1) {
-       /* Now done from YAML */
-    }
-}
-
-/*  Here we read in the vocabulary.  KTAB(N) is the word number, ATAB(N) is
- *  the corresponding word.  The -1 at the end of section 4 is left in KTAB
- *  as an end-marker. */
-static void read_vocabulary(FILE* database)
-{
-    for (TABNDX = 1; TABNDX <= TABSIZ; TABNDX++) {
-        KTAB[TABNDX] = GETNUM(database);
-        if (KTAB[TABNDX] == -1) return;
-        ATAB[TABNDX] = GETTXT(true, true, true);
-    } /* end loop */
-    BUG(TOO_MANY_VOCABULARY_WORDS);
-}
-
-/*  Read in the initial locations for each object.  Also the immovability info.
- *  plac contains initial locations of objects.  FIXD is -1 for immovable
- *  objects (including the snake), or = second loc for two-placed objects. */
-static void read_initial_locations(FILE* database)
-{
-    long OBJ;
-    while ((OBJ = GETNUM(database)) != -1) {
-       /* all done from YAML now */
-    }
-}
-
-/*  Read default message numbers for action verbs. */
-static void read_action_verb_message_nr(FILE* database)
-{
-    long verb;
-    while ((verb = GETNUM(database)) != -1) {
-       /* now declared in YAML */
-    }
-}
-
-/*  Read info about available liquids and other conditions. */
-static void read_conditions(FILE* database)
-{
-    long K;
-    while ((K = GETNUM(database)) != -1) {
-        long loc;
-        while ((loc = GETNUM(NULL)) != 0) {
-           continue;   /* COND is no longer used */
-        }
-    }
-}
-
-
-/*  Read data for hints. */
-static void read_hints(FILE* database)
-{
-    long K;
-    while ((K = GETNUM(database)) != -1) {
-        for (int I = 1; I <= 4; I++) {
-           /* consume - actual array-building now done in YAML. */
-            GETNUM(NULL);
-        } /* end loop */
-    }
-}
-
-/*  Read the sound/text info */
-static void read_sound_text(FILE* database)
-{
-    long K;
-    while ((K = GETNUM(database)) != -1) {
-       /* this stuff is in YAML now */
-    }
-}
-
-
-static int read_database(FILE* database)
-{
-    /*  Clear out the various text-pointer arrays.  All text is stored
-     *  in array lines; each line is preceded by a word pointing to
-     *  the next pointer (i.e.  the word following the end of the
-     *  line).  The pointer is negative if this is first line of a
-     *  message.  The text-pointer arrays contain indices of
-     *  pointer-words in lines. PTEXT(N) points to
-     *  message for game.prop(N)=0.  Successive prop messages are
-     *  found by chasing pointers. */
-
-    LINUSE = 1;
-
-    /*  Start new data section.  Sect is the section number. */
-
-    while (true) {
-        long sect = GETNUM(database);
-        OLDLOC = -1;
-        switch (sect) {
-        case 0:
-            return (0);
-        case 1:
-            read_messages(database);
-            break;
-        case 2:
-            read_messages(database);
-            break;
-        case 3:
-            read_section3_stuff(database);
-            break;
-        case 4:
-            read_vocabulary(database);
-            break;
-        case 5:
-            read_messages(database);
-            break;
-        case 6:
-            read_messages(database);
-            break;
-        case 7:
-            read_initial_locations(database);
-            break;
-        case 8:
-            read_action_verb_message_nr(database);
-            break;
-        case 9:
-            read_conditions(database);
-            break;
-        case 10:
-            read_messages(database);
-            break;
-        case 11:
-            read_hints(database);
-            break;
-        case 12:
-            break;
-        case 13:
-            read_sound_text(database);
-            break;
-        case 14:
-            read_messages(database);
-            break;
-        default:
-            BUG(INVALID_SECTION_NUMBER_IN_DATABASE);
-        }
-    }
-}
-
-/*  Finish constructing internal data format */
-
-/*  Having read in the database, certain things are now constructed.
- *  game.propS are set to zero.    The PLAC and FIXD arrays are used
- *  to set up game.atloc(N) as the first object at location N, and
- *  game.link(OBJ) as the next object at the same location as OBJ.
- *  (OBJ>NOBJECTS indicates that game.fixed(OBJ-NOBJECTS)=LOC; game.link(OBJ) is
- *  still the correct link to use.)  game.abbrev is zeroed; it controls
- *  whether the abbreviated description is printed.  Counts modulo 5
- *  unless "LOOK" is used. */
-
-static void write_1d(FILE* header_file, long array[], long dim, const char* varname)
-{
-    fprintf(header_file, "LOCATION long %s[] INITIALIZE(= {\n", varname);
-    for (int i = 0; i < dim; ++i) {
-        if (i % 10 == 0) {
-            if (i > 0)
-                fprintf(header_file, "\n");
-            fprintf(header_file, "  ");
-        }
-        fprintf(header_file, "%ld, ", array[i]);
-    }
-    fprintf(header_file, "\n});\n");
-}
-
-static void write_file(FILE* header_file)
-{
-    fprintf(header_file, "#ifndef DATABASE_H\n");
-    fprintf(header_file, "#define DATABASE_H\n");
-    fprintf(header_file, "\n");
-
-    fprintf(header_file, "#include \"common.h\"\n");
-    fprintf(header_file, "#define TABSIZ 330\n");
-    fprintf(header_file, "#define TOKLEN %d\n", TOKLEN);
-    fprintf(header_file, "\n");
-
-    fprintf(header_file, "\n");
-    fprintf(header_file, "#ifdef DEFINE_GLOBALS_FROM_INCLUDES\n");
-    fprintf(header_file, "#define LOCATION\n");
-    fprintf(header_file, "#define INITIALIZE(...) __VA_ARGS__\n");
-    fprintf(header_file, "#else\n");
-    fprintf(header_file, "#define LOCATION extern\n");
-    fprintf(header_file, "#define INITIALIZE(...)\n");
-    fprintf(header_file, "#endif\n");
-    fprintf(header_file, "\n");
-
-    // content variables
-    write_1d(header_file, KTAB, TABSIZ + 1, "KTAB");
-    write_1d(header_file, ATAB, TABSIZ + 1, "ATAB");
-
-    fprintf(header_file, "#undef LOCATION\n");
-    fprintf(header_file, "#undef INITIALIZE\n");
-    fprintf(header_file, "#endif\n");
-}
-
-void bug(enum bugtype num, const char *error_string)
-{
-    fprintf(stderr, "Fatal error %d, %s.\n", num, error_string);
-    exit(EXIT_FAILURE);
-}
-
-int main(void)
-{
-    FILE* database = fopen("adventure.text", "r");
-    read_database(database);
-    fclose(database);
-
-    FILE* header_file = fopen("database.h", "w");
-    write_file(header_file);
-    fclose(header_file);
-
-    return (EXIT_SUCCESS);
-}
diff --git a/misc.c b/misc.c
index dbf4abb8f0dee6f63be8cec42cdc78e4d06a2fcd..4e3aeb321c7eb82503d4e0ab665987e38c295ba2 100644 (file)
--- a/misc.c
+++ b/misc.c
 #include "linenoise/linenoise.h"
 #include "newdb.h"
 
+const char new_advent_to_ascii[] = {
+  ' ', '!', '"', '#', '$', '%', '&', '\'',
+  '(', ')', '*', '+', ',', '-', '.', '/',
+  '0', '1', '2', '3', '4', '5', '6', '7',
+  '8', '9', ':', ';', '<', '=', '>', '?',
+  '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+  'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+  'X', 'Y', 'Z', '\0', '\0', '\0', '\0', '\0',
+};
+
+const char new_ascii_to_advent[] = {
+  63, 63, 63, 63, 63, 63, 63, 63,
+  63, 63, 63, 63, 63, 63, 63, 63,
+  63, 63, 63, 63, 63, 63, 63, 63,
+  63, 63, 63, 63, 63, 63, 63, 63,
+
+  0, 1, 2, 3, 4, 5, 6, 7,
+  8, 9, 10, 11, 12, 13, 14, 15,
+  16, 17, 18, 19, 20, 21, 22, 23,
+  24, 25, 26, 27, 28, 29, 30, 31,
+  32, 33, 34, 35, 36, 37, 38, 39,
+  40, 41, 42, 43, 44, 45, 46, 47,
+  48, 49, 50, 51, 52, 53, 54, 55,
+  56, 57, 58, 59, 60, 61, 62, 63,
+
+  63, 63, 63, 63, 63, 63, 63, 63,
+  63, 63, 63, 63, 63, 63, 63, 63,
+  63, 63, 63, 63, 63, 63, 63, 63,
+  63, 63, 63, 63, 63, 63, 63, 63,
+};
+
 char* xstrdup(const char* s)
 {
   char* ptr = strdup(s);
@@ -649,101 +681,6 @@ void make_zzword(char zzword[6])
   zzword[5] = '\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 he mapping.  MAP2(1) is set to 0 when the
-         *  program starts and is not changed thereafter unless the
-         *  routines in this module 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;
-    }
-}
-
 void datime(long* d, long* t)
 {
     struct timeval tv;
index d1ea21c8f04c696429960ddb3ccd74107885f624..3ae0c0551473a4e2c876165bc0f473b3221a0a4c 100755 (executable)
@@ -220,7 +220,6 @@ enum special_refs {{
 
 c_template = """/* Generated from adventure.yaml - do not hand-hack! */
 
-#include "common.h"
 #include "{}"
 
 const char* arbitrary_messages[] = {{