Jettison MAKEWD(), GETTXT(), vocab(), GETIN(), and the old db compiler.

This commit is contained in:
Jason S. Ninneman 2017-06-29 08:35:48 -07:00
parent c4ceca3db9
commit 83fb64b5a8
8 changed files with 9 additions and 189 deletions

View file

@ -38,7 +38,7 @@ 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) dungeon.c advent.h common.h adventure.text adventure.yaml Makefile control linenoise/linenoise.[ch] newdungeon.py
SOURCES=$(OBJS:.o=.c) advent.h common.h adventure.text adventure.yaml Makefile control linenoise/linenoise.[ch] newdungeon.py
.c.o:
$(CC) $(CCFLAGS) $(DBX) -c $<
@ -46,41 +46,33 @@ SOURCES=$(OBJS:.o=.c) dungeon.c advent.h common.h adventure.text adventure.yaml
advent: $(OBJS) linenoise.o newdb.o
$(CC) $(CCFLAGS) $(DBX) -o advent $(OBJS) newdb.o linenoise.o $(LDFLAGS) $(LIBS)
main.o: advent.h database.h common.h newdb.h
main.o: advent.h common.h newdb.h
init.o: advent.h database.h common.h newdb.h
init.o: advent.h common.h newdb.h
actions.o: advent.h database.h common.h newdb.h
actions.o: advent.h common.h newdb.h
score.o: advent.h database.h common.h newdb.h
score.o: advent.h common.h newdb.h
misc.o: advent.h database.h common.h newdb.h
misc.o: advent.h common.h newdb.h
cheat.o: advent.h database.h common.h newdb.h
cheat.o: advent.h common.h newdb.h
saveresume.o: advent.h database.h common.h newdb.h
saveresume.o: advent.h common.h newdb.h
common.o: common.h
dungeon.o: common.h newdb.h
newdb.o: newdb.c newdb.h
$(CC) $(CCFLAGS) $(DBX) -c newdb.c
database.h: dungeon
./dungeon
newdb.c newdb.h: newdungeon.py adventure.yaml
python3 newdungeon.py
linenoise.o: linenoise/linenoise.h
$(CC) $(CCFLAGS) -c linenoise/linenoise.c
dungeon: dungeon.o common.o
$(CC) $(CCFLAGS) -o $@ dungeon.o common.o
clean:
rm -f *.o advent cheat *.html database.h dungeon *.gcno *.gcda
rm -f *.o advent cheat *.html *.gcno *.gcda
rm -f newdb.c newdb.h
rm -f README advent.6 MANIFEST *.tar.gz
rm -f *~

View file

@ -1,7 +1,6 @@
#include <stdlib.h>
#include <stdbool.h>
#include "advent.h"
#include "database.h"
#include "newdb.h"
static int fill(token_t, token_t);

View file

@ -5,7 +5,6 @@
#include <stdbool.h>
#include <time.h>
#include "advent.h"
#include "database.h"
#include "linenoise/linenoise.h"
#include "newdb.h"

1
init.c
View file

