private void FindMatchingBlocks(int startInOld, int endInOld, int startInNew, int endInNew, List <DiffMatch> matchingBlocks) { DiffMatch item = FindMatch(startInOld, endInOld, startInNew, endInNew); if (item != null) { if ((startInOld < item.StartInOld) && (startInNew < item.StartInNew)) { FindMatchingBlocks(startInOld, item.StartInOld, startInNew, item.StartInNew, matchingBlocks); } matchingBlocks.Add(item); if ((item.EndInOld < endInOld) && (item.EndInNew < endInNew)) { FindMatchingBlocks(item.EndInOld, endInOld, item.EndInNew, endInNew, matchingBlocks); } } }
private List <DiffOperation> Operations() { int startInOld = 0; int startInNew = 0; List <DiffOperation> list = new List <DiffOperation>(); List <DiffMatch> list2 = MatchingBlocks(); list2.Add(new DiffMatch(oldWords.Length, newWords.Length, 0)); for (int i = 0; i < list2.Count; i++) { DiffMatch match = list2[i]; bool flag = startInOld == match.StartInOld; bool flag2 = startInNew == match.StartInNew; DiffAction none = DiffAction.none; if (!flag && !flag2) { none = DiffAction.replace; } else if (flag && !flag2) { none = DiffAction.insert; } else if (!flag) { none = DiffAction.delete; } else { none = DiffAction.none; } if (none != DiffAction.none) { list.Add(new DiffOperation(none, startInOld, match.StartInOld, startInNew, match.StartInNew)); } if (match.Size != 0) { list.Add(new DiffOperation(DiffAction.equal, match.StartInOld, match.EndInOld, match.StartInNew, match.EndInNew)); } startInOld = match.EndInOld; startInNew = match.EndInNew; } return(list); }