home *** CD-ROM | disk | FTP | other *** search
- /*==================================*/
- /* */
- /* READER V1.0 */
- /* */
- /* © 3iff. 6 Jan 1991 */
- /* */
- /*==================================*/
-
-
- #include <stdio.h>
- #define tolower(c) ((c) | 0x20)
-
- short spare = 0, sp = 0; /* Variables */
- char a[20], letters[20], saveletters[20], temp[20];
- short wl = 0, letlen=0, flag = 0, matcher = 0; /* matcher on for test!! */
- short limit = 99, count = 0; newfile = 0; /* no limit! */
- int cmatch = 0;
- short k[27] [12];
- float percent;
-
- FILE *input, *output, *fopen(); /* file declarations */
-
-
- matchword() /* match a word pattern */
- /* available letters */
- {
- register char *atext = a, *alet = letters; /* Set vars & pointers */
- short wpos = 0, flag = 0;
-
- while ((*atext) && (flag == 0)) /* till the end of word or.. */
- {
- if (letlen > (wl - wpos)) /* word not long enough */
- flag = 1;
- else
- {
- alet = &letters[0]; /* reset to first char */
-
- while((*atext != *alet) && (flag == 0) && (*alet != '.')) /* Find a matching letter */
- {
- atext++; /* inc word pointers */
- wpos++;
- if ((letlen > (wl - wpos)) || (!*atext)) /* word not long enough */
- {
- flag = 1; /* mark word as failed */
- }
- }
- if (flag != 0) /* word failed */
- return(0);
-
- while(*alet++) /* for all the letters */
- {
- if(!*alet) /* if end of letters? */
- flag = 1; /* word fails */
- else
- {
- atext++; /* next word char */
- if((*alet != *atext) && (*alet != '.')) /* if no match and not a spare */
- {
- wpos++; /* reset scan positions */
- atext = &a[wpos];
- alet = &letters[0];
- goto label1; /* sorry about this ! */
- }
- }
- }
- flag = 2; /* valid word */
- }
- label1: /* 'goto' label */
- ;
- }
-
- if(flag == 2) /* did word fail? */
- recordvalid(); /* no, record fact */
-
- }
-
-
- checkword() /* match a word to */
- /* available letters */
- {
- register char *atext = a, *alet = letters; /* Set vars & pointers */
-
- while (*atext) /* till the end of word */
- {
- alet = &letters[0]; /* reset to first char */
-
- while((*atext != *alet) && (flag == 0)) /* Find a matching letter */
- {
- alet++;
-
- if(!*alet) /* end of letters? */
- {
- if (sp >= 1) /* can we use a spare */
- {
- sp--;
- flag = 1; /* spare used */
- }
- else
- return(0); /* no spares, word fails */
- }
- }
- if(flag == 0) /* did we use a spare? */
- *alet = '+'; /* no, kill used letter */
- else
- flag = 0; /* yes, reset flag */
- atext++; /* move to next word char */
- }
- recordvalid();
-
- }
-
-
- recordvalid() /* record finding a valid word */
-
- {
- register short j = 0, h = 0;
-
- printf("%-15s", a); /* Valid word, print it */
- fprintf(output, "%-15s", a);
- cmatch++; /* 1 more word found */
- if ((cmatch % 5) == 0) /* end of line? */
- {
- puts(""); /* yes, print new line */
- fprintf(output, "\n");
- }
-
- j = strlen(a); /* length of word */
- if (j > 10) /* max length is 10 */
- j = 10;
- h = a[0] - 64; /* get initial letter */
-
- k[h] [j]++; /* init letter - count */
- k[h] [0]++; /* total of init letter */
- k[0] [j]++; /* total of length */
- return(0);
- }
-
-
- void countspares() /* scan letter list */
-
- {
- register char *tt = letters; /* pointer to letters */
- register short j = 0;
-
- while(*tt) /* scan the letters */
- {
- if ((!isalpha(*tt)) && (!matcher)) /* is char a real letter */
- {
- if ((*tt) == '.') /* only . is a spare */
- {
- spare++; /* no, it's a spare */
- puts("Spare located.");
- }
- }
- else
- {
- temp[j] = toupper(*tt); /* a letter, make it Ucase */
- j++;
- }
- tt++; /* next letter please */
- }
- strcpy(letters, temp); /* refresh letter list */
- if (!matcher) /* format output */
- {
- printf("Scanning %s ", letters);
- fprintf(output, "Scanning %s ", letters);
- printf("with %d spares.\n\n", spare);
- fprintf(output, "with %d spares.\n\n", spare);
- }
- else
- {
- printf("Searching for %s ", letters);
- fprintf(output, "Searching for %s ", letters);
- puts("\n\n");
- fprintf(output, "\n\n");
- }
- }
-
-
- void datatable()
-
- {
- register short j = 0, h = 0;
- char bar[80];
-
- strcpy(bar, " ------------------------------------------------------------------------");
-
- fprintf(output, " Letter | Total | 4 5 6 7 8 9 10+ Percent\n");
- fprintf(output,"%s\n", bar);
-
- for(j = 1; j <=26; j++) /* for A to Z */
- {
- if((k[j] [0] > 0) && (k[j] [0]<9999)) /* if a letter > 0 */
- {
- fprintf(output, " %c | %4d |", 'A' + j - 1, k[j] [0]);
-
- for(h = 4; h <=10; h++) /* report word lengths */
- {
- if((k[j] [h] > 0) && (k[j] [h]<9999)) /* if a score > 0 */
- fprintf(output, "%6d", k[j] [h]); /* print score */
- else
- fprintf(output, " -"); /* or use blanks */
- }
- percent = (float) (100.0 * k[j] [0] / cmatch); /* calc % found */
- fprintf(output, " | %5.2f%%", percent);
- fprintf(output, "\n");
- }
- }
-
- fprintf(output,"%s\n", bar);
- fprintf(output," Totals %4d |", cmatch);
-
- for(h = 4; h <=10; h++) /* report totals */
- {
- if((k[0] [h] > 0) && (k[0] [h]<9999)) /* if a score > 0 */
- fprintf(output, "%6d", k[0] [h]); /* print score */
- else
- fprintf(output, " -"); /* or use blanks */
- }
- fprintf(output, "\n Percent |");
-
- for(h = 4; h <=10; h++) /* report Percents */
- {
- if((k[0] [h] > 0) && (k[0] [h]<9999)) /* if a score > 0 */
- {
- percent = (float) (100.0 * k[0] [h] / cmatch); /* calc % found */
- fprintf(output, " %5.1f", percent); /* print score */
- }
- else
- fprintf(output, " -"); /* or use blanks */
- }
- fprintf(output, "\n\n\n\n");
-
- }
-
-
- void main(argc, argv)
- int argc;
- char *argv[];
-
- {
- register char c;
-
- while (--argc && (*++argv)[0] == '-') /* find a - switch */
- while (c = *++argv[0])
- switch (tolower(c)) /* ensure lower case */
- {
- case '4': /* set limit values */
- limit = 4;
- break;
-
- case '5':
- limit = 5;
- break;
-
- case '6':
- limit = 6;
- break;
-
- case '7':
- limit = 7;
- break;
-
- case '8':
- limit = 8;
- break;
-
- case '9':
- limit = 9;
- break;
-
- case 'l':
- limit = 10;
- break;
-
- case 'm':
- matcher = 1; /* Matcher on */
- break;
-
- case 'z':
- newfile = 1; /* erase old valid */
- break;
-
- default:
- printf("\nError: unknown flag\n"); /* unknown switch */
- break;
- }
- if (argc != 1 || **argv == '?') /* did we get a letter list? */
- puts("USAGE: READER [-m] [-4 to -9/-l] [-z] letterlist\n"); /* how to use it */
- else
- {
- input = fopen("ram:wordall.dat", "r"); /* open the data file */
- if (!input) /* not found in ram: */
- {
- input = fopen("wordlist:wordall.dat", "r"); /* look on disk */
- if (!input) /* abort if not found */
- {
- printf("\nData file not found!!\n\n"); /* say so */
- return(0);
- }
- }
- if (newfile == 1)
- output = fopen("Vld:valid", "w"); /* open the output file */
- else
- output = fopen("Vld:valid", "a"); /* append the output file */
-
- printf("\n\33[33mREADER V1.0 ©3iff 6/91.\33[31m \n\n"); /* Title */
- fprintf(output, " READER V1.0 ©3iff 6/91.\n\n");
- strcpy(letters, *argv); /* Store letters */
- letlen = strlen(letters); /* how many letters? */
- countspares(); /* search for spares */
-
- strcpy(saveletters, letters); /* save the clean list */
-
- do
- {
- strcpy(a, '\0'); /* clear the string */
- fscanf(input, "%20s", a); /* and read a word */
- wl = strlen(a); /* how long is it? */
- if (wl != 0) /* any characters in it? */
- {
- if(((limit <= 9) && (wl == limit)) || ((limit == 10) && (wl >= 10)) || limit == 99)
- {
- count++; /* count as a word checked */
- sp = spare; /* refresh spares count */
- if (matcher == 1)
- matchword(); /* do match check */
- else
- checkword(); /* do check make */
-
- strcpy(letters, saveletters); /* restore letter list */
- }
- }
- } while ( wl != 0 ); /* till the end if the file */
-
- percent = (float) (100.0 * cmatch / count); /* calc % found */
-
- printf("\n\n %d valid words found", cmatch); /* final report */
- printf(" of %d words checked. %5.2f%% success rate.\n ", count, percent);
- fprintf(output, "\n\n %d Valid words found", cmatch);
- fprintf(output, " of %d words checked. %5.2f%% success rate.\n\n", count, percent);
-
- datatable(); /* output data table */
-
- fclose(input); /* close the files */
- fclose(output);
- }
-
- }
-
-
-