
1: /* $NetBSD: hack.rumors.c,v 1.5 2003/04/02 18:36:39 jsm Exp $ */ 2: 3: /* 4: * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, 5: * Amsterdam 6: * All rights reserved. 7: * 8: * Redistribution and use in source and binary forms, with or without 9: * modification, are permitted provided that the following conditions are 10: * met: 11: * 12: * - Redistributions of source code must retain the above copyright notice, 13: * this list of conditions and the following disclaimer. 14: * 15: * - Redistributions in binary form must reproduce the above copyright 16: * notice, this list of conditions and the following disclaimer in the 17: * documentation and/or other materials provided with the distribution. 18: * 19: * - Neither the name of the Stichting Centrum voor Wiskunde en 20: * Informatica, nor the names of its contributors may be used to endorse or 21: * promote products derived from this software without specific prior 22: * written permission. 23: * 24: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 25: * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 26: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 27: * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 28: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 29: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 30: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 31: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 32: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 33: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 34: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35: */ 36: 37: /* 38: * Copyright (c) 1982 Jay Fenlason <hack@gnu.org> 39: * All rights reserved. 40: * 41: * Redistribution and use in source and binary forms, with or without 42: * modification, are permitted provided that the following conditions 43: * are met: 44: * 1. Redistributions of source code must retain the above copyright 45: * notice, this list of conditions and the following disclaimer. 46: * 2. Redistributions in binary form must reproduce the above copyright 47: * notice, this list of conditions and the following disclaimer in the 48: * documentation and/or other materials provided with the distribution. 49: * 3. The name of the author may not be used to endorse or promote products 50: * derived from this software without specific prior written permission. 51: * 52: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 53: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 54: * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 55: * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 56: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 57: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 58: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 59: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 60: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 61: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62: */ 63: 64: #include <sys/cdefs.h> 65: #ifndef lint 66: __RCSID("$NetBSD: hack.rumors.c,v 1.5 2003/04/02 18:36:39 jsm Exp $"); 67: #endif /* not lint */ 68: 69: #include "hack.h" /* for RUMORFILE and BSD (strchr) */ 70: #include "extern.h" 71: #define CHARSZ 8 /* number of bits in a char */ 72: int n_rumors = 0; 73: int n_used_rumors = -1; 74: char *usedbits; 75: 76: void 77: init_rumors(rumf) 78: FILE *rumf; 79: { 80: int i; 81: n_used_rumors = 0; 82: while (skipline(rumf)) 83: n_rumors++; 84: rewind(rumf); 85: i = n_rumors / CHARSZ; 86: usedbits = (char *) alloc((unsigned) (i + 1)); 87: for (; i >= 0; i--) 88: usedbits[i] = 0; 89: } 90: 91: int 92: skipline(rumf) 93: FILE *rumf; 94: { 95: char line[COLNO]; 96: while (1) { 97: if (!fgets(line, sizeof(line), rumf)) 98: return (0); 99: if (strchr(line, '\n')) 100: return (1); 101: } 102: } 103: 104: void 105: outline(rumf) 106: FILE *rumf; 107: { 108: char line[COLNO]; 109: char *ep; 110: if (!fgets(line, sizeof(line), rumf)) 111: return; 112: if ((ep = strchr(line, '\n')) != 0) 113: *ep = 0; 114: pline("This cookie has a scrap of paper inside! It reads: "); 115: pline(line); 116: } 117: 118: void 119: outrumor() 120: { 121: int rn, i; 122: FILE *rumf; 123: if (n_rumors <= n_used_rumors || 124: (rumf = fopen(RUMORFILE, "r")) == (FILE *) 0) 125: return; 126: if (n_used_rumors < 0) 127: init_rumors(rumf); 128: if (!n_rumors) 129: goto none; 130: rn = rn2(n_rumors - n_used_rumors); 131: i = 0; 132: while (rn || used(i)) { 133: (void) skipline(rumf); 134: if (!used(i)) 135: rn--; 136: i++; 137: } 138: usedbits[i / CHARSZ] |= (1 << (i % CHARSZ)); 139: n_used_rumors++; 140: outline(rumf); 141: none: 142: (void) fclose(rumf); 143: } 144: 145: int 146: used(i) 147: int i; 148: { 149: return (usedbits[i / CHARSZ] & (1 << (i % CHARSZ))); 150: }