예제 #1
0
        /*
         * 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;
		}