xref: /netbsd-src/games/hack/hack.rumors.c (revision 434d266e912f567f04c60891e280654cdb7672c5)
1*434d266eSdholland /*	$NetBSD: hack.rumors.c,v 1.9 2011/08/06 20:18:26 dholland Exp $	*/
23ea4a95cSchristos 
3210cab45Smycroft /*
41c7f94e5Sjsm  * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
51c7f94e5Sjsm  * Amsterdam
61c7f94e5Sjsm  * All rights reserved.
71c7f94e5Sjsm  *
81c7f94e5Sjsm  * Redistribution and use in source and binary forms, with or without
91c7f94e5Sjsm  * modification, are permitted provided that the following conditions are
101c7f94e5Sjsm  * met:
111c7f94e5Sjsm  *
121c7f94e5Sjsm  * - Redistributions of source code must retain the above copyright notice,
131c7f94e5Sjsm  * this list of conditions and the following disclaimer.
141c7f94e5Sjsm  *
151c7f94e5Sjsm  * - Redistributions in binary form must reproduce the above copyright
161c7f94e5Sjsm  * notice, this list of conditions and the following disclaimer in the
171c7f94e5Sjsm  * documentation and/or other materials provided with the distribution.
181c7f94e5Sjsm  *
191c7f94e5Sjsm  * - Neither the name of the Stichting Centrum voor Wiskunde en
201c7f94e5Sjsm  * Informatica, nor the names of its contributors may be used to endorse or
211c7f94e5Sjsm  * promote products derived from this software without specific prior
221c7f94e5Sjsm  * written permission.
231c7f94e5Sjsm  *
241c7f94e5Sjsm  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
251c7f94e5Sjsm  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
261c7f94e5Sjsm  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
271c7f94e5Sjsm  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
281c7f94e5Sjsm  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
291c7f94e5Sjsm  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
301c7f94e5Sjsm  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
311c7f94e5Sjsm  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
321c7f94e5Sjsm  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
331c7f94e5Sjsm  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
341c7f94e5Sjsm  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
351c7f94e5Sjsm  */
361c7f94e5Sjsm 
371c7f94e5Sjsm /*
381c7f94e5Sjsm  * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
391c7f94e5Sjsm  * All rights reserved.
401c7f94e5Sjsm  *
411c7f94e5Sjsm  * Redistribution and use in source and binary forms, with or without
421c7f94e5Sjsm  * modification, are permitted provided that the following conditions
431c7f94e5Sjsm  * are met:
441c7f94e5Sjsm  * 1. Redistributions of source code must retain the above copyright
451c7f94e5Sjsm  *    notice, this list of conditions and the following disclaimer.
461c7f94e5Sjsm  * 2. Redistributions in binary form must reproduce the above copyright
471c7f94e5Sjsm  *    notice, this list of conditions and the following disclaimer in the
481c7f94e5Sjsm  *    documentation and/or other materials provided with the distribution.
491c7f94e5Sjsm  * 3. The name of the author may not be used to endorse or promote products
501c7f94e5Sjsm  *    derived from this software without specific prior written permission.
511c7f94e5Sjsm  *
521c7f94e5Sjsm  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
531c7f94e5Sjsm  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
541c7f94e5Sjsm  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
551c7f94e5Sjsm  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
561c7f94e5Sjsm  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
571c7f94e5Sjsm  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
581c7f94e5Sjsm  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
591c7f94e5Sjsm  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
601c7f94e5Sjsm  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
611c7f94e5Sjsm  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62210cab45Smycroft  */
63210cab45Smycroft 
643ea4a95cSchristos #include <sys/cdefs.h>
65210cab45Smycroft #ifndef lint
66*434d266eSdholland __RCSID("$NetBSD: hack.rumors.c,v 1.9 2011/08/06 20:18:26 dholland Exp $");
67210cab45Smycroft #endif				/* not lint */
6861f28255Scgd 
693ea4a95cSchristos #include "hack.h"	/* for RUMORFILE and BSD (strchr) */
703ea4a95cSchristos #include "extern.h"
7161f28255Scgd #define	CHARSZ	8		/* number of bits in a char */
7261f28255Scgd 
739b92b189Sdholland static int n_rumors = 0;
749b92b189Sdholland static int n_used_rumors = -1;
759b92b189Sdholland static char *usedbits;
769b92b189Sdholland 
779b92b189Sdholland static void init_rumors(FILE *);
789b92b189Sdholland static int skipline(FILE *);
799b92b189Sdholland static void outline(FILE *);
809b92b189Sdholland static int used(int);
819b92b189Sdholland 
829b92b189Sdholland static void
init_rumors(FILE * rumf)831fa8a9a6Sdholland init_rumors(FILE *rumf)
843ea4a95cSchristos {
853ea4a95cSchristos 	int             i;
8661f28255Scgd 	n_used_rumors = 0;
873ea4a95cSchristos 	while (skipline(rumf))
883ea4a95cSchristos 		n_rumors++;
8961f28255Scgd 	rewind(rumf);
9061f28255Scgd 	i = n_rumors / CHARSZ;
91*434d266eSdholland 	usedbits = alloc(i + 1);
923ea4a95cSchristos 	for (; i >= 0; i--)
933ea4a95cSchristos 		usedbits[i] = 0;
9461f28255Scgd }
9561f28255Scgd 
969b92b189Sdholland static int
skipline(FILE * rumf)971fa8a9a6Sdholland skipline(FILE *rumf)
983ea4a95cSchristos {
9961f28255Scgd 	char            line[COLNO];
10061f28255Scgd 	while (1) {
1013ea4a95cSchristos 		if (!fgets(line, sizeof(line), rumf))
1023ea4a95cSchristos 			return (0);
1033ea4a95cSchristos 		if (strchr(line, '\n'))
1043ea4a95cSchristos 			return (1);
10561f28255Scgd 	}
10661f28255Scgd }
10761f28255Scgd 
1089b92b189Sdholland static void
outline(FILE * rumf)1091fa8a9a6Sdholland outline(FILE *rumf)
1103ea4a95cSchristos {
11161f28255Scgd 	char            line[COLNO];
1123ea4a95cSchristos 	char           *ep;
1133ea4a95cSchristos 	if (!fgets(line, sizeof(line), rumf))
1143ea4a95cSchristos 		return;
1153ea4a95cSchristos 	if ((ep = strchr(line, '\n')) != 0)
1163ea4a95cSchristos 		*ep = 0;
11761f28255Scgd 	pline("This cookie has a scrap of paper inside! It reads: ");
11857c13365Sjoerg 	pline("%s", line);
11961f28255Scgd }
12061f28255Scgd 
1213ea4a95cSchristos void
outrumor(void)1221fa8a9a6Sdholland outrumor(void)
1233ea4a95cSchristos {
1243ea4a95cSchristos 	int             rn, i;
1253ea4a95cSchristos 	FILE           *rumf;
12661f28255Scgd 	if (n_rumors <= n_used_rumors ||
1273ea4a95cSchristos 	    (rumf = fopen(RUMORFILE, "r")) == (FILE *) 0)
1283ea4a95cSchristos 		return;
1293ea4a95cSchristos 	if (n_used_rumors < 0)
1303ea4a95cSchristos 		init_rumors(rumf);
1313ea4a95cSchristos 	if (!n_rumors)
1323ea4a95cSchristos 		goto none;
13361f28255Scgd 	rn = rn2(n_rumors - n_used_rumors);
13461f28255Scgd 	i = 0;
13561f28255Scgd 	while (rn || used(i)) {
13661f28255Scgd 		(void) skipline(rumf);
1373ea4a95cSchristos 		if (!used(i))
1383ea4a95cSchristos 			rn--;
13961f28255Scgd 		i++;
14061f28255Scgd 	}
14161f28255Scgd 	usedbits[i / CHARSZ] |= (1 << (i % CHARSZ));
14261f28255Scgd 	n_used_rumors++;
14361f28255Scgd 	outline(rumf);
14461f28255Scgd none:
14561f28255Scgd 	(void) fclose(rumf);
14661f28255Scgd }
14761f28255Scgd 
1489b92b189Sdholland static int
used(int i)1491fa8a9a6Sdholland used(int i)
1503ea4a95cSchristos {
15161f28255Scgd 	return (usedbits[i / CHARSZ] & (1 << (i % CHARSZ)));
15261f28255Scgd }
153