X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=correct.c;h=3a4f5c029cf55e125120e067c676881b8a24f0d8;hb=41a01c08e11b098eff3d226e8f9a490c0e102fcb;hp=0c1fc88a348c87f656d3ec145a1beb18cefcb101;hpb=7ef051f58a723e48b8d2ca597697e0c7a1ddd209;p=xonotic%2Fgmqcc.git diff --git a/correct.c b/correct.c index 0c1fc88..3a4f5c0 100644 --- a/correct.c +++ b/correct.c @@ -94,39 +94,6 @@ static int correct_update(ht *table, const char *word) { */ static const char correct_alpha[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; -static char *correct_strndup(const char *src, size_t n) { - char *ret; - size_t len = strlen(src); - - if (n < len) - len = n; - - if (!(ret = (char*)mem_a(len + 1))) - return NULL; - - ret[len] = '\0'; - return (char*)memcpy(ret, src, len); -} - -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); - - if (str2 && next) - mem_d(str2); - - return ret; -} - /* * correcting logic for the following forms of transformations: * 1) deletion @@ -139,11 +106,10 @@ static size_t correct_deletion(const char *ident, char **array, size_t index) { size_t len = strlen(ident); for (itr = 0; itr < len; itr++) { - array[index + itr] = correct_concat ( - correct_strndup (ident, itr), - correct_strndup (ident+itr+1, len-(itr+1)), - true - ); + char *a = (char*)mem_a(len+1); + memcpy(a, ident, itr); + memcpy(a + itr, ident + itr + 1, len - itr); + array[index + itr] = a; } return itr; @@ -154,19 +120,13 @@ static size_t correct_transposition(const char *ident, char **array, size_t inde size_t len = strlen(ident); for (itr = 0; itr < len - 1; itr++) { - array[index + itr] = correct_concat ( - correct_concat ( - correct_strndup(ident, itr), - correct_strndup(ident+itr+1, 1), - true - ), - correct_concat ( - correct_strndup(ident+itr, 1), - correct_strndup(ident+itr+2, len-(itr+2)), - true - ), - true - ); + char tmp; + char *a = (char*)mem_a(len+1); + memcpy(a, ident, len+1); + tmp = a[itr]; + a[itr ] = a[itr+1]; + a[itr+1] = tmp; + array[index + itr] = a; } return itr; @@ -177,23 +137,13 @@ static size_t correct_alteration(const char *ident, char **array, size_t index) size_t jtr; size_t ktr; size_t len = strlen(ident); - char cct[2] = { 0, 0 }; /* char code table, for concatenation */ for (itr = 0, ktr = 0; itr < len; itr++) { - for (jtr = 0; jtr < sizeof(correct_alpha); jtr++, ktr++) { - *cct = correct_alpha[jtr]; - array[index + ktr] = correct_concat ( - correct_concat ( - correct_strndup(ident, itr), - (char *) &cct, - false - ), - correct_strndup ( - ident + (itr+1), - len - (itr+1) - ), - true - ); + for (jtr = 0; jtr < sizeof(correct_alpha)-1; jtr++, ktr++) { + char *a = (char*)mem_a(len+1); + memcpy(a, ident, len+1); + a[itr] = correct_alpha[jtr]; + array[index + ktr] = a; } } @@ -205,23 +155,14 @@ static size_t correct_insertion(const char *ident, char **array, size_t index) { size_t jtr; size_t ktr; size_t len = strlen(ident); - char cct[2] = { 0, 0 }; /* char code table, for concatenation */ for (itr = 0, ktr = 0; itr <= len; itr++) { - for (jtr = 0; jtr < sizeof(correct_alpha); jtr++, ktr++) { - *cct = correct_alpha[jtr]; - array[index + ktr] = correct_concat ( - correct_concat ( - correct_strndup (ident, itr), - (char *) &cct, - false - ), - correct_strndup ( - ident+itr, - len - itr - ), - true - ); + for (jtr = 0; jtr < sizeof(correct_alpha)-1; jtr++, ktr++) { + char *a = (char*)mem_a(len+2); + memcpy(a, ident, itr); + a[itr] = correct_alpha[jtr]; + memcpy(a + itr + 1, ident + itr, len - itr + 1); + array[index + ktr] = a; } } @@ -237,7 +178,7 @@ static GMQCC_INLINE size_t correct_size(const char *ident) { */ 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)-1)) + ((len + 1) * (sizeof(correct_alpha)-1)); } static char **correct_edit(const char *ident) { @@ -342,7 +283,7 @@ void correct_add(ht table, size_t ***size, const char *ident) { } } -char *correct_correct(ht table, const char *ident) { +char *correct_str(ht table, const char *ident) { char **e1; char **e2; char *e1ident; @@ -356,11 +297,11 @@ char *correct_correct(ht table, const char *ident) { 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); return found; @@ -368,8 +309,10 @@ char *correct_correct(ht table, const char *ident) { } 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); @@ -385,37 +328,3 @@ void correct_del(ht dictonary, size_t **data) { 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: hellobain\n"); - printf(" 2: ellor\n"); - printf(" 3: world\n"); - - char *b = correct_correct(t, "rld"); - char *a = correct_correct(t, "ello"); - char *c = correct_correct(t, "helbain"); - - printf("invalid identifier: `%s` (did you mean: `%s`?)\n", "ello", a); - printf("invalid identifier: `%s` (did you mean: `%s`?)\n", "rld", b); - printf("invalid identifier: `%s` (did you mean: `%s`?)\n", "helbain", c); - - correct_del(t, d); - mem_d(b); - mem_d(a); - mem_d(c); - - /*util_meminfo();*/ - -}