]> git.rm.cloudns.org Git - xonotic/gmqcc.git/commitdiff
don't call correct_edit anew for each scope
authorWolfgang Bumiller <blub@speed.at>
Wed, 9 Jan 2013 20:16:22 +0000 (21:16 +0100)
committerWolfgang Bumiller <blub@speed.at>
Wed, 9 Jan 2013 20:16:22 +0000 (21:16 +0100)
correct.c
gmqcc.h
parser.c

index cbd5baa1d1f6e52c52d3202ddce1133a5bca4fff..2062a150e261945e1071c03ffdba0dc338590f43 100644 (file)
--- a/correct.c
+++ b/correct.c
@@ -179,7 +179,6 @@ static GMQCC_INLINE void correct_pool_delete(void) {
 
 static GMQCC_INLINE char *correct_pool_claim(const char *data) {
     char *claim = util_strdup(data);
-    correct_pool_delete();
     return claim;
 }
 
@@ -469,7 +468,7 @@ static GMQCC_INLINE char **correct_known_resize(char **res, size_t *allocated, s
     return out;
 }
 
-static char **correct_known(correct_trie_t* table, char **array, size_t rows, size_t *next) {
+static char **correct_known(correction_t *corr, correct_trie_t* table, char **array, size_t rows, size_t *next) {
     size_t itr = 0;
     size_t jtr = 0;
     size_t len = 0;
@@ -479,10 +478,14 @@ static char **correct_known(correct_trie_t* table, char **array, size_t rows, si
     char **end = NULL;
 
     for (; itr < rows; itr++) {
-        end = correct_edit(array[itr]);
+        if (vec_size(corr->edits) > itr+1)
+            end = corr->edits[itr+1];
+        else {
+            end = correct_edit(array[itr]);
+            vec_push(corr->edits, end);
+        }
         row = correct_size(array[itr]);
 
-        /* removing jtr=0 here speeds it up by 100ms O_o */
         for (jtr = 0; jtr < row; jtr++) {
             if (correct_find(table, end[jtr]) && !correct_exist(res, len, end[jtr])) {
                 res        = correct_known_resize(res, &nxt, len+1);
@@ -516,7 +519,19 @@ static char *correct_maximum(correct_trie_t* table, char **array, size_t rows) {
  * takes a table for the dictonary a vector of sizes (used for internal
  * probability calculation), and an identifier to "correct".
  */
-char *correct_str(correct_trie_t* table, const char *ident) {
+void correct_init(correction_t *c)
+{
+    correct_pool_new();
+    c->edits = NULL;
+}
+
+void correct_free(correction_t *c)
+{
+    vec_free(c->edits);
+    correct_pool_delete();
+}
+
+char *correct_str(correction_t *corr, correct_trie_t* table, const char *ident) {
     char **e1      = NULL;
     char **e2      = NULL;
     char  *e1ident = NULL;
@@ -524,24 +539,26 @@ char *correct_str(correct_trie_t* table, const char *ident) {
     size_t e1rows  = 0;
     size_t e2rows  = 0;
 
-    correct_pool_new();
-
     /* needs to be allocated for free later */
     if (correct_find(table, ident))
         return correct_pool_claim(ident);
 
     if ((e1rows = correct_size(ident))) {
-        e1      = correct_edit(ident);
+        if (vec_size(corr->edits) > 0)
+            e1 = corr->edits[0];
+        else {
+            e1 = correct_edit(ident);
+            vec_push(corr->edits, e1);
+        }
 
         if ((e1ident = correct_maximum(table, e1, e1rows)))
             return correct_pool_claim(e1ident);
     }
 
-    e2 = correct_known(table, e1, e1rows, &e2rows);
+    e2 = correct_known(corr, table, e1, e1rows, &e2rows);
     if (e2rows && ((e2ident = correct_maximum(table, e2, e2rows))))
         return correct_pool_claim(e2ident);
 
 
-    correct_pool_delete();
     return util_strdup(ident);
 }
diff --git a/gmqcc.h b/gmqcc.h
index 28d7782d4993371a06e95a84e830c6796721f210..b9aca8378f44c8c29c78c3347fc04e5ebcf871be 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -433,9 +433,15 @@ GMQCC_INLINE FILE   *file_open   (const char *, const char *);
 /*===================================================================*/
 /*=========================== correct.c =============================*/
 /*===================================================================*/
-void  correct_del(correct_trie_t*, size_t **);
-void  correct_add(correct_trie_t*, size_t ***, const char *);
-char *correct_str(correct_trie_t*, /********/  const char *);
+typedef struct {
+    char ***edits;
+} correction_t;
+
+void  correct_del (correct_trie_t*, size_t **);
+void  correct_add (correct_trie_t*, size_t ***, const char *);
+char *correct_str (correction_t *, correct_trie_t*, const char *);
+void  correct_init(correction_t *);
+void  correct_free(correction_t *);
 
 /*===================================================================*/
 /*=========================== code.c ================================*/
index 6ba90cd50a4ec0280dfe83bf005e29930d7d81a7..3496437ad1e887ae440edf6e9ca701c156624d17 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -1644,8 +1644,11 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
                      * other things as well.
                      */
                     if (OPTS_FLAG(ENHANCED_DIAGNOSTICS)) {
+                        correction_t corr;
+                        correct_init(&corr);
+
                         for (i = 0; i < vec_size(parser->correct_variables); i++) {
-                            correct = correct_str(parser->correct_variables[i], parser_tokval(parser));
+                            correct = correct_str(&corr, parser->correct_variables[i], parser_tokval(parser));
                             if (strcmp(correct, parser_tokval(parser))) {
                                 break;
                             } else if (correct) {
@@ -1653,6 +1656,7 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
                                 correct = NULL;
                             }
                         }
+                        correct_free(&corr);
 
                         if (correct) {
                             parseerror(parser, "unexpected ident: %s (did you mean %s?)", parser_tokval(parser), correct);