private static void SerialOffsetting(Span <byte> span, Int32 sizeChange, Int32 sizeChangeOffset) { Int32 exportsCount = DOLib.Int32FromSpanOffset(span, exportsCountOffset); Int32 exportsMapOffset = DOLib.Int32FromSpanOffset(span, exportsMapOffsetOffset); Int32 currentReferenceOffset = exportsMapOffset; bool applyOffsetChange = false; int processedReferences = 0; while (processedReferences < exportsCount) { if (!applyOffsetChange) { RelativeSizeChangeDirection direction = CheckOffsetAffected(span, sizeChangeOffset, currentReferenceOffset); if (direction == RelativeSizeChangeDirection.here) { ApplySerialSizeChange(span, sizeChange, currentReferenceOffset); applyOffsetChange = true; } if (direction == RelativeSizeChangeDirection.before) { ApplySerialOffsetChange(span, sizeChange, currentReferenceOffset); applyOffsetChange = true; } } else { ApplySerialOffsetChange(span, sizeChange, currentReferenceOffset); } currentReferenceOffset += exportReferenceSize; processedReferences++; } }
private static RelativeSizeChangeDirection CheckOffsetAffected(Span <byte> span, Int32 sizeChangeSerialOffset, Int32 referenceOffset) { Int32 serialOffset = DOLib.Int32FromSpanOffset(span, referenceOffset + relativeSerialOffsetOffset); if (serialOffset > sizeChangeSerialOffset) { return(RelativeSizeChangeDirection.before); } else if (serialOffset == sizeChangeSerialOffset) { return(RelativeSizeChangeDirection.here); } else /*if (serialOffset < sizeChangeSerialOffset)*/ return { (RelativeSizeChangeDirection.after); } }