void MatchGraph::UNPAIR_ALL () { long u; for (v=1; v <= U; ++v) { if (BASE[(int)v] != v || LASTVTX[(int)v] == v) continue; nextu = v; NEXTVTX[(int)LASTVTX[(int)nextu]] = DUMMYVERTEX; while (1) { u = nextu; nextu = NEXTVTX[(int)nextu]; UNLINK (u); if (LASTVTX[(int)u] != u) { f = (LASTEDGE[2] == OPPEDGE(e)) ? LASTEDGE[1] : LASTEDGE[2]; NEXTVTX[(int)LASTVTX[(int)BEND(f)]] = u; } newbase = BMATE (BMATE(u)); if (newbase != DUMMYVERTEX && newbase != u) { LINK[(int)u] = -DUMMYEDGE; REMATCH (newbase, MATE[(int)u]); } while (LASTVTX[(int)nextu] == nextu && nextu != DUMMYVERTEX) nextu = NEXTVTX[(int)nextu]; if (LASTVTX[(int)nextu] == nextu && nextu == DUMMYVERTEX) break; } } }
void MatchGraph::UNPAIR (long oldbase, long oldmate) { long e, newbase, u; #ifdef DEBUG printf("Unpair oldbase, oldmate=%d %d\n",oldbase, oldmate); #endif UNLINK (oldbase); newbase = BMATE (oldmate); if (newbase != oldbase) { LINK [(int)oldbase] = -DUMMYEDGE; REMATCH (newbase, MATE[(int)oldbase]); if (f == LASTEDGE[1]) LINK[(int)secondmate] = -LASTEDGE[2]; else LINK[(int)secondmate] = -LASTEDGE[1]; } e = LINK[(int)oldmate]; u = BEND (OPPEDGE (e)); if (u == newbase) { POINTER (newbase, oldmate, e); return; } LINK[BMATE (u)] = -e; do { e = -LINK[(int)u]; v = BMATE (u); POINTER (u, v, -LINK[(int)v]); u = BEND (e); } while (u != newbase); e = OPPEDGE (e); POINTER (newbase, oldmate, e); }
/* * Copy @-group */ static void copy_at_group(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) { const rchar *source = *source_; rchar *target = *target_; *target++ = U('@'); *target_ = target; #define REMATCH(what) ( \ source = *source_, \ target = *target_, \ IMATCH(what, &source, &target, ctx) \ ) #define CMATCH(what) IMATCH(what, &source, &target, ctx) if (( !CMATCH(media) && !REMATCH(supports) && !REMATCH(document) && !REMATCH(keyframes) && !(REMATCH(vendor_webkit) && CMATCH(keyframes)) && !(REMATCH(vendor_moz) && CMATCH(keyframes)) && !(REMATCH(vendor_o) && CMATCH(keyframes)) && !(REMATCH(vendor_ms) && CMATCH(keyframes))) || !(source < ctx->sentinel && target < ctx->tsentinel) || RCSSMIN_IS_NMCHAR(*source)) ABORT; #undef CMATCH #undef REMATCH ++ctx->at_group; *target_ = target; *source_ = source; }