Home | History | Annotate | Line # | Download | only in hack
hack.rumors.c revision 1.4
      1 /*	$NetBSD: hack.rumors.c,v 1.4 1997/10/19 16:58:55 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
      5  */
      6 
      7 #include <sys/cdefs.h>
      8 #ifndef lint
      9 __RCSID("$NetBSD: hack.rumors.c,v 1.4 1997/10/19 16:58:55 christos Exp $");
     10 #endif				/* not lint */
     11 
     12 #include "hack.h"	/* for RUMORFILE and BSD (strchr) */
     13 #include "extern.h"
     14 #define	CHARSZ	8		/* number of bits in a char */
     15 int             n_rumors = 0;
     16 int             n_used_rumors = -1;
     17 char           *usedbits;
     18 
     19 void
     20 init_rumors(rumf)
     21 	FILE           *rumf;
     22 {
     23 	int             i;
     24 	n_used_rumors = 0;
     25 	while (skipline(rumf))
     26 		n_rumors++;
     27 	rewind(rumf);
     28 	i = n_rumors / CHARSZ;
     29 	usedbits = (char *) alloc((unsigned) (i + 1));
     30 	for (; i >= 0; i--)
     31 		usedbits[i] = 0;
     32 }
     33 
     34 int
     35 skipline(rumf)
     36 	FILE           *rumf;
     37 {
     38 	char            line[COLNO];
     39 	while (1) {
     40 		if (!fgets(line, sizeof(line), rumf))
     41 			return (0);
     42 		if (strchr(line, '\n'))
     43 			return (1);
     44 	}
     45 }
     46 
     47 void
     48 outline(rumf)
     49 	FILE           *rumf;
     50 {
     51 	char            line[COLNO];
     52 	char           *ep;
     53 	if (!fgets(line, sizeof(line), rumf))
     54 		return;
     55 	if ((ep = strchr(line, '\n')) != 0)
     56 		*ep = 0;
     57 	pline("This cookie has a scrap of paper inside! It reads: ");
     58 	pline(line);
     59 }
     60 
     61 void
     62 outrumor()
     63 {
     64 	int             rn, i;
     65 	FILE           *rumf;
     66 	if (n_rumors <= n_used_rumors ||
     67 	    (rumf = fopen(RUMORFILE, "r")) == (FILE *) 0)
     68 		return;
     69 	if (n_used_rumors < 0)
     70 		init_rumors(rumf);
     71 	if (!n_rumors)
     72 		goto none;
     73 	rn = rn2(n_rumors - n_used_rumors);
     74 	i = 0;
     75 	while (rn || used(i)) {
     76 		(void) skipline(rumf);
     77 		if (!used(i))
     78 			rn--;
     79 		i++;
     80 	}
     81 	usedbits[i / CHARSZ] |= (1 << (i % CHARSZ));
     82 	n_used_rumors++;
     83 	outline(rumf);
     84 none:
     85 	(void) fclose(rumf);
     86 }
     87 
     88 int
     89 used(i)
     90 	int             i;
     91 {
     92 	return (usedbits[i / CHARSZ] & (1 << (i % CHARSZ)));
     93 }
     94