예제 #1
0
        public ArrayList DifferenceReport()
        {
            ArrayList retval = new ArrayList();
            int       dcount = _destination.Count();
            int       scount = _source.Count();

            // Deal with the special case of empty files
            if (dcount == 0)
            {
                if (scount > 0)
                {
                    retval.Add(DifferenceResultSpan.CreateDeleteSource(0, scount));
                }

                return(retval);
            }
            else
            {
                if (scount == 0)
                {
                    retval.Add(DifferenceResultSpan.CreateAddDestination(0, dcount));
                    return(retval);
                }
            }

            _matchList.Sort();
            int curDest               = 0;
            int curSource             = 0;
            DifferenceResultSpan last = null;

            // Process each match record
            foreach (DifferenceResultSpan drs in _matchList)
            {
                if ((!AddChanges(retval, curDest, drs.DestIndex, curSource, drs.SourceIndex)) &&
                    (last != null))
                {
                    last.AddLength(drs.Length);
                }
                else
                {
                    retval.Add(drs);
                }

                curDest   = drs.DestIndex + drs.Length;
                curSource = drs.SourceIndex + drs.Length;
                last      = drs;
            }

            // Process any tail end data
            AddChanges(retval, curDest, dcount, curSource, scount);

            return(retval);
        }
예제 #2
0
        private bool AddChanges(ArrayList report, int curDest, int nextDest, int curSource, int nextSource)
        {
            bool retval     = false;
            int  diffDest   = nextDest - curDest;
            int  diffSource = nextSource - curSource;

            if (diffDest > 0)
            {
                if (diffSource > 0)
                {
                    int minDiff = Math.Min(diffDest, diffSource);
                    report.Add(DifferenceResultSpan.CreateReplace(curDest, curSource, minDiff));
                    if (diffDest > diffSource)
                    {
                        curDest += minDiff;
                        report.Add(DifferenceResultSpan.CreateAddDestination(curDest, diffDest - diffSource));
                    }
                    else
                    {
                        if (diffSource > diffDest)
                        {
                            curSource += minDiff;
                            report.Add(DifferenceResultSpan.CreateDeleteSource(curSource, diffSource - diffDest));
                        }
                    }
                }
                else
                {
                    report.Add(DifferenceResultSpan.CreateAddDestination(curDest, diffDest));
                }

                retval = true;
            }
            else
            {
                if (diffSource > 0)
                {
                    report.Add(DifferenceResultSpan.CreateDeleteSource(curSource, diffSource));

                    retval = true;
                }
            }

            return(retval);
        }