142 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*	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;
 | |
| }
 | 
