(linenum→info "unix/slp.c:2238")

bsd-games/2.17/hack/hack.rumors.c

    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: }
Syntax (Markdown)