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