# HG changeset patch # User Kelly Wilson # Date 1268095296 25200 # Node ID 00cd99bedf067e74948b322b2aaf0473a5055451 # Parent 9bf06e02070b30d60f4246df568f18f12de53b47 Add missing files for the new frontend spell checker diff -r 9bf06e02070b -r 00cd99bedf06 dmd/speller.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmd/speller.c Mon Mar 08 17:41:36 2010 -0700 @@ -0,0 +1,98 @@ + +#include +#include +#include + +#include "speller.h" + +const char idchars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"; + +/************************************************** + * Looks for correct spelling. + * Currently only looks a 'distance' of one from the seed[]. + * This does an exhaustive search, so can potentially be very slow. + * Input: + *seedwrongly spelled word + *fpsearch function + *fpargargument to search function + *charsetcharacter set + * Returns: + *NULLno correct spellings found + *void*value returned by fp() for first possible correct spelling + */ + +void *speller(const char *seed, fp_speller_t fp, void *fparg, const char *charset) +{ + size_t seedlen = strlen(seed); + if (!seedlen) + return NULL; + + char *buf = (char *)alloca(seedlen + 2);// leave space for extra char + if (!buf) + return NULL;// no matches + + /* Deletions */ + memcpy(buf, seed + 1, seedlen); + for (int i = 0; i < seedlen; i++) + { + //printf("del buf = '%s'\n", buf); + void *p = (*fp)(fparg, buf); + if (p) + return p; + + buf[i] = seed[i]; + } + + /* Transpositions */ + memcpy(buf, seed, seedlen + 1); + for (int i = 0; i + 1 < seedlen; i++) + { + // swap [i] and [i + 1] + buf[i] = seed[i + 1]; + buf[i + 1] = seed[i]; + + //printf("tra buf = '%s'\n", buf); + void *p = (*fp)(fparg, buf); + if (p) + return p; + + buf[i] = seed[i]; + } + + if (charset && *charset) + { + /* Substitutions */ + memcpy(buf, seed, seedlen + 1); + for (int i = 0; i < seedlen; i++) + { + for (const char *s = charset; *s; s++) + { + buf[i] = *s; + + //printf("sub buf = '%s'\n", buf); + void *p = (*fp)(fparg, buf); + if (p) + return p; + } + buf[i] = seed[i]; + } + + /* Insertions */ + memcpy(buf + 1, seed, seedlen + 1); + for (int i = 0; i <= seedlen; i++)// yes, do seedlen+1 iterations + { + for (const char *s = charset; *s; s++) + { + buf[i] = *s; + + //printf("ins buf = '%s'\n", buf); + void *p = (*fp)(fparg, buf); + if (p) + return p; + } + buf[i] = seed[i];// going past end of seed[] is ok, as we hit the 0 + } + } + + return NULL;// didn't find any corrections +} diff -r 9bf06e02070b -r 00cd99bedf06 dmd/speller.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmd/speller.h Mon Mar 08 17:41:36 2010 -0700 @@ -0,0 +1,7 @@ + +typedef void *(fp_speller_t)(void *, const char *); + +extern const char idchars[]; + +void *speller(const char *seed, fp_speller_t fp, void *fparg, const char *charset); +