Source:Hack 1.0/hack.rumors.c

Below is the full text to hack.rumors.c from the source code of Hack 1.0. To link to a particular line, write [[Hack 1.0/hack.rumors.c#line123 ]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

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