home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / HACKSRC.ZIP / RUMORS.C < prev    next >
C/C++ Source or Header  |  1985-10-16  |  3KB  |  112 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  2. /* rumors.c - version 1.0.3 */
  3.  
  4. #include <stdio.h>
  5. #include "hack.h"        /* for RUMORFILE and BSD (index) */
  6. #define    RUMORFILE    "rumors"
  7. #ifdef DGK
  8. /* Rumors has been entirely rewritten to speed up the access.  This is
  9.  * essential when working from floppies.  Using fseek() the way that's done
  10.  * here means rumors following longer rumors are output more often than those
  11.  * following shorter rumors.  Also, you may see the same rumor more than once
  12.  * in a particular game (although the odds are highly against it), but
  13.  * this also happens with real fortune cookies.  Besides, a person can
  14.  * just read the rumor file if they desire.  -dgk
  15.  */
  16. long rumors_size;
  17. extern char *index();
  18. extern long ftell();
  19.  
  20. outrumor()
  21. {
  22.     char    line[COLNO];
  23.     char    *endp;
  24.     char    roomer[FILENAME];
  25.     FILE    *rumors;
  26.  
  27.     if (rumors_size < 0)    /* We couldn't open RUMORFILE */
  28.         return;
  29.     if(rumors = fopen(RUMORFILE, "r")) {
  30.         if (!rumors_size) {    /* if this is the first outrumor() */
  31.             fseek(rumors, 0L, 2);
  32.             rumors_size = ftell(rumors);
  33.         }
  34.         fseek(rumors, rand() % rumors_size, 0);
  35.         fgets(line, COLNO, rumors);
  36.         if (!fgets(line, COLNO, rumors)) {    /* at EOF ? */
  37.             fseek(rumors, 0L, 0);        /* seek back to start */
  38.             fgets(line, COLNO, rumors);
  39.         }
  40.         if(endp = index(line, '\n')) *endp = 0;
  41.         pline("This cookie has a scrap of paper inside! It reads: ");
  42.         pline(line);
  43.         fclose(rumors);
  44.     } else {
  45.         pline("Can't open rumors file!");
  46.         rumors_size = -1;    /* don't try to open it again */
  47.     }
  48. }
  49.  
  50. #else DGK
  51.  
  52. #define    CHARSZ    8            /* number of bits in a char */
  53. extern long *alloc();
  54. extern char *index();
  55. int n_rumors = 0;
  56. int n_used_rumors = -1;
  57. char *usedbits;
  58.  
  59. init_rumors(rumf) register FILE *rumf; {
  60. register int i;
  61.     n_used_rumors = 0;
  62.     while(skipline(rumf)) n_rumors++;
  63.     rewind(rumf);
  64.     i = n_rumors/CHARSZ;
  65.     usedbits = (char *) alloc((unsigned)(i+1));
  66.     for( ; i>=0; i--) usedbits[i] = 0;
  67. }
  68.  
  69. skipline(rumf) register FILE *rumf; {
  70. char line[COLNO];
  71.     while(1) {
  72.         if(!fgets(line, sizeof(line), rumf)) return(0);
  73.         if(index(line, '\n')) return(1);
  74.     }
  75. }
  76.  
  77. outline(rumf) register FILE *rumf; {
  78. char line[COLNO];
  79. register char *ep;
  80.     if(!fgets(line, sizeof(line), rumf)) return;
  81.     if((ep = index(line, '\n')) != 0) *ep = 0;
  82.     pline("This cookie has a scrap of paper inside! It reads: ");
  83.     pline(line);
  84. }
  85.  
  86. outrumor(){
  87. register int rn,i;
  88. register FILE *rumf;
  89.     if(n_rumors <= n_used_rumors ||
  90.       (rumf = fopen(RUMORFILE, "r")) == (FILE *) 0) return;
  91.     if(n_used_rumors < 0) init_rumors(rumf);
  92.     if(!n_rumors) goto none;
  93.     rn = rn2(n_rumors - n_used_rumors);
  94.     i = 0;
  95.     while(rn || used(i)) {
  96.         (void) skipline(rumf);
  97.         if(!used(i)) rn--;
  98.         i++;
  99.     }
  100.     usedbits[i/CHARSZ] |= (1 << (i % CHARSZ));
  101.     n_used_rumors++;
  102.     outline(rumf);
  103. none:
  104.     (void) fclose(rumf);
  105. }
  106.  
  107. used(i) register int i; {
  108.     return(usedbits[i/CHARSZ] & (1 << (i % CHARSZ)));
  109. }
  110.  
  111. #endif DGK
  112.