@ -4,7 +4,6 @@
#include <stdbool.h>
#include "advent.h"
#include "database.h"
/*
* Initialisation

1
main.c
View file

@ -22,7 +22,6 @@
#include <time.h>
#include <string.h>
#include "advent.h"
#include "database.h"
#include "linenoise/linenoise.h"
#include "newdb.h"

166
misc.c
View file

@ -7,7 +7,6 @@
#include <ctype.h>
#include "advent.h"
#include "database.h"
#include "linenoise/linenoise.h"
#include "newdb.h"
@ -251,42 +250,6 @@ void rspeak(vocab_t i, ...)
va_end(ap);
}
bool GETIN(FILE *input,
long *pword1, long *pword1x,
long *pword2, long *pword2x)
/* Get a command from the adventurer. Snarf out the first word, pad it with
* blanks, and return it in WORD1. Chars 6 thru 10 are returned in WORD1X, in
* case we need to print out the whole word in an error message. Any number of
* blanks may follow the word. If a second word appears, it is returned in
* WORD2 (chars 6 thru 10 in WORD2X), else WORD2 is -1. */
{
long junk;
for (;;) {
if (game.blklin)
fputc('\n', stdout);;
if (!MAPLIN(input))
return false;
*pword1 = GETTXT(true, true, true);
if (game.blklin && *pword1 < 0)
continue;
*pword1x = GETTXT(false, true, true);
do {
junk = GETTXT(false, true, true);
} while
(junk > 0);
*pword2 = GETTXT(true, true, true);
*pword2x = GETTXT(false, true, true);
do {
junk = GETTXT(false, true, true);
} while
(junk > 0);
if (GETTXT(true, true, true) <= 0)
return true;
rspeak(TWO_WORDS);
}
}
void echo_input(FILE* destination, char* input_prompt, char* input)
{
size_t len = strlen(input_prompt) + strlen(input) + 1;
@ -453,109 +416,8 @@ bool yes(const char* question, const char* yes_response, const char* no_response
return (outcome);
}
/* Line-parsing routines (GETTXT, MAKEWD, PUTTXT, SHFTXT) */
long GETTXT(bool skip, bool onewrd, bool 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 TEXT 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;
}
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 < ascii_to_advent['%']) {
splitting = -1;
if (upper && current >= ascii_to_advent['a'])
current = current - 26;
text = text + current;
++LNPOSN;
continue;
}
if (splitting != LNPOSN) {
text = text + ascii_to_advent['%'];
splitting = LNPOSN;
continue;
}
text = text + current - ascii_to_advent['%'];
splitting = -1;
++LNPOSN;
}
return text;
}
token_t MAKEWD(long letters)
/* 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. */
{
long i = 1, word = 0;
for (long k = letters; k != 0; k = k / 100) {
word = word + i * (MOD(k, 50) + 10);
i = i * 64;
if (MOD(k, 100) > 50)word = word + i * 5;
}
i = 64L * 64L * 64L * 64L * 64L / i;
word = word * i;
return word;
}
/* Data structure routines */
long vocab(long id, long init)
/* Look up ID in the vocabulary (ATAB) and return its "definition" (KTAB), or
* -1 if not found. If INIT is positive, this is an initialisation call setting
* up a keyword variable, and not finding it constitutes a bug. It also means
* that only KTAB values which taken over 1000 equal INIT may be considered.
* (Thus "STEPS", which is a motion verb as well as an object, may be located
* as an object.) And it also means the KTAB value is taken modulo 1000. */
{
long lexeme;
for (long i = 1; i <= TABSIZ; i++) {
if (KTAB[i] == -1) {
lexeme = -1;
if (init < 0)
return (lexeme);
BUG(REQUIRED_VOCABULARY_WORD_NOT_FOUND); // LCOV_EXCL_LINE
}
if (init >= 0 && KTAB[i] / 1000 != init)
continue;
if (ATAB[i] == id) {
lexeme = KTAB[i];
if (init >= 0)
lexeme = MOD(lexeme, 1000);
return (lexeme);
}
}
BUG(RAN_OFF_END_OF_VOCABULARY_TABLE); // LCOV_EXCL_LINE
}
int get_motion_vocab_id(const char* word)
// Return the first motion number that has 'word' as one of its words.
{
@ -777,34 +639,6 @@ long randrange(long range)
return range * get_next_lcg_value() / game.lcg_m;
}
long rndvoc(long second, long force)
/* Searches the vocabulary ATAB 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 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 make_zzword(char zzword[6])
{
for (int i = 0; i < 5; ++i)

View file

@ -2,7 +2,6 @@
#include <string.h>
#include "advent.h"
#include "database.h"
#include "newdb.h"
#include "linenoise/linenoise.h"

View file

@ -1,6 +1,5 @@
#include <stdlib.h>
#include "advent.h"
#include "database.h"
#include "newdb.h"
/*