DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T m

⟦26a163afa⟧ TextFile

    Length: 4308 (0x10d4)
    Types: TextFile
    Names: »misc.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Adv/Program/misc.c« 

TextFile

#include "adv.h"
#include <ctype.h>

/*
 * Get input line; break into words;
 * If 'verb' matches objects 1-6, make 'verb' "GO" and 'object'
 * 'verb'; else match verb/object.
 */

char	*wrdbrk();

parse()
{
	register char *vp, *op;

	for (;;) {
		vp = wrdbrk(0);
		op = wrdbrk(1);
#ifdef DEBUG
		prt("verb: %s; obj: %s\n", vp, op);
#endif
		/*
		 * Handle "save game", "load game", and "quit".
		 */
		if (strcmp(vp, scom) == 0 && strcmp(op, gobj) == 0) {
			save();
			continue;
		}
		if (strcmp(vp, lcom) == 0 && strcmp(op, gobj) == 0) {
			load();
			continue;
		}
		if (strcmp(vp, qcom) == 0) {
			isend = TRUE;
			return;
		}

		/*
		 * Convert verb & object strings to numeric equivalents.
		 */
		if (*op)
			objv = wrdval(nobjs, objs, op);
		else {
			objv = wrdval(nobjs, objs, vp);
			if (objv > 0 && objv < 7) {
				verbv = 1;/* Special hack: "go" dir */
				return;
			}
			objv = 0;
		}
		verbv = wrdval(nverbs, verbs, vp);
		if (verbv == -1 || objv == -1)
			prt("You use word(s) I don't know.\n");
		else
			return;
	}
}

/*
 * Find a word in a wordlist
 */
wrdval(n, wl, s)
	register int n;
	register struct word *wl;
	register char *s;
{

	while (--n > 0) {
		wl++;
		if (strcmp(wl->word, s) == 0)
			return (wl->val);
	}
	return (-1);
}

/*
 * Break off a word.  Obj is true if we can ignore the lack of a word
 * (i.e., we're looking for an object).  Words come in pairs, unless
 * separated by periods.
 */
char *wrdbrk(obj)
	int obj;
{
	register char *cp;
	char *st, *en;
	int lpcount = 0;
	static char *lp = "";
	static char inbuf[LINELEN+1];
	static BOOL per = FALSE;

	/*
	 * If we saw a period (or the end of an input line), and we're
	 * looking for an object, return the null string.
	 * In any case clear the period/end-of-line flag.
	 */
	if (per) {
		per = FALSE;
		if (obj)
			return ("");
	}

	/*
	 * Start searching from previous stop point.
	 */
	cp = lp;
	for (;;) {
		/*
		 * Find the beginning of the next word.  If there is
		 * a word, take it, and note whether it is followed by
		 * a period (or end of line).
		 */
		skpwht(cp);
		if (*cp) {
			st = cp;
			while (*cp && !isspace(*cp) && *cp != '.')
				cp++;
			en = cp;
			if (en - st > wrdsiz)
				en = st + wrdsiz;
			skpwht(cp);
			if (*cp == '.') {
				cp++;
				per = TRUE;
				skpwht(cp);
			}
			if (*cp == 0)
				per = TRUE;
			lp = cp;
			*en = 0;
			return (st);
		}

		/*
		 * Read an input line from the user.  Convert to
		 * uppercase.  (Ok, so it oughta use lowercase....)
		 */
		disply();
		prt("Tell me what to do: ");
		prt(0);
		wgets(inbuf, sizeof inbuf);
		cp = inbuf;
		while (*cp) {
			if (islower(*cp))
				*cp = toupper(*cp);
			cp++;
		}
		cp = inbuf;
	}
}

/*
 * Let the user type in a string, but only choice characters
 * (and at most bs-1 of them).
 */
wgets(bp, bs)
	register char *bp;
	register int bs;
{
	register int nch = 0, c;
#define Ctl(c) ((c) & 0x1f)

	/*
	 * What is this doing here?
	 */
#ifndef CURSED
	if (COLS - CurWin->w_cursor.col > bs) {
		if (COLS - CurWin->w_cursor.col < 4)
			Wputc('\n', CurWin);
		if (COLS - CurWin->w_cursor.col > bs)
			bs = COLS - CurWin->w_cursor.col;
#else CURSED
	{
		int	y, x;
		getyx(CurWin, y, x);

		if (COLS - x > bs) {
			if (COLS - x < 4) {
				waddch(CurWin, '\n');
				x = 0;
			}
			if (COLS - x > bs)
				bs = COLS - x;
		}
#endif CURSED
	}

	/*
	 * Should probably use user's editing chars, but for now...
	 */
	refresh();
	ReadingTerminal = 2;
	while ((c = getchar()) != '\n' &&c != '\r') {
		ReadingTerminal = 0;
		if (c == '\b' || c == 0177) {
			if (nch) {
				--nch;
				Wputs("\b \b", CurWin);
			}
		}
		else if (c == Ctl('u') || c == Ctl('x')) {
			while (--nch >= 0)
				Wputs("\b \b", CurWin);
			nch = 0;
		}
		else if (c == Ctl('w')) {
			while (--nch >= 0 && bp[nch] == ' ')
				Wputs("\b \b", CurWin);
			nch++;
			while (--nch >= 0 && bp[nch] != ' ')
				Wputs("\b \b", CurWin);
			nch++;
		}
		else if (c == Ctl('l'))	/* redraw screen */
#ifndef CURSED
			ScreenGarbaged++;
#else CURSED
			wrefresh(curscr);
#endif CURSED
		else if (c >= ' ' && c < 0177) {
			bp[nch++] =c;
			if (nch > bs)
				--nch;
			else
				Wputc(c, CurWin);
		}
#ifndef CURSED
		refresh();
#else CURSED
		wrefresh(CurWin);
#endif CURSED
		ReadingTerminal = 2;
	}
	ReadingTerminal = 0;
	bp[nch] = 0;
	Wputc('\n', CurWin);
#undef Ctl
}