/* * Perform a slightly crippled version of * Knuth-Pratt-Morris over MulticastDelegate chains. * Border values are set as pointers in kpm_next; * Generally, KPM border arrays are length n+1 for * strings of n. This one works with length n at the * expense of a few additional comparisions. */ private static MulticastDelegate KPM(MulticastDelegate needle, MulticastDelegate haystack, out MulticastDelegate tail) { MulticastDelegate nx, hx; // preprocess hx = needle; nx = needle.kpm_next = null; do { while ((nx != null) && (!nx.BaseEquals(hx))) { nx = nx.kpm_next; } hx = hx.prev; if (hx == null) { break; } nx = nx == null ? needle : nx.prev; if (hx.BaseEquals(nx)) { hx.kpm_next = nx.kpm_next; } else { hx.kpm_next = nx; } } while (true); // match MulticastDelegate match = haystack; nx = needle; hx = haystack; do { while (nx != null && !nx.BaseEquals(hx)) { nx = nx.kpm_next; match = match.prev; } nx = nx == null ? needle : nx.prev; if (nx == null) { // bingo tail = hx.prev; return(match); } hx = hx.prev; } while (hx != null); tail = null; return(null); }
private static MulticastDelegate KPM(MulticastDelegate needle, MulticastDelegate haystack, out MulticastDelegate tail) { MulticastDelegate multicastDelegate = needle; MulticastDelegate multicastDelegate2 = needle.kpm_next = null; for (;;) { while (multicastDelegate2 != null && !multicastDelegate2.BaseEquals(multicastDelegate)) { multicastDelegate2 = multicastDelegate2.kpm_next; } multicastDelegate = multicastDelegate.prev; if (multicastDelegate == null) { break; } multicastDelegate2 = ((multicastDelegate2 != null) ? multicastDelegate2.prev : needle); if (multicastDelegate.BaseEquals(multicastDelegate2)) { multicastDelegate.kpm_next = multicastDelegate2.kpm_next; } else { multicastDelegate.kpm_next = multicastDelegate2; } } MulticastDelegate multicastDelegate3 = haystack; multicastDelegate2 = needle; multicastDelegate = haystack; for (;;) { while (multicastDelegate2 != null && !multicastDelegate2.BaseEquals(multicastDelegate)) { multicastDelegate2 = multicastDelegate2.kpm_next; multicastDelegate3 = multicastDelegate3.prev; } multicastDelegate2 = ((multicastDelegate2 != null) ? multicastDelegate2.prev : needle); if (multicastDelegate2 == null) { break; } multicastDelegate = multicastDelegate.prev; if (multicastDelegate == null) { goto Block_8; } } tail = multicastDelegate.prev; return(multicastDelegate3); Block_8: tail = null; return(null); }
/* * Perform a slightly crippled version of * Knuth-Pratt-Morris over MulticastDelegate chains. * Border values are set as pointers in kpm_next; * Generally, KPM border arrays are length n+1 for * strings of n. This one works with length n at the * expense of a few additional comparisions. */ private static MulticastDelegate KPM (MulticastDelegate needle, MulticastDelegate haystack, out MulticastDelegate tail) { MulticastDelegate nx, hx; // preprocess hx = needle; nx = needle.kpm_next = null; do { while ((nx != null) && (!nx.BaseEquals (hx))) nx = nx.kpm_next; hx = hx.prev; if (hx == null) break; nx = nx == null ? needle : nx.prev; if (hx.BaseEquals (nx)) hx.kpm_next = nx.kpm_next; else hx.kpm_next = nx; } while (true); // match MulticastDelegate match = haystack; nx = needle; hx = haystack; do { while (nx != null && !nx.BaseEquals (hx)) { nx = nx.kpm_next; match = match.prev; } nx = nx == null ? needle : nx.prev; if (nx == null) { // bingo tail = hx.prev; return match; } hx = hx.prev; } while (hx != null); tail = null; return null; }