* alpha character.
*/
static const char correct_alpha[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_";
-static char *correct_substr(const char *str, size_t off, size_t lim) {
- char *nstr;
- size_t slen = strlen(str);
- /* lots of compares */
- if ((lim > slen) || ((off + lim) > slen) || (slen < 1) || (!lim))
- return NULL;
+static char *correct_strndup(const char *src, size_t n) {
+ char *ret;
+ size_t len = strlen(src);
- if (!(nstr = mem_a(lim + 1)))
- return NULL;
+ if (n < len)
+ len = n;
- strncpy(nstr, str+off, lim);
- nstr[lim] = '\0';
+ if (!(ret = (char*)mem_a(len + 1)))
+ return NULL;
- return nstr;
+ ret[len] = '\0';
+ return (char*)memcpy(ret, src, len);
}
-static char *correct_concat(char *str1, char *str2) {
- if (!str1) str1 = mem_a(1), *str1 = '\0';
- if (!str2) str2 = mem_a(1), *str2 = '\0';
+static char *correct_concat(char *str1, char *str2, bool next) {
+ char *ret = NULL;
+
+#if 0
+ if (!str1) {
+ str1 = mem_a(1);
+ *str1 = '\0';
+ }
+#endif
+
+ str1 = mem_r (str1, strlen(str1) + strlen(str2) + 1);
+ ret = strcat(str1, str2);
- str1 = mem_r(str1, strlen(str1) + strlen(str2) + 1);
- strcat(str1, str2);
+ if (str2 && next)
+ mem_d(str2);
- return str1;
+ return ret;
}
/*
for (itr = 0; itr < len; itr++) {
array[index + itr] = correct_concat (
- correct_substr (ident, 0, itr),
- correct_substr (ident, itr+1, len-(itr+1))
+ correct_strndup (ident, itr),
+ correct_strndup (ident+itr+1, len-(itr+1)),
+ true
);
}
for (itr = 0; itr < len - 1; itr++) {
array[index + itr] = correct_concat (
correct_concat (
- correct_substr(ident, 0, itr),
- correct_substr(ident, itr+1, 1)
+ correct_strndup(ident, itr),
+ correct_strndup(ident+itr+1, 1),
+ true
),
correct_concat (
- correct_substr(ident, itr, 1),
- correct_substr(ident, itr+2, len-(itr+2))
- )
+ correct_strndup(ident+itr, 1),
+ correct_strndup(ident+itr+2, len-(itr+2)),
+ true
+ ),
+ true
);
}
*cct = correct_alpha[jtr];
array[index + ktr] = correct_concat (
correct_concat (
- correct_substr(ident, 0, itr),
- (char *) &cct
+ correct_strndup(ident, itr),
+ (char *) &cct,
+ false
+ ),
+ correct_strndup (
+ ident + (itr+1),
+ len - (itr+1)
),
- correct_substr (
- ident,
- itr + 1,
- len - (itr + 1)
- )
+ true
);
}
}
*cct = correct_alpha[jtr];
array[index + ktr] = correct_concat (
correct_concat (
- correct_substr (ident, 0, itr),
- (char *) &cct
+ correct_strndup (ident, itr),
+ (char *) &cct,
+ false
),
- correct_substr (
- ident,
- itr,
+ correct_strndup (
+ ident+itr,
len - itr
- )
+ ),
+ true
);
}
}
*/
register size_t len = strlen(ident);
- return (len) + (len - 1) + (len * sizeof(correct_alpha)) + (len + 1) * sizeof(correct_alpha);
+ return (len) + (len - 1) + (len * sizeof(correct_alpha)) + ((len + 1) * sizeof(correct_alpha));
}
static char **correct_edit(const char *ident) {
size_t next;
- char **find = mem_a(correct_size(ident) * sizeof(char*));
+ char **find = (char**)mem_a(correct_size(ident) * sizeof(char*));
if (!find)
return NULL;
if (correct_find(table, end[jtr]) && !correct_exist(res, len, end[jtr])) {
res = mem_r(res, sizeof(char*) * (len + 1));
res[len++] = end[jtr];
+ } else {
+ mem_d(end[jtr]);
}
}
+
+ mem_d(end);
}
*next = len;
size_t itr;
for (itr = 0; itr < rows; itr++)
mem_d(array[itr]);
+
+ mem_d(array);
}
/*
}
}
-char *correct_correct(ht table, const char *ident) {
+char *correct_str(ht table, const char *ident) {
char **e1;
char **e2;
char *e1ident;
char *e2ident;
char *found = util_strdup(ident);
- size_t e1rows;
- size_t e2rows;
+ size_t e1rows = 0;
+ size_t e2rows = 0;
/* needs to be allocated for free later */
if (correct_find(table, ident))
return found;
- mem_d(found);
if ((e1rows = correct_size(ident))) {
e1 = correct_edit(ident);
if ((e1ident = correct_maximum(table, e1, e1rows))) {
+ mem_d(found);
found = util_strdup(e1ident);
correct_cleanup(e1, e1rows);
- mem_d(e1);
return found;
}
}
e2 = correct_known(table, e1, e1rows, &e2rows);
- if (e2rows && ((e2ident = correct_maximum(table, e2, e2rows))))
+ if (e2rows && ((e2ident = correct_maximum(table, e2, e2rows)))) {
+ mem_d(found);
found = util_strdup(e2ident);
+ }
correct_cleanup(e1, e1rows);
correct_cleanup(e2, e2rows);
-
- mem_d(e1);
- mem_d(e2);
return found;
}
vec_free(data);
util_htdel(dictonary);
}
-
-int main() {
- opts.debug = true;
- opts.memchk = true;
- con_init();
-
- ht t = util_htnew(1024);
- size_t **d = NULL;
-
- correct_add(t, &d, "hellobain");
- correct_add(t, &d, "ellor");
- correct_add(t, &d, "world");
-
- printf("found identifiers: (2)\n");
- printf(" 1: hello\n");
- printf(" 2: world\n");
-
- char *b = correct_correct(t, "rld");
- char *a = correct_correct(t, "ello");
-
- printf("%s, did you mean `%s` ?\n", "ello", a);
- printf("%s, did you mean `%s` ?\n", "rld", b);
-
- correct_del(t, d);
- mem_d(b);
- mem_d(a);
-
- util_meminfo();
-
-}