private void processC13FileRecords(ModuleInformation moduleInfo,
			FileChecksumsC13Section fileChecksumsC13Section, AbstractLinesC13Section c13Lines,
			boolean isIlLines)
			throws CancelledException {

		// Something else to look into: ModuleInformation600 version has more fields that we do
		//  not know their usefulness at this time.  These are:
		// String moduleName = moduleInfo.getModuleName();
		// String objectFileName = moduleInfo.getObjectFileName();
		List<C13FileRecord> fileRecords = c13Lines.getFileRecords();

		long offCon = c13Lines.getOffCon();
		int segCon = c13Lines.getSegCon();
		// Currently not using getFlags() and getLenCon()
		for (C13FileRecord fileRecord : fileRecords) {
			pdb.checkCancelled();
			int fileId = fileRecord.getFileId();
			SourceFile sourceFile = getSourceFile(fileChecksumsC13Section, fileId);

			// Everything we've see to this point shows that the address come in an increasing,
			//  but non-strictly increasing order.  Also, there is not a field to designate the
			//  number of bytes of memory that pertain to each line record, but everything we've
			//  seen seems to indicate that we can do the difference between the record addresses
			//  to get the length needed.  However, the last record doesn't have a "next" record
			//  to do the difference with, but that is where function length comes into play.
			//  And if we work in reverse order (we do not care if the records are created and
			//  put into the DB in reverse order), then we can easily calculate the lengths.
			long lastValue = -1;
			Long numLines = fileRecord.getNLines();
			List<C13LineRecord> lineRecords = fileRecord.getLineRecords();
			for (int index = numLines.intValue() - 1; index >= 0; index--) {
				pdb.checkCancelled();
				C13LineRecord lineRecord = lineRecords.get(index);
				Long lineNumStart = lineRecord.getLineNumStart();
				// If we wanted the line end value, we could calculate it as:
				// Long lineNumEnd = lineNumStart + lineRecord.getDeltaLineEnd()
				long offset = lineRecord.getOffset();
				long actualOffset = offset + offCon;
				Address address = applicator.getAddress(segCon, actualOffset);
				if (lastValue == -1) {
					FunctionManager functionManager = program.getFunctionManager();
					Function function = functionManager.getFunctionContaining(address);
					if (function != null) {
						Address functionAddress = function.getEntryPoint();
						lastValue = functionLengthByAddress.getOrDefault(functionAddress, -1);
					}
					// If function was null, then lastValue stays -1 until overwritten
				}
				Long length = lastValue - offset;
				// TODO: remove  next line once we initialize an appropriate lastValue
				length = Long.max(length, 0); // last record gets length zero if lastValue was -1
				lastValue = offset;

				// Note: we are not currently using boolean isStatement = lineRecord.isStatement()

				// Note: we are not using this call, but users might be interested in the fact of
				// 0xfeefee and 0xf00f00.
				// lineRecord.isSpecialLine();

				// TODO: There might be something we can do with the boolean isIlLines
				//  Seems that the pdb.xml is not necessarily doing anything different

				applyRecord(sourceFile, address, lineNumStart.intValue(),
					length.intValue());

				// Note: We are not processing column records, but they are available.
			}
		}
	}
Process all Module line information
@param monitor the task monitor
@throws CancelledException upon user cancellation
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/PdbSourceLinesApplicator.java