private void InitializeUniquePart(int lastUniqueWordIndex, bool fullParentMatched) { this.lastUniqueWord = ((lastUniqueWordIndex < this.childBodyFragment.EndWordIndex) ? lastUniqueWordIndex : (this.childBodyFragment.EndWordIndex - 1)); int lastNormalFragmentIndex = BodyDiffer.GetLastNormalFragmentIndex(this.childBodyFragment, lastUniqueWordIndex); int num = (this.ChildScanner.Fragments.Count > lastNormalFragmentIndex + 1) ? ((int)this.ChildScanner.Fragments[lastNormalFragmentIndex + 1].FirstLine) : this.childBodyFragment.EndLineIndex; num = ((num >= this.childBodyFragment.EndLineIndex) ? this.childBodyFragment.EndLineIndex : num); int startLineIndex = this.childBodyFragment.StartLineIndex; FragmentInfo.TrimBoundary(this.ChildScanner, ref startLineIndex, ref num); if (fullParentMatched) { for (int i = this.childBodyFragment.StartLineIndex; i < num; i++) { if ((ulong)this.ChildScanner.Lines[i].FirstWordIndex > (ulong)((long)this.lastUniqueWord)) { num = i; FragmentInfo.TrimBoundary(this.ChildScanner, ref startLineIndex, ref num); if (num > 0 && this.ChildScanner.Lines[num - 1].Category == ConversationBodyScanner.Scanner.LineCategory.PotentialNonMsHeader) { num--; } } } } this.uniqueBodyPart = new FragmentInfo(this.ChildScanner, startLineIndex, num); }
private void WordByWordDiff() { if (this.parentBodyFragment.StartWordIndex == this.parentBodyFragment.EndWordIndex) { this.uniqueBodyPart = this.childBodyFragment.Trim(); return; } if (this.childBodyFragment.IsEmpty) { return; } int lastNormalFragmentIndex = BodyDiffer.GetLastNormalFragmentIndex(this.parentBodyFragment, this.parentBodyFragment.EndWordIndex); int lastNormalFragmentIndex2 = BodyDiffer.GetLastNormalFragmentIndex(this.childBodyFragment, this.childBodyFragment.EndWordIndex); int num = this.childBodyFragment.StartWordIndex; int num2 = this.parentBodyFragment.StartWordIndex; int disclaimerWordStart = this.childBodyFragment.EndWordIndex; if (lastNormalFragmentIndex < this.ParentScanner.Fragments.Count && lastNormalFragmentIndex2 < this.ChildScanner.Fragments.Count && this.ParentScanner.Fragments[lastNormalFragmentIndex].FirstWord < this.parentBodyFragment.EndWordIndex && this.ChildScanner.Fragments[lastNormalFragmentIndex2].FirstWord < this.childBodyFragment.EndWordIndex) { num = this.ChildScanner.Fragments[lastNormalFragmentIndex2].FirstWord; num2 = this.ParentScanner.Fragments[lastNormalFragmentIndex].FirstWord; while (num < this.childBodyFragment.EndWordIndex && num2 < this.parentBodyFragment.EndWordIndex && this.MatchWord(ref num, ref num2, true, 0)) { num++; num2++; } } if (num2 != this.parentBodyFragment.EndWordIndex) { num = this.childBodyFragment.EndWordIndex - 1; num2 = this.parentBodyFragment.EndWordIndex - 1; } else { disclaimerWordStart = num; num = this.ChildScanner.Fragments[lastNormalFragmentIndex2].FirstWord - 1; num2 = this.ParentScanner.Fragments[lastNormalFragmentIndex].FirstWord - 1; } while (num >= this.childBodyFragment.StartWordIndex && num2 >= this.parentBodyFragment.StartWordIndex && this.MatchWord(ref num, ref num2, false, 0)) { num--; num2--; } this.InitializeUniquePart(num, num2 < 0); this.InitializeDisclaimerPart(disclaimerWordStart); if (this.uniqueBodyPart.IsEmpty && !this.disclaimerPart.IsEmpty) { this.uniqueBodyPart = this.disclaimerPart; this.disclaimerPart = FragmentInfo.Empty; } }