home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 282_01 / quip.c < prev    next >
Text File  |  1989-01-13  |  3KB  |  120 lines

  1. /*
  2. HEADER:        ;
  3. TITLE:         QUIP;
  4. VERSION:       2.0;
  5. DESCRIPTION:   "Part of a fortune cookie system
  6.  
  7.                This program displays the actual fortune.  An optional
  8.                command line paramater detirmines the number of quips
  9.                displayed";
  10. KEYWORDS:      quip, fortune, utility, startup;
  11. SYSTEM:        MS-DOS, UNIX;
  12. FILENAME:      quip.c;
  13. WARNINGS:      "";
  14. SEE-ALSO:      QUIP.C, QUIP.H, QUPUPDT.C QUIPADD.C, QUIP.DAT, QUIP.KEY;
  15. AUTHORS:       ??;
  16. MODIFIED BY:   David Bryant;
  17. COMPILERS:     Microsoft Quick C;
  18. */
  19.  
  20. #include <stdio.h>
  21.  
  22. FILE  *seekfp,    /* the address file */
  23.       *quipfp;    /* the actual fortune file */
  24.  
  25. #include "quip.h"
  26.  
  27. unsigned bmap[2048];
  28.  
  29. bittst(bitno)
  30. int   bitno;
  31. {
  32.    return (bmap[bitno / 16] & (1 << (bitno % 16)));
  33. }
  34.  
  35. bitset(bitno)
  36. int   bitno;
  37. {
  38.    bmap[bitno / 16] |= (1 << (bitno % 16));
  39. }
  40.  
  41. openfiles()
  42. {
  43.    seekfp = fopen(seekname, "rb");
  44.    if (seekfp == 0) {
  45.       puts("Cannot open address file.");
  46.       exit(0);
  47.    }
  48.    quipfp = fopen(quipname, "rb");        /* Open as BINARY file */
  49.    if (quipfp == 0) {
  50.       puts("Cannot open fortunes file.");
  51.       exit(0);
  52.    }
  53. }
  54.  
  55. long pickquip()
  56. {
  57.    unsigned size,
  58.             count = 0;
  59.    int      whseek;
  60.    long     whquip;
  61.  
  62.    if (fseek(seekfp, 0L, 2))
  63.       printf("fseek of address file failed\n");
  64.    size = ftell(seekfp) / sizeof(long);
  65.    do {
  66.       whseek = (rand() % (size - 1)) + 1;
  67.       if (count++ > 32767L)
  68.          exit(2);
  69.    } while (bittst(whseek));
  70.    bitset(whseek);
  71.    fseek(seekfp, (long)whseek * (long)sizeof(long), 0);
  72.    if (fread((char *)&whquip, sizeof(long), 1, seekfp) < 1)
  73.       puts("fread error in address file.");
  74.    return ((long)whquip);
  75. }
  76.  
  77. showquip(addr)
  78. long  addr;
  79. {
  80.    int   c;
  81.  
  82.    fseek(quipfp, addr, 0);
  83.    putchar('\n');
  84.    for (;;) {
  85.       c = getc(quipfp);
  86.       if (c == SEPERATOR || c == EOF) {
  87.          return;
  88.       }
  89.       /* filter out control characters */
  90.       if (c < ' ' && c != '\n' && c != '\007' && c != '\t' && c != 0xD)
  91.          continue;
  92.       putchar(c);
  93.    }
  94. }
  95.  
  96. closefiles()
  97. {
  98.    fclose(seekfp);
  99.    fclose(quipfp);
  100. }
  101.  
  102. main(argc, argv)
  103. int   argc;
  104. char  *argv[];
  105. {
  106.    int   times = 1;
  107.  
  108.    srand((unsigned)time(NULL));
  109.    if (argc > 1)
  110.       times = atoi(argv[1]);
  111.    openfiles();
  112.    while (times--) {
  113.       showquip(pickquip());
  114.       if (times)
  115.          printf("-------\n");
  116.    }
  117.    closefiles();
  118. }
  119.  
  120.