142 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*	program DATABASE.C					*/
 | 
						|
 | 
						|
#include	<string.h>
 | 
						|
#include	<stdio.h>
 | 
						|
#include	"advent.h"
 | 
						|
#include	"advdec.h"
 | 
						|
#include	"advtext.h"
 | 
						|
 | 
						|
static char oline[256];
 | 
						|
 | 
						|
_PROTOTYPE(void rdupto, (FILE *, int, int, char *));
 | 
						|
_PROTOTYPE(void rdskip, (FILE *, int, int));
 | 
						|
 | 
						|
/*
 | 
						|
  Function to scan a file up to a specified
 | 
						|
  point and either print or return a string.
 | 
						|
*/
 | 
						|
void rdupto(fdi, uptoc, print, string)
 | 
						|
FILE *fdi;
 | 
						|
int uptoc, print;
 | 
						|
char *string;
 | 
						|
{
 | 
						|
    int c, i;
 | 
						|
    static _CONST unsigned char key[4] = {'c' | 0x80, 'L' | 0x80,
 | 
						|
					  'y' | 0x80, 'D' | 0x80};
 | 
						|
 | 
						|
    i = 1;
 | 
						|
    while ((c = getc(fdi)) != uptoc && c != EOF) {
 | 
						|
	if (c == '\n')
 | 
						|
	    i = 1;
 | 
						|
	if (c >= 0x80)
 | 
						|
	    c ^= key[i++ & 3];
 | 
						|
	if (c == '\r')
 | 
						|
	    continue;
 | 
						|
	if (print)
 | 
						|
	    putchar(c);
 | 
						|
	else
 | 
						|
	    *string++ = (char) c;
 | 
						|
    }
 | 
						|
    if (!print)
 | 
						|
	*string = '\0';
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Function to read a file skipping
 | 
						|
  a given character a specified number
 | 
						|
  of times, with or without repositioning
 | 
						|
  the file.
 | 
						|
*/
 | 
						|
void rdskip(fdi, skipc, n)
 | 
						|
FILE *fdi;
 | 
						|
int skipc, n;
 | 
						|
{
 | 
						|
    int c;
 | 
						|
 | 
						|
    while (n--)
 | 
						|
	while ((c = getc(fdi)) != skipc)
 | 
						|
	    if (c == EOF)
 | 
						|
		bug(32);
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Routine to request a yes or no answer to a question.
 | 
						|
*/
 | 
						|
boolean yes(msg1, msg2, msg3)
 | 
						|
int msg1, msg2, msg3;
 | 
						|
{
 | 
						|
    char answer[INPUTBUFLEN];
 | 
						|
 | 
						|
    if (msg1)
 | 
						|
	rspeak(msg1);
 | 
						|
    do {
 | 
						|
	switch (*ask("\n> ", answer, sizeof(answer))) {
 | 
						|
	case 'n':
 | 
						|
	case 'N':
 | 
						|
	    if (msg3)
 | 
						|
		rspeak(msg3);
 | 
						|
	    return (FALSE);
 | 
						|
	case 'y':
 | 
						|
	case 'Y':
 | 
						|
	    if (msg2)
 | 
						|
		rspeak(msg2);
 | 
						|
	    return (TRUE);
 | 
						|
	default:
 | 
						|
	    fputs("Please answer Y (yes) or N (no).", stdout);
 | 
						|
	}
 | 
						|
    } while (TRUE);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Print a location description from "advent4.txt"
 | 
						|
*/
 | 
						|
void rspeak(msg)
 | 
						|
int msg;
 | 
						|
{
 | 
						|
    if (msg == 54)
 | 
						|
	printf("ok.\n");
 | 
						|
    else {
 | 
						|
	fseek(fd4, idx4[msg - 1], 0);
 | 
						|
	rdupto(fd4, '#', 1, 0);
 | 
						|
    }
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Print an item message for a given state from "advent3.txt"
 | 
						|
*/
 | 
						|
void pspeak(item, state)
 | 
						|
int item, state;
 | 
						|
{
 | 
						|
    fseek(fd3, idx3[item - 1], 0);
 | 
						|
    rdskip(fd3, '/', state + 2);
 | 
						|
    rdupto(fd3, '/', FALSE, oline);
 | 
						|
    if (strncmp(oline, "<$$<", 4) != 0)
 | 
						|
	printf("%s", oline);
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Print a long location description from "advent1.txt"
 | 
						|
*/
 | 
						|
void desclg(loc)
 | 
						|
int loc;
 | 
						|
{
 | 
						|
    fseek(fd1, idx1[loc - 1], 0);
 | 
						|
    rdupto(fd1, '#', 1, 0);
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Print a short location description from "advent2.txt"
 | 
						|
*/
 | 
						|
void descsh(loc)
 | 
						|
int loc;
 | 
						|
{
 | 
						|
    fseek(fd2, idx2[loc - 1], 0);
 | 
						|
    rdupto(fd2, '#', 1, 0);
 | 
						|
    return;
 | 
						|
}
 |