home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 300-399 / ff369.lzh / Fortune / fortune.c < prev    next >
C/C++ Source or Header  |  1990-08-15  |  8KB  |  301 lines

  1. /*-------------------------------------------------------------------------*/
  2. /*   Programmer:  George Kerber                                            */
  3. /*      Written:  06/19/89                                                 */
  4. /*      Purpose:  Similar to the UNIX Fortune, but centers the lines.      */
  5. /*     Compiler:  Lattice 5.05                                             */
  6. /*-------------------------------------------------------------------------*/
  7.  
  8. #define WRITTEN "06/19/89 - 04/20/90"
  9. #define VERSION "v2.04h"
  10.  
  11. #define TRUE 1
  12.  
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <dos.h>
  16. #include <ctype.h>
  17. #include <stdlib.h>
  18.  
  19. void main(), helpscreen(), mistake(), cleanup(), makeline(), print_rule();
  20.  
  21. void main(int argc, char *argv[])
  22. {
  23. char officialrule[200]  = "Multiple color options", option, opts[] = "";
  24. char *tempy, node[35], pathtorules[80] = "s:fortunes";
  25. int next, character, linesflag = 1, sflag = 0;
  26. int escape_char = '*', cflag = 2, cflag1 = 0;
  27. unsigned char clock[8];
  28. unsigned long linecount; 
  29. FILE *fp, *voice;
  30.  
  31. /*----- Sets escape value -------- default is * ---------------------------*/
  32. if((tempy = getenv("ESCAPE")) != NULL) escape_char = *tempy;
  33. /*-------------------------------------------------------------------------*/
  34.       
  35. getclk(clock);
  36. stcgfn(node,argv[0]);
  37. if(strcmp(argv[1],"?") == 0 && argc > 1) 
  38.    helpscreen(escape_char,node,pathtorules);
  39.  
  40. /*----  Error Checking and Option Check  ----------------------------------*/
  41. if(argc)
  42.    {
  43.    for( next = 1 ; (argopt(argc,argv,opts,&next,&option)) != NULL ; )
  44.       {
  45.       switch(toupper(option))
  46.          {
  47.          case '1':  if(cflag1) mistake(officialrule,node); cflag=1; cflag1=1;
  48.                     break;
  49.          case '2':  if(cflag1) mistake(officialrule,node); cflag=2; cflag1=1;
  50.                     break;
  51.          case '3':  if(cflag1) mistake(officialrule,node); cflag=3; cflag1=1;
  52.                     break;
  53.          case 'S':  sflag = 1; break;
  54.          case 'L':  linesflag = 0; break;
  55.           default:  mistake("Invalid Option",node);
  56.          }
  57.       } 
  58.    }
  59.  
  60. if(!argc)
  61.    {
  62.    *node = NULL;
  63.    sflag = 1;
  64.    }
  65.  
  66. if(sflag)
  67.    {
  68.    if((voice = fopen("SPEAK:OPT/d0", "w")) == (FILE *)NULL) 
  69.       mistake("Can't open SPEAK:    Is it MOUNTED?",node);
  70.    }
  71.  
  72. if(sflag) linesflag = 0;
  73. if(argc > next) 
  74.    {
  75.    strcpy(pathtorules,(argv[next]));
  76.    }
  77.    else
  78.    {
  79.    if(!access("ram:fortunes",0)) 
  80.       {
  81.       strcpy(pathtorules,"ram:fortunes");
  82.       }
  83.       else
  84.       {
  85.       if(!access("fortunes",0)) strcpy(pathtorules,"fortunes"); 
  86.       }
  87.    }
  88.  
  89. if(argc > (next + 1)) mistake("Invalid Option Count",node);
  90.  
  91. if(access(pathtorules,4)) mistake("Can't Locate File",node);
  92.  
  93. /*----  Open "fortunes" file    -------------------------------------------*/
  94. if((fp = fopen(pathtorules,"r")) == (FILE *)NULL)
  95.    mistake("Can't Open File",node);
  96.  
  97. srand(clock[7] + clock[6] + clock[3] + clock[4]);
  98.  
  99. fseek(fp,-1L,2);
  100. linecount = ftell(fp);
  101. rewind(fp);
  102.  
  103. while(TRUE)
  104.    {
  105.    if(fseek(fp, (rand() % linecount) + 1, 0))
  106.       {
  107.       mistake("Can't SEEK",node); 
  108.       }
  109.  
  110.    while((character = fgetc(fp)) != EOF) 
  111.       {
  112.       if(character == '\n') break; 
  113.       continue; 
  114.       }
  115.  
  116.    if(fgets(officialrule,200,fp) == (char *)NULL)
  117.       {
  118.       continue; 
  119.       }
  120.       else 
  121.       {
  122.       if(*officialrule == ' ' || *officialrule == '#') continue;
  123.       if(linesflag) makeline(cflag);
  124.       if(!sflag) printf("\n");
  125.       print_rule(81,officialrule,escape_char,sflag,voice);
  126.       }
  127.  
  128.    next = 0;
  129.    while(TRUE) 
  130.       {
  131.       if(fgets(officialrule,200,fp) == (char *)NULL) 
  132.          {
  133.          cleanup(linesflag,sflag,cflag);
  134.          }
  135.          else 
  136.          {
  137.          if(*officialrule != ' ' || *officialrule == '\n') 
  138.             {
  139.             cleanup(linesflag,sflag,cflag); 
  140.             }
  141.          print_rule(80,officialrule,escape_char,sflag,voice);
  142.          if(next++ >= 10) cleanup(linesflag,sflag,cflag);
  143.          }
  144.       continue; 
  145.       }
  146.    if(linesflag) makeline(cflag);
  147.    }
  148. }
  149.  
  150. /*-------------------------------------------------------------------------*/
  151. /*      End of main program, functions are below                           */
  152. /*-------------------------------------------------------------------------*/
  153.  
  154. /*  CLEANUP FUNCTION  */
  155.  
  156. void cleanup(int linesflag,int sflag,int cflag)
  157. {
  158. if(linesflag) makeline(cflag);
  159. if(!sflag) printf("\n");
  160. fcloseall();
  161. exit(0);
  162. }
  163.  
  164. /*-------------------------------------------------------------------------*/
  165.  
  166. /*  HELPSCREEN FUNCTION  */
  167.  
  168. void helpscreen(char escape_char, char *node, char *def_file)
  169. {
  170. char *display = "  displayed w/";
  171. char *outline = " outline.";
  172. char *alter = "alternate path/file";
  173. char *blank = "           -";
  174.  
  175. printf("\x0c");
  176. makeline(2);
  177. printf("\n  %s    George Kerber %10s %25s\n\n",
  178.        node,VERSION,WRITTEN);
  179. printf("  Randomly display or speak a fortune.\n\n");
  180. printf("  Escape Character = \"%c\"\n\n",escape_char);
  181. printf("  SYNTAX:  %s [-l | -s | [-1 | -2 | -3]] [%s]\n\n",
  182.           node,alter);
  183. printf("%ss  spoken --> SPEAK: device.\n",blank);
  184. printf("%sl%so%s\n",blank,display,outline);
  185. printf("%s1%scolor 1%s\n",blank,display,outline);
  186. printf("%s2%scolor 2%s (default)\n", blank,display,outline);
  187. printf("%s3%scolor 3%s\n\n", blank,display,outline);
  188. printf("  Data file is %s or %s.\n",def_file,alter);
  189. makeline(2);
  190. printf("\n");
  191. exit(0);
  192. }
  193.  
  194. /*-------------------------------------------------------------------------*/
  195.  
  196. /*  MAKELINE FUNCTION  */
  197.  
  198. void makeline(int cflag)
  199. {
  200.  
  201. switch(cflag)
  202.    {
  203.    case 1:  printf(""); break;
  204.    case 2:  printf(""); break;
  205.    case 3:  printf(""); break;
  206.    }
  207.  
  208. printf("  ___________________________________________________________________________\n");
  209. }
  210.  
  211. /*-------------------------------------------------------------------------*/
  212.  
  213. /*  MISTAKE FUNCTION  */
  214.  
  215. void mistake(char *description, char *node)
  216. {
  217. if(*node != NULL)
  218.    {
  219.    printf("\n\n\07     ERROR: %s -->> %s.\n\n",
  220.            node,description);
  221.    }
  222.    
  223. exit(5);
  224. }
  225.  
  226. /*-------------------------------------------------------------------------*/
  227.  
  228. /*  PRINT_RULE FUNCTION  */
  229.  
  230. void print_rule(int number, char *rule,int escape_char,int sflag,FILE *voice)
  231. {
  232. int offset = 0, i;
  233. char fortune[200];
  234.  
  235. *fortune = NULL;
  236.  
  237. rule--;
  238. while(*(++rule) != (char *)NULL) 
  239.    {
  240.    if(*rule == escape_char) 
  241.       {
  242.       if(*(++rule) == escape_char) 
  243.          {
  244.          i = strlen(fortune);
  245.          *(fortune + i++) = escape_char;
  246.          *(fortune + i) = NULL;
  247.          offset++;
  248.          continue; 
  249.          }
  250.       if(!sflag) 
  251.          {
  252.          switch(*rule) 
  253.             {
  254.             case '0':  strcat(fortune,""); break; /* color 0 char    */
  255.             case '1':  strcat(fortune,""); break; /* color 1 char    */
  256.             case '2':  strcat(fortune,""); break; /* color 2 char    */
  257.             case '3':  strcat(fortune,""); break; /* color 3 char    */
  258.             case '4':  strcat(fortune,"");  break; /* default attr    */
  259.             case '5':  strcat(fortune,"");  break; /* bold char       */
  260.             case '6':  strcat(fortune,"");  break; /* underline char  */
  261.             case '7':  strcat(fortune,"");  break; /* italics char    */
  262.             case ')':  strcat(fortune,""); break; /* color 0 bkgnd   */
  263.             case '!':  strcat(fortune,""); break; /* color 1 bkgnd   */
  264.             case '@':  strcat(fortune,""); break; /* color 2 bkgnd   */
  265.             case '#':  strcat(fortune,""); break; /* color 3 bkgnd   */
  266.             }
  267.          }
  268.       }
  269.       else 
  270.       {
  271.       i = strlen(fortune);
  272.       *(fortune + i++) = *rule;
  273.       *(fortune + i) = NULL;
  274.       offset++;
  275.       }
  276.    continue;
  277.    }
  278.  
  279. if(sflag)
  280.    {
  281.    fprintf(voice,"%s",fortune);
  282.    }
  283.    else
  284.    {
  285.    offset = ((number - offset) / 2);
  286.    for( ; offset > 0 ; strins(fortune," "),offset--); 
  287.    printf("%s",fortune);  
  288.    }
  289. }
  290.  
  291. /*-------------------------------------------------------------------------*\
  292.  
  293. 10/07/89 v2.03:  Added escape and color options
  294. 11/01/89 v2.03b: Re-compiled with Lattice 5.04.
  295. 01/07/90 v2.03c: Removed all global variables
  296. 03/03/90 v2.04e: Re-compiled with Lattice 5.04.
  297. 04/16/90 v2.04g: Optimized code and reduced helpscreen for smaller
  298.                  program size.
  299.  
  300. \*-------------------------------------------------------------------------*/
  301.