diff options
Diffstat (limited to 'src/backend/regex/regc_color.c')
-rw-r--r-- | src/backend/regex/regc_color.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/src/backend/regex/regc_color.c b/src/backend/regex/regc_color.c index 268e072c599..87eb1e4958a 100644 --- a/src/backend/regex/regc_color.c +++ b/src/backend/regex/regc_color.c @@ -28,7 +28,7 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $PostgreSQL: pgsql/src/backend/regex/regc_color.c,v 1.7 2007/11/15 21:14:37 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/regex/regc_color.c,v 1.8 2008/01/03 20:47:55 tgl Exp $ * * * Note that there are some incestuous relationships between this code and @@ -569,12 +569,9 @@ okcolors(struct nfa * nfa, 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); } @@ -604,7 +601,10 @@ colorchain(struct colormap * cm, { struct colordesc *cd = &cm->cd[a->co]; + if (cd->arcs != NULL) + cd->arcs->colorchainRev = a; a->colorchain = cd->arcs; + a->colorchainRev = NULL; cd->arcs = a; } @@ -616,19 +616,22 @@ uncolorchain(struct colormap * cm, struct arc * a) { struct colordesc *cd = &cm->cd[a->co]; - struct arc *aa; + struct arc *aa = a->colorchainRev; - 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); + assert(aa->colorchain == a); aa->colorchain = a->colorchain; } + if (a->colorchain != NULL) + a->colorchain->colorchainRev = aa; a->colorchain = NULL; /* paranoia */ + a->colorchainRev = NULL; } /* |