private void InitializeBodyTag() { if (this.bodyTagInfo != null) { return; } int num = 0; uint num2 = 0U; int num3 = 0; int startWordIndex = base.StartWordIndex; int endWordIndex = base.EndWordIndex; for (int i = startWordIndex; i < endWordIndex; i++) { uint num4; if (BodyFragmentInfo.IsUsefulWord(base.BodyScanner.Words[i], out num4)) { int num5 = num % 32; if (num5 == 0) { num2 ^= num4; } else { num2 ^= (num4 << num5) + (num4 >> 32 - num5); } num++; } } if (base.StartLineIndex < base.EndLineIndex) { num3 = BodyFragmentInfo.GetFormatCrc(base.BodyScanner.FormatStore, base.BodyScanner.Lines[base.StartLineIndex].Node); if (base.BodyScanner.Words.Count > 0 && startWordIndex < base.BodyScanner.Words.Count) { num3 ^= BodyFragmentInfo.GetInlineObjectCount(base.BodyScanner.FormatStore.GetTextRun(base.BodyScanner.Lines[base.StartLineIndex].TextPosition), (base.EndLineIndex == base.BodyScanner.Lines.Count) ? null : new TextRun?(base.BodyScanner.FormatStore.GetTextRun(base.BodyScanner.Lines[base.EndLineIndex].TextPosition))); } } this.bodyTagInfo = new BodyTagInfo(num, (int)num2, num3); }
private BodyFragmentInfo GetParentBodyPart(BodyTagInfo parentBodyTagInfo) { if (parentBodyTagInfo.WordCount == 0 && parentBodyTagInfo.FormatCrc == 0) { return new BodyFragmentInfo(base.BodyScanner, base.EndLineIndex, base.EndLineIndex); } int i = base.EndLineIndex; int num = base.EndLineIndex; int num2 = base.GetFirstWordIndex(i); int num3 = num2; int num4 = 0; uint num5 = 0U; while (num3 >= base.StartWordIndex && i >= base.StartLineIndex) { if (num4 == parentBodyTagInfo.WordCount && num5 == (uint)parentBodyTagInfo.WordCrc) { while (i > 0) { int num6 = base.GetFirstWordIndex(i - 1); uint num7 = 0U; while (num6 < num2 && !BodyFragmentInfo.IsUsefulWord(base.BodyScanner.Words[num6], out num7)) { num6++; } if (num6 != num2) { break; } i--; num2 = base.GetFirstWordIndex(i); } FragmentInfo.TrimBoundary(base.BodyScanner, ref i, ref num); return new BodyFragmentInfo(base.BodyScanner, i, num); } if (num4 <= parentBodyTagInfo.WordCount) { if (i == 0) { break; } int j = base.GetFirstWordIndex(--i); while (j < num2) { if (base.StartWordIndex >= num2) { break; } uint num8 = 0U; num2--; if (BodyFragmentInfo.IsUsefulWord(base.BodyScanner.Words[num2], out num8)) { num4++; num5 = (num5 << 1) + (num5 >> 31); num5 ^= num8; } } } else if (num4 > parentBodyTagInfo.WordCount) { int k = base.GetFirstWordIndex(--num); while (k < num3) { num3--; uint num9; if (BodyFragmentInfo.IsUsefulWord(base.BodyScanner.Words[num3], out num9)) { num4--; int num10 = num4 % 32; if (num10 == 0) { num5 ^= num9; } else { num5 ^= (num9 << num10) + (num9 >> 32 - num10); } } } } } return null; }