public static int Diff(Kowhai.Tree left, Kowhai.Tree right, Object onDiffParam, OnDiff onDiff) { int result; Kowhai.kowhai_tree_t l, r; GCHandle h1 = GCHandle.Alloc(left.Descriptor, GCHandleType.Pinned); l.desc = h1.AddrOfPinnedObject(); GCHandle h2 = GCHandle.Alloc(left.Data, GCHandleType.Pinned); l.data = h2.AddrOfPinnedObject(); GCHandle h3 = GCHandle.Alloc(right.Descriptor, GCHandleType.Pinned); r.desc = h3.AddrOfPinnedObject(); GCHandle h4 = GCHandle.Alloc(right.Data, GCHandleType.Pinned); r.data = h4.AddrOfPinnedObject(); kowhai_on_diff_t _onDiff = delegate(IntPtr param_, ref Kowhai.kowhai_node_t left_node, IntPtr left_data, ref Kowhai.kowhai_node_t right_node, IntPtr right_data, int index, int depth) { Kowhai.kowhai_symbol_t[] symbolPathLeft = null; int offsetLeft = 0; if (left_data.ToInt32() != 0) { result = _CreateSymbolPath(ref l, left_data, out symbolPathLeft); if (result != Kowhai.STATUS_OK) return result; offsetLeft = (int)(left_data.ToInt64() - l.data.ToInt64()); } Kowhai.kowhai_symbol_t[] symbolPathRight = null; int offsetRight = 0; if (right_data.ToInt32() != 0) { result = _CreateSymbolPath(ref r, right_data, out symbolPathRight); if (result != Kowhai.STATUS_OK) return result; offsetRight = (int)(right_data.ToInt64() - r.data.ToInt64()); } int size = 0; if (left_data.ToInt32() != 0) { size = Kowhai.kowhai_get_node_type_size(left_node.type); if (right_data.ToInt32() != 0) System.Diagnostics.Debug.Assert(left_node.type == right_node.type); } else if (right_data.ToInt32() != 0) size = Kowhai.kowhai_get_node_type_size(right_node.type); onDiff(onDiffParam, left, symbolPathLeft, offsetLeft, right, symbolPathRight, offsetRight, size); return Kowhai.STATUS_OK; }; result = kowhai_diff(ref l, ref r, IntPtr.Zero, _onDiff); h4.Free(); h3.Free(); h2.Free(); h1.Free(); return result; }
public static int Diff(Kowhai.Tree left, Kowhai.Tree right, Object onDiffParam, OnDiff onDiffLeft, OnDiff onDiffRight) { int result; Kowhai.kowhai_tree_t l, r; GCHandle h1 = GCHandle.Alloc(left.Descriptor, GCHandleType.Pinned); l.desc = h1.AddrOfPinnedObject(); GCHandle h2 = GCHandle.Alloc(left.Data, GCHandleType.Pinned); l.data = h2.AddrOfPinnedObject(); GCHandle h3 = GCHandle.Alloc(right.Descriptor, GCHandleType.Pinned); r.desc = h3.AddrOfPinnedObject(); GCHandle h4 = GCHandle.Alloc(right.Data, GCHandleType.Pinned); r.data = h4.AddrOfPinnedObject(); kowhai_on_diff_t _onDiff = delegate(IntPtr param_, ref Kowhai.kowhai_node_t left_node, IntPtr left_data, ref Kowhai.kowhai_node_t right_node, IntPtr right_data, int index, int depth) { Kowhai.kowhai_symbol_t[] symbolPath; if (onDiffLeft != null && left_data.ToInt32() != 0) { result = _CreateSymbolPath(ref l, left_data, out symbolPath); if (result == Kowhai.STATUS_OK) onDiffLeft(onDiffParam, left, symbolPath); } if (onDiffRight != null && right_data.ToInt32() != 0) { result = _CreateSymbolPath(ref r, right_data, out symbolPath); if (result == Kowhai.STATUS_OK) onDiffRight(onDiffParam, right, symbolPath); } return Kowhai.STATUS_OK; }; result = kowhai_diff(ref l, ref r, IntPtr.Zero, _onDiff); h4.Free(); h3.Free(); h2.Free(); h1.Free(); return result; }