pc-hack

PC HACK 3.61 source code (archival)
git clone http://frotz.net/git/pc-hack.git
Log | Files | Refs

rumors.c (2876B)


      1 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
      2 /* rumors.c - version 1.0.3 */
      3 
      4 #include <stdio.h>
      5 #include "hack.h"		/* for RUMORFILE and BSD (index) */
      6 #define	RUMORFILE	"rumors"
      7 #ifdef DGK
      8 /* Rumors has been entirely rewritten to speed up the access.  This is
      9  * essential when working from floppies.  Using fseek() the way that's done
     10  * here means rumors following longer rumors are output more often than those
     11  * following shorter rumors.  Also, you may see the same rumor more than once
     12  * in a particular game (although the odds are highly against it), but
     13  * this also happens with real fortune cookies.  Besides, a person can
     14  * just read the rumor file if they desire.  -dgk
     15  */
     16 long rumors_size;
     17 extern char *index();
     18 extern long ftell();
     19 
     20 outrumor()
     21 {
     22 	char	line[COLNO];
     23 	char	*endp;
     24 	char	roomer[FILENAME];
     25 	FILE	*rumors;
     26 
     27 	if (rumors_size < 0)	/* We couldn't open RUMORFILE */
     28 		return;
     29 	if(rumors = fopen(RUMORFILE, "r")) {
     30 		if (!rumors_size) {	/* if this is the first outrumor() */
     31 			fseek(rumors, 0L, 2);
     32 			rumors_size = ftell(rumors);
     33 		}
     34 		fseek(rumors, rand() % rumors_size, 0);
     35 		fgets(line, COLNO, rumors);
     36 		if (!fgets(line, COLNO, rumors)) {	/* at EOF ? */
     37 			fseek(rumors, 0L, 0);		/* seek back to start */
     38 			fgets(line, COLNO, rumors);
     39 		}
     40 		if(endp = index(line, '\n')) *endp = 0;
     41 		pline("This cookie has a scrap of paper inside! It reads: ");
     42 		pline(line);
     43 		fclose(rumors);
     44 	} else {
     45 		pline("Can't open rumors file!");
     46 		rumors_size = -1;	/* don't try to open it again */
     47 	}
     48 }
     49 
     50 #else
     51 
     52 #define	CHARSZ	8			/* number of bits in a char */
     53 extern long *alloc();
     54 extern char *index();
     55 int n_rumors = 0;
     56 int n_used_rumors = -1;
     57 char *usedbits;
     58 
     59 init_rumors(rumf) register FILE *rumf; {
     60 register int i;
     61 	n_used_rumors = 0;
     62 	while(skipline(rumf)) n_rumors++;
     63 	rewind(rumf);
     64 	i = n_rumors/CHARSZ;
     65 	usedbits = (char *) alloc((unsigned)(i+1));
     66 	for( ; i>=0; i--) usedbits[i] = 0;
     67 }
     68 
     69 skipline(rumf) register FILE *rumf; {
     70 char line[COLNO];
     71 	while(1) {
     72 		if(!fgets(line, sizeof(line), rumf)) return(0);
     73 		if(index(line, '\n')) return(1);
     74 	}
     75 }
     76 
     77 outline(rumf) register FILE *rumf; {
     78 char line[COLNO];
     79 register char *ep;
     80 	if(!fgets(line, sizeof(line), rumf)) return;
     81 	if((ep = index(line, '\n')) != 0) *ep = 0;
     82 	pline("This cookie has a scrap of paper inside! It reads: ");
     83 	pline(line);
     84 }
     85 
     86 outrumor(){
     87 register int rn,i;
     88 register FILE *rumf;
     89 	if(n_rumors <= n_used_rumors ||
     90 	  (rumf = fopen(RUMORFILE, "r")) == (FILE *) 0) return;
     91 	if(n_used_rumors < 0) init_rumors(rumf);
     92 	if(!n_rumors) goto none;
     93 	rn = rn2(n_rumors - n_used_rumors);
     94 	i = 0;
     95 	while(rn || used(i)) {
     96 		(void) skipline(rumf);
     97 		if(!used(i)) rn--;
     98 		i++;
     99 	}
    100 	usedbits[i/CHARSZ] |= (1 << (i % CHARSZ));
    101 	n_used_rumors++;
    102 	outline(rumf);
    103 none:
    104 	(void) fclose(rumf);
    105 }
    106 
    107 used(i) register int i; {
    108 	return(usedbits[i/CHARSZ] & (1 << (i % CHARSZ)));
    109 }
    110 
    111 #endif /* DGK /**/