private void processSegmentHeaders(BinaryReader reader, OmfFileHeader header, Program program,
			TaskMonitor monitor, MessageLog log) throws AddressOverflowException, IOException {
		monitor.setMessage("Process segments...");

		final Language language = program.getLanguage();

		List<OmfSegmentHeader> segments = header.getSegments();
		for (OmfSegmentHeader segment : segments) {
			if (monitor.isCancelled()) {
				break;
			}

			Address segmentAddr = segment.getAddress(language);
			final long segmentSize = segment.getSegmentLength();

			if (segmentSize == 0) {
				continue;
			}

			if (segment.hasNonZeroData()) {
				MemoryBlockUtils.createInitializedBlock(program, false, segment.getName(),
					segmentAddr, segment.getRawDataStream(reader, log), segmentSize, "", "",
					segment.isReadable(), segment.isWritable(), segment.isExecutable(), log,
					monitor);

			}
			else {
				MemoryBlockUtils.createUninitializedBlock(program, false, segment.getName(),
					segmentAddr, segmentSize, "", "", segment.isReadable(), segment.isWritable(),
					segment.isExecutable(), log);
			}
		}
	}
Run through the OMF segments an produce Ghidra memory blocks.
Most segments cause an initialized block to be created, but if a segment
consists only of a string of zero bytes, as described by a compact LIDATA record,
an uninitialized block is created.
@param reader is a reader for the underlying file
@param header is the OMF file header
@param program is the Program
@param monitor is checked for cancellation
@param log receives error messages
@throws AddressOverflowException if the underlying data stream causes an address to wrap
@throws IOException for problems accessing the OMF file through the reader
Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/OmfLoader.java