home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
400-499
/
ff432.lzh
/
Reader
/
Reader.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-01-12
|
12KB
|
352 lines
/*==================================*/
/* */
/* 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);
}
}