public void FillMajorRecords( OverlayStream stream, int finalPos, int offset, RecordTypeConverter?recordTypeConverter, RecordTypeFillWrapper fill) { int?lastParsed = null; while (!stream.Complete && stream.Position < finalPos) { MajorRecordHeader majorMeta = stream.GetMajorRecord(); var minimumFinalPos = stream.Position + majorMeta.TotalLength; var parsed = fill( stream: stream, finalPos: finalPos, offset: offset, type: majorMeta.RecordType, lastParsed: lastParsed, recordTypeConverter: recordTypeConverter); if (parsed.Failed) { break; } if (minimumFinalPos > stream.Position) { stream.Position = checked ((int)minimumFinalPos); } lastParsed = parsed.Value; } }
public void FillMajorRecords( OverlayStream stream, int finalPos, int offset, RecordTypeConverter?recordTypeConverter, RecordTypeFillWrapper fill) { int?lastParsed = null; Dictionary <RecordType, int>?recordParseCount = null; while (!stream.Complete && stream.Position < finalPos) { MajorRecordHeader majorMeta = stream.GetMajorRecord(); var minimumFinalPos = stream.Position + majorMeta.TotalLength; var parsed = fill( stream: stream, finalPos: finalPos, offset: offset, recordParseCount: recordParseCount, type: majorMeta.RecordType, lastParsed: lastParsed, recordTypeConverter: recordTypeConverter); if (!parsed.KeepParsing) { break; } if (parsed.DuplicateParseMarker != null) { if (recordParseCount == null) { recordParseCount = new Dictionary <RecordType, int>(); } recordParseCount[parsed.DuplicateParseMarker !.Value] = recordParseCount.GetOrAdd(parsed.DuplicateParseMarker !.Value) + 1;
public void FillGroupRecordsForWrapper( OverlayStream stream, int finalPos, int offset, RecordTypeConverter?recordTypeConverter, RecordTypeFillWrapper fill) { int?lastParsed = null; while (!stream.Complete && stream.Position < finalPos) { if (!stream.TryGetGroup(out var groupMeta)) { throw new DataMisalignedException(); } var subStream = new OverlayStream(stream.RemainingMemory.Slice(0, finalPos - stream.Position), stream.MetaData); var parsed = fill( stream: subStream, finalPos: subStream.Length, offset: 0, // unused type: groupMeta.RecordType, lastParsed: lastParsed, recordTypeConverter: recordTypeConverter); stream.Position += subStream.Position; if (parsed.Failed) { break; } lastParsed = parsed.Value; } }