/*-------------------------------------------------------------------------*/ /* Programmer: George Kerber */ /* Written: 06/19/89 */ /* Purpose: Similar to the UNIX Fortune, but centers the lines. */ /* Compiler: Lattice 5.05 */ /*-------------------------------------------------------------------------*/ #define WRITTEN "06/19/89 - 04/20/90" #define VERSION "v2.04h" #define TRUE 1 #include #include #include #include #include void main(), helpscreen(), mistake(), cleanup(), makeline(), print_rule(); void main(int argc, char *argv[]) { char officialrule[200] = "Multiple color options", option, opts[] = ""; char *tempy, node[35], pathtorules[80] = "s:fortunes"; int next, character, linesflag = 1, sflag = 0; int escape_char = '*', cflag = 2, cflag1 = 0; unsigned char clock[8]; unsigned long linecount; FILE *fp, *voice; /*----- Sets escape value -------- default is * ---------------------------*/ if((tempy = getenv("ESCAPE")) != NULL) escape_char = *tempy; /*-------------------------------------------------------------------------*/ getclk(clock); stcgfn(node,argv[0]); if(strcmp(argv[1],"?") == 0 && argc > 1) helpscreen(escape_char,node,pathtorules); /*---- Error Checking and Option Check ----------------------------------*/ if(argc) { for( next = 1 ; (argopt(argc,argv,opts,&next,&option)) != NULL ; ) { switch(toupper(option)) { case '1': if(cflag1) mistake(officialrule,node); cflag=1; cflag1=1; break; case '2': if(cflag1) mistake(officialrule,node); cflag=2; cflag1=1; break; case '3': if(cflag1) mistake(officialrule,node); cflag=3; cflag1=1; break; case 'S': sflag = 1; break; case 'L': linesflag = 0; break; default: mistake("Invalid Option",node); } } } if(!argc) { *node = NULL; sflag = 1; } if(sflag) { if((voice = fopen("SPEAK:OPT/d0", "w")) == (FILE *)NULL) mistake("Can't open SPEAK: Is it MOUNTED?",node); } if(sflag) linesflag = 0; if(argc > next) { strcpy(pathtorules,(argv[next])); } else { if(!access("ram:fortunes",0)) { strcpy(pathtorules,"ram:fortunes"); } else { if(!access("fortunes",0)) strcpy(pathtorules,"fortunes"); } } if(argc > (next + 1)) mistake("Invalid Option Count",node); if(access(pathtorules,4)) mistake("Can't Locate File",node); /*---- Open "fortunes" file -------------------------------------------*/ if((fp = fopen(pathtorules,"r")) == (FILE *)NULL) mistake("Can't Open File",node); srand(clock[7] + clock[6] + clock[3] + clock[4]); fseek(fp,-1L,2); linecount = ftell(fp); rewind(fp); while(TRUE) { if(fseek(fp, (rand() % linecount) + 1, 0)) { mistake("Can't SEEK",node); } while((character = fgetc(fp)) != EOF) { if(character == '\n') break; continue; } if(fgets(officialrule,200,fp) == (char *)NULL) { continue; } else { if(*officialrule == ' ' || *officialrule == '#') continue; if(linesflag) makeline(cflag); if(!sflag) printf("\n"); print_rule(81,officialrule,escape_char,sflag,voice); } next = 0; while(TRUE) { if(fgets(officialrule,200,fp) == (char *)NULL) { cleanup(linesflag,sflag,cflag); } else { if(*officialrule != ' ' || *officialrule == '\n') { cleanup(linesflag,sflag,cflag); } print_rule(80,officialrule,escape_char,sflag,voice); if(next++ >= 10) cleanup(linesflag,sflag,cflag); } continue; } if(linesflag) makeline(cflag); } } /*-------------------------------------------------------------------------*/ /* End of main program, functions are below */ /*-------------------------------------------------------------------------*/ /* CLEANUP FUNCTION */ void cleanup(int linesflag,int sflag,int cflag) { if(linesflag) makeline(cflag); if(!sflag) printf("\n"); fcloseall(); exit(0); } /*-------------------------------------------------------------------------*/ /* HELPSCREEN FUNCTION */ void helpscreen(char escape_char, char *node, char *def_file) { char *display = " displayed w/"; char *outline = " outline."; char *alter = "alternate path/file"; char *blank = " -"; printf("\x0c"); makeline(2); printf("\n %s George Kerber %10s %25s\n\n", node,VERSION,WRITTEN); printf(" Randomly display or speak a fortune.\n\n"); printf(" Escape Character = \"%c\"\n\n",escape_char); printf(" SYNTAX: %s [-l | -s | [-1 | -2 | -3]] [%s]\n\n", node,alter); printf("%ss spoken --> SPEAK: device.\n",blank); printf("%sl%so%s\n",blank,display,outline); printf("%s1%scolor 1%s\n",blank,display,outline); printf("%s2%scolor 2%s (default)\n", blank,display,outline); printf("%s3%scolor 3%s\n\n", blank,display,outline); printf(" Data file is %s or %s.\n",def_file,alter); makeline(2); printf("\n"); exit(0); } /*-------------------------------------------------------------------------*/ /* MAKELINE FUNCTION */ void makeline(int cflag) { switch(cflag) { case 1: printf(""); break; case 2: printf(""); break; case 3: printf(""); break; } printf(" ___________________________________________________________________________\n"); } /*-------------------------------------------------------------------------*/ /* MISTAKE FUNCTION */ void mistake(char *description, char *node) { if(*node != NULL) { printf("\n\n\07 ERROR: %s -->> %s.\n\n", node,description); } exit(5); } /*-------------------------------------------------------------------------*/ /* PRINT_RULE FUNCTION */ void print_rule(int number, char *rule,int escape_char,int sflag,FILE *voice) { int offset = 0, i; char fortune[200]; *fortune = NULL; rule--; while(*(++rule) != (char *)NULL) { if(*rule == escape_char) { if(*(++rule) == escape_char) { i = strlen(fortune); *(fortune + i++) = escape_char; *(fortune + i) = NULL; offset++; continue; } if(!sflag) { switch(*rule) { case '0': strcat(fortune,""); break; /* color 0 char */ case '1': strcat(fortune,""); break; /* color 1 char */ case '2': strcat(fortune,""); break; /* color 2 char */ case '3': strcat(fortune,""); break; /* color 3 char */ case '4': strcat(fortune,""); break; /* default attr */ case '5': strcat(fortune,""); break; /* bold char */ case '6': strcat(fortune,""); break; /* underline char */ case '7': strcat(fortune,""); break; /* italics char */ case ')': strcat(fortune,""); break; /* color 0 bkgnd */ case '!': strcat(fortune,""); break; /* color 1 bkgnd */ case '@': strcat(fortune,""); break; /* color 2 bkgnd */ case '#': strcat(fortune,""); break; /* color 3 bkgnd */ } } } else { i = strlen(fortune); *(fortune + i++) = *rule; *(fortune + i) = NULL; offset++; } continue; } if(sflag) { fprintf(voice,"%s",fortune); } else { offset = ((number - offset) / 2); for( ; offset > 0 ; strins(fortune," "),offset--); printf("%s",fortune); } } /*-------------------------------------------------------------------------*\ 10/07/89 v2.03: Added escape and color options 11/01/89 v2.03b: Re-compiled with Lattice 5.04. 01/07/90 v2.03c: Removed all global variables 03/03/90 v2.04e: Re-compiled with Lattice 5.04. 04/16/90 v2.04g: Optimized code and reduced helpscreen for smaller program size. \*-------------------------------------------------------------------------*/