diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2016-12-11 20:16:33 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2016-12-11 20:16:33 +0200 |
commit | 7a7d021de54fbb1561367b1155bc1320a21d003d (patch) | |
tree | 16480af6d5e76d2feb39b9c1ddcb23893b6972bd | |
parent | 0dd8054d05d8286f2f7cbcf85456c6953a9b6146 (diff) | |
download | gawk-7a7d021de54fbb1561367b1155bc1320a21d003d.tar.gz |
Update dfa.
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | dfa.c | 46 |
2 files changed, 24 insertions, 26 deletions
@@ -1,3 +1,7 @@ +2016-12-11 Arnold D. Robbins <arnold@skeeve.com> + + * dfa.c: Sync with GNULIB. + 2016-11-30 Arnold D. Robbins <arnold@skeeve.com> * dfa.c: Sync with fixes in GNULIB. @@ -2850,39 +2850,33 @@ realloc_trans_if_necessary (struct dfa *d, state_num new_state) static state_num build_state (state_num s, struct dfa *d, unsigned char uc) { - state_num *trans; /* The new transition table. */ - state_num i, maxstate; + /* A pointer to the new transition table, and the table itself. */ + state_num **ptrans = (ACCEPTING (s, *d) ? d->fails : d->trans) + s; + state_num *trans = *ptrans; - if (d->fails[s] != NULL) - trans = d->fails[s]; - else + if (!trans) { - state_num **ptrans = (ACCEPTING (s, *d) ? d->fails : d->trans) + s; - if (!*ptrans) + /* MAX_TRCOUNT is an arbitrary upper limit on the number of + transition tables that can exist at once, other than for + initial states. Often-used transition tables are quickly + rebuilt, whereas rarely-used ones are cleared away. */ + if (MAX_TRCOUNT <= d->trcount) { - /* MAX_TRCOUNT is an arbitrary upper limit on the number of - transition tables that can exist at once, other than for - initial states. Often-used transition tables are quickly - rebuilt, whereas rarely-used ones are cleared away. */ - if (MAX_TRCOUNT <= d->trcount) + for (state_num i = d->min_trcount; i < d->tralloc; i++) { - for (i = d->min_trcount; i < d->tralloc; i++) - { - free (d->trans[i]); - free (d->fails[i]); - d->trans[i] = d->fails[i] = NULL; - } - d->trcount = 0; + free (d->trans[i]); + free (d->fails[i]); + d->trans[i] = d->fails[i] = NULL; } - - d->trcount++; - *ptrans = xmalloc (NOTCHAR * sizeof *trans); + d->trcount = 0; } - trans = *ptrans; + + d->trcount++; + *ptrans = trans = xmalloc (NOTCHAR * sizeof *trans); /* Fill transition table with a default value which means that the transited state has not been calculated yet. */ - for (i = 0; i < NOTCHAR; i++) + for (int i = 0; i < NOTCHAR; i++) trans[i] = -2; } @@ -2900,8 +2894,8 @@ build_state (state_num s, struct dfa *d, unsigned char uc) /* Now go through the new transition table, and make sure that the trans and fail arrays are allocated large enough to hold a pointer for the largest state mentioned in the table. */ - maxstate = -1; - for (i = 0; i < NOTCHAR; ++i) + state_num maxstate = -1; + for (int i = 0; i < NOTCHAR; i++) if (maxstate < trans[i]) maxstate = trans[i]; realloc_trans_if_necessary (d, maxstate); |