Category : C Source Code
Archive   : MSPELL1_.ZIP
Filename : CHECK.C

 
Output of file : CHECK.C contained in archive : MSPELL1_.ZIP
/* CHECK: Dictionary scan module for MicroSPELL 1.0
Spell Checker and Corrector

(C)opyright May 1987 by Daniel Lawrence
All Rights Reserved

*/

#include
#include "dopt.h"
#include "dstruct.h"
#include "ddef.h"

check()

{
int i; /* index into the word list */

/* sort the source words */
if (swdebug)
printf("[%u words being checked...\n", numwords);
wordsort();
if (swdebug)
printf(" sorted...");

/* merge them against the uppercase part of the dictionary */
umerge();
if (swdebug)
printf("Uppercase checked\n");


/* lowercase the source word list */
wordlow();

/* resort them */
wordsort();
if (swdebug)
printf(" sorted...");

/* merge them against the rest the dictionary */
merge();
if (swdebug)
printf("lowercase checked\n");

/* sort them back into position order */
possort();
if (swdebug) {
printf(" sorted in position order...");
printf("%u mismatched words]\n", badwords);
}

/* dump the list to disk */
dumplist();

/* lastly, de-allocate the word list */
while (numwords > 0)
free(sword[--numwords]);
}

int merge() /* do a merge run against the main dictionary */

{
register int cindex; /* current word index */
register char *cword; /* ptr to current word */
register int cmp; /* result of current comparision */
register int mismatch; /* number of mismatched words */
char mword[NSTRING]; /* current dictionary word */

/* start with a LOW VALUES dictionary word */
mword[0] = 0;
mismatch = 0;

strcpy(mword, nxtmword());

for (cindex = 0; cindex < numwords; cindex++) {

/* get the current word */
cword = sword[cindex]->w_text;

/* scan the dictionary for a match */
cmp = strcmp(cword, mword);
while (cmp > 0) {
strcpy(mword, nxtmword());
cmp = strcmp(cword, mword);
}

/* if this word is not matched..... */
if (cmp != 0) {
if (mismatch == cindex)
++mismatch;
else {
sword[mismatch++] = sword[cindex];
sword[cindex] = NULL;
}
} else {
free(sword[cindex]);
sword[cindex] = NULL;
}
}
numwords = mismatch;
badwords += mismatch;
mclose();
}

/* do a merge run against the upper case entries in the main dictionary */

int umerge()

{
register int cindex; /* current word index */
register char *cword; /* ptr to current word */
register int cmp; /* result of current comparision */
register int mismatch; /* number of mismatched words */
char mword[NSTRING]; /* current dictionary word */

if (mopen() == FALSE)
exit(EXMDICT);

mword[0] = 0; /* start with a LOW VALUES dictionary word */
mismatch = 0;

strcpy(mword, nxtmword());

for (cindex = 0; cindex < numwords; cindex++) {

/* get the current word */
cword = sword[cindex]->w_text;

/* scan the dictionary for a match */
cmp = strcmp(cword, mword);
while (cmp > 0 && mword[0] != SEPCHAR) {
strcpy(mword, nxtmword());
cmp = strcmp(cword, mword);
}

/* if we reach the end of the capitals...stop */
if (mword[0] == SEPCHAR)
break;

/* if this word is not matched..... */
if (cmp != 0) {
if (mismatch == cindex)
++mismatch;
else {
sword[mismatch++] = sword[cindex];
sword[cindex] = NULL;
}
} else {
free(sword[cindex]);
sword[cindex] = NULL;
}
}

/* move the rest of the source words down in the list */
if (cindex < numwords && mismatch != cindex) {
for (; cindex < numwords; cindex++) {
sword[mismatch++] = sword[cindex];
sword[cindex] = NULL;
}
numwords = mismatch;
}

}

wordlow() /* lowercase all the words */

{
register cindex; /* index into the word list */
register char *ptr; /* ptr to current word */

for (cindex = 0; cindex < numwords; cindex++) {
ptr = sword[cindex]->w_text;
while (*ptr) {
if (isupper(*ptr))
*ptr += ('a' - 'A');
++ptr;
}
}
}

dumplist()

{
int i;

/* if there is a user dictionary, dump its name out */
if (*userlist)
if (swwords)
fprintf(outfile, "USER LIST: %s\n", userlist);
else
fprintf(outfile, "-3\n%s\n", userlist);

for (i = 0; i < numwords; i++) {

/* if we are in a new file... write a file header */
if (outnum != sword[i]->w_file) {
outnum = sword[i]->w_file;
if (swwords)
fprintf(outfile, "FILE: %s\n", splname[outnum]);
else
fprintf(outfile, "-1\n%s\n", splname[outnum]);
}

/* write the row and column number of the current word */
if (swwords)
fprintf(outfile, "%s\n", sword[i]->w_text);
else
fprintf(outfile, "%u\n%u\n",
sword[i]->w_line, sword[i]->w_col);
}
}


  3 Responses to “Category : C Source Code
Archive   : MSPELL1_.ZIP
Filename : CHECK.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/