mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-02-22 19:31:03 +00:00
don't call correct_edit anew for each scope
This commit is contained in:
parent
6b0a522bb9
commit
10c7f4f838
3 changed files with 41 additions and 14 deletions
37
correct.c
37
correct.c
|
@ -179,7 +179,6 @@ static GMQCC_INLINE void correct_pool_delete(void) {
|
||||||
|
|
||||||
static GMQCC_INLINE char *correct_pool_claim(const char *data) {
|
static GMQCC_INLINE char *correct_pool_claim(const char *data) {
|
||||||
char *claim = util_strdup(data);
|
char *claim = util_strdup(data);
|
||||||
correct_pool_delete();
|
|
||||||
return claim;
|
return claim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,7 +468,7 @@ static GMQCC_INLINE char **correct_known_resize(char **res, size_t *allocated, s
|
||||||
return out;
|
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 itr = 0;
|
||||||
size_t jtr = 0;
|
size_t jtr = 0;
|
||||||
size_t len = 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;
|
char **end = NULL;
|
||||||
|
|
||||||
for (; itr < rows; itr++) {
|
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]);
|
row = correct_size(array[itr]);
|
||||||
|
|
||||||
/* removing jtr=0 here speeds it up by 100ms O_o */
|
|
||||||
for (jtr = 0; jtr < row; jtr++) {
|
for (jtr = 0; jtr < row; jtr++) {
|
||||||
if (correct_find(table, end[jtr]) && !correct_exist(res, len, end[jtr])) {
|
if (correct_find(table, end[jtr]) && !correct_exist(res, len, end[jtr])) {
|
||||||
res = correct_known_resize(res, &nxt, len+1);
|
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
|
* takes a table for the dictonary a vector of sizes (used for internal
|
||||||
* probability calculation), and an identifier to "correct".
|
* 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 **e1 = NULL;
|
||||||
char **e2 = NULL;
|
char **e2 = NULL;
|
||||||
char *e1ident = NULL;
|
char *e1ident = NULL;
|
||||||
|
@ -524,24 +539,26 @@ char *correct_str(correct_trie_t* table, const char *ident) {
|
||||||
size_t e1rows = 0;
|
size_t e1rows = 0;
|
||||||
size_t e2rows = 0;
|
size_t e2rows = 0;
|
||||||
|
|
||||||
correct_pool_new();
|
|
||||||
|
|
||||||
/* needs to be allocated for free later */
|
/* needs to be allocated for free later */
|
||||||
if (correct_find(table, ident))
|
if (correct_find(table, ident))
|
||||||
return correct_pool_claim(ident);
|
return correct_pool_claim(ident);
|
||||||
|
|
||||||
if ((e1rows = correct_size(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)))
|
if ((e1ident = correct_maximum(table, e1, e1rows)))
|
||||||
return correct_pool_claim(e1ident);
|
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))))
|
if (e2rows && ((e2ident = correct_maximum(table, e2, e2rows))))
|
||||||
return correct_pool_claim(e2ident);
|
return correct_pool_claim(e2ident);
|
||||||
|
|
||||||
|
|
||||||
correct_pool_delete();
|
|
||||||
return util_strdup(ident);
|
return util_strdup(ident);
|
||||||
}
|
}
|
||||||
|
|
12
gmqcc.h
12
gmqcc.h
|
@ -433,9 +433,15 @@ GMQCC_INLINE FILE *file_open (const char *, const char *);
|
||||||
/*===================================================================*/
|
/*===================================================================*/
|
||||||
/*=========================== correct.c =============================*/
|
/*=========================== correct.c =============================*/
|
||||||
/*===================================================================*/
|
/*===================================================================*/
|
||||||
void correct_del(correct_trie_t*, size_t **);
|
typedef struct {
|
||||||
void correct_add(correct_trie_t*, size_t ***, const char *);
|
char ***edits;
|
||||||
char *correct_str(correct_trie_t*, /********/ const char *);
|
} 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 ================================*/
|
/*=========================== code.c ================================*/
|
||||||
|
|
6
parser.c
6
parser.c
|
@ -1644,8 +1644,11 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
|
||||||
* other things as well.
|
* other things as well.
|
||||||
*/
|
*/
|
||||||
if (OPTS_FLAG(ENHANCED_DIAGNOSTICS)) {
|
if (OPTS_FLAG(ENHANCED_DIAGNOSTICS)) {
|
||||||
|
correction_t corr;
|
||||||
|
correct_init(&corr);
|
||||||
|
|
||||||
for (i = 0; i < vec_size(parser->correct_variables); i++) {
|
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))) {
|
if (strcmp(correct, parser_tokval(parser))) {
|
||||||
break;
|
break;
|
||||||
} else if (correct) {
|
} else if (correct) {
|
||||||
|
@ -1653,6 +1656,7 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
|
||||||
correct = NULL;
|
correct = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
correct_free(&corr);
|
||||||
|
|
||||||
if (correct) {
|
if (correct) {
|
||||||
parseerror(parser, "unexpected ident: %s (did you mean %s?)", parser_tokval(parser), correct);
|
parseerror(parser, "unexpected ident: %s (did you mean %s?)", parser_tokval(parser), correct);
|
||||||
|
|
Loading…
Reference in a new issue