Пример #1
0
        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;
        }
Пример #2
0
        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;
        }