diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2007-12-18 11:23:11 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2007-12-18 11:23:11 (GMT) |
commit | fdc0ebcebdabf8d44d0fb97275444ef980028f66 (patch) | |
tree | 136091002ef147caa5d9a01bf9cc8ea9be25baf5 /generic/regc_color.c | |
parent | a5dd9045b97811ec0ab14334094c710878cd6083 (diff) | |
download | tcl-fdc0ebcebdabf8d44d0fb97275444ef980028f66.zip tcl-fdc0ebcebdabf8d44d0fb97275444ef980028f66.tar.gz tcl-fdc0ebcebdabf8d44d0fb97275444ef980028f66.tar.bz2 |
Fixes for problems created when processing regular expressions that
generate very large automata. An enormous number of thanks to Will
Drewry <wad@google.com>, Tavis Ormandy <taviso@google.com>, and Tom
Lane <tgl@sss.pgh.pa.us> from the Postgresql crowd for their help in
tracking these problems down. [Bug 1810264]
Diffstat (limited to 'generic/regc_color.c')
-rw-r--r-- | generic/regc_color.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/generic/regc_color.c b/generic/regc_color.c index 5aed21c..f6716be 100644 --- a/generic/regc_color.c +++ b/generic/regc_color.c @@ -552,12 +552,9 @@ struct colormap *cm; scd->sub = NOSUB; while ((a = cd->arcs) != NULL) { assert(a->co == co); - /* uncolorchain(cm, a); */ - cd->arcs = a->colorchain; + uncolorchain(cm, a); a->co = sco; - /* colorchain(cm, a); */ - a->colorchain = scd->arcs; - scd->arcs = a; + colorchain(cm, a); } freecolor(cm, co); } else { @@ -586,7 +583,10 @@ struct arc *a; { struct colordesc *cd = &cm->cd[a->co]; + if (cd->arcs) + cd->arcs->colorchain_rev = a; a->colorchain = cd->arcs; + a->colorchain_rev = NULL; cd->arcs = a; } @@ -600,18 +600,19 @@ struct colormap *cm; struct arc *a; { struct colordesc *cd = &cm->cd[a->co]; - struct arc *aa; + struct arc *aa = a->colorchain_rev; - aa = cd->arcs; - if (aa == a) /* easy case */ + if (aa == NULL) { + assert(cd->arcs == a); cd->arcs = a->colorchain; - else { - for (; aa != NULL && aa->colorchain != a; aa = aa->colorchain) - continue; - assert(aa != NULL); + } else { + assert(aa->colorchain == a); aa->colorchain = a->colorchain; } - a->colorchain = NULL; /* paranoia */ + if (a->colorchain) + a->colorchain->colorchain_rev = aa; + a->colorchain = NULL; /* paranoia */ + a->colorchain_rev = NULL; } /* |