changeset 1641:00cd99bedf06

Add missing files for the new frontend spell checker
author Kelly Wilson <wilsonk cpsc.ucalgary.ca>
date Mon, 08 Mar 2010 17:41:36 -0700
parents 9bf06e02070b
children f49cb50c6064
files dmd/speller.c dmd/speller.h
diffstat 2 files changed, 105 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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 <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#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
+}
--- /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);
+