Home | History | Annotate | Line # | Download | only in hack
hack.rumors.c revision 1.2
      1  1.2  mycroft /*
      2  1.2  mycroft  * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
      3  1.2  mycroft  */
      4  1.2  mycroft 
      5  1.2  mycroft #ifndef lint
      6  1.2  mycroft static char rcsid[] = "$Id: hack.rumors.c,v 1.2 1993/08/02 17:19:20 mycroft Exp $";
      7  1.2  mycroft #endif /* not lint */
      8  1.1      cgd 
      9  1.1      cgd #include	<stdio.h>
     10  1.1      cgd #include	"hack.h"		/* for RUMORFILE and BSD (index) */
     11  1.1      cgd #define	CHARSZ	8			/* number of bits in a char */
     12  1.1      cgd extern long *alloc();
     13  1.1      cgd extern char *index();
     14  1.1      cgd int n_rumors = 0;
     15  1.1      cgd int n_used_rumors = -1;
     16  1.1      cgd char *usedbits;
     17  1.1      cgd 
     18  1.1      cgd init_rumors(rumf) register FILE *rumf; {
     19  1.1      cgd register int i;
     20  1.1      cgd 	n_used_rumors = 0;
     21  1.1      cgd 	while(skipline(rumf)) n_rumors++;
     22  1.1      cgd 	rewind(rumf);
     23  1.1      cgd 	i = n_rumors/CHARSZ;
     24  1.1      cgd 	usedbits = (char *) alloc((unsigned)(i+1));
     25  1.1      cgd 	for( ; i>=0; i--) usedbits[i] = 0;
     26  1.1      cgd }
     27  1.1      cgd 
     28  1.1      cgd skipline(rumf) register FILE *rumf; {
     29  1.1      cgd char line[COLNO];
     30  1.1      cgd 	while(1) {
     31  1.1      cgd 		if(!fgets(line, sizeof(line), rumf)) return(0);
     32  1.1      cgd 		if(index(line, '\n')) return(1);
     33  1.1      cgd 	}
     34  1.1      cgd }
     35  1.1      cgd 
     36  1.1      cgd outline(rumf) register FILE *rumf; {
     37  1.1      cgd char line[COLNO];
     38  1.1      cgd register char *ep;
     39  1.1      cgd 	if(!fgets(line, sizeof(line), rumf)) return;
     40  1.1      cgd 	if((ep = index(line, '\n')) != 0) *ep = 0;
     41  1.1      cgd 	pline("This cookie has a scrap of paper inside! It reads: ");
     42  1.1      cgd 	pline(line);
     43  1.1      cgd }
     44  1.1      cgd 
     45  1.1      cgd outrumor(){
     46  1.1      cgd register int rn,i;
     47  1.1      cgd register FILE *rumf;
     48  1.1      cgd 	if(n_rumors <= n_used_rumors ||
     49  1.1      cgd 	  (rumf = fopen(RUMORFILE, "r")) == (FILE *) 0) return;
     50  1.1      cgd 	if(n_used_rumors < 0) init_rumors(rumf);
     51  1.1      cgd 	if(!n_rumors) goto none;
     52  1.1      cgd 	rn = rn2(n_rumors - n_used_rumors);
     53  1.1      cgd 	i = 0;
     54  1.1      cgd 	while(rn || used(i)) {
     55  1.1      cgd 		(void) skipline(rumf);
     56  1.1      cgd 		if(!used(i)) rn--;
     57  1.1      cgd 		i++;
     58  1.1      cgd 	}
     59  1.1      cgd 	usedbits[i/CHARSZ] |= (1 << (i % CHARSZ));
     60  1.1      cgd 	n_used_rumors++;
     61  1.1      cgd 	outline(rumf);
     62  1.1      cgd none:
     63  1.1      cgd 	(void) fclose(rumf);
     64  1.1      cgd }
     65  1.1      cgd 
     66  1.1      cgd used(i) register int i; {
     67  1.1      cgd 	return(usedbits[i/CHARSZ] & (1 << (i % CHARSZ)));
     68  1.1      cgd }
     69