private String getCodeUnitInfo(Listing listing, Address addr, String indent) {
		String newIndent = indent + indent1;
		CodeUnit cu = (addr != null) ? listing.getCodeUnitContaining(addr) : null;
		if (cu == null) {
			return indent + "No instruction or data." + newLine;
		}
		StringBuffer buf = new StringBuffer();
		Address maxAddress = maxP1Address;
		if (listing == l2) {
			maxAddress = SimpleDiffUtility.getCompatibleAddress(p1, maxP1Address, p2);
		}
		int maxVisibleLines = 100;
		int linesSoFar = 0;
		while ((cu != null) && (maxAddress != null) &&
			(cu.getMinAddress().compareTo(maxAddress) <= 0) && (linesSoFar < maxVisibleLines)) {
			Address min = getCUString(indent, buf, cu);
			if (cu instanceof Data) {
				Data data = (Data) cu;
				DataType dt = data.getDataType();
				if (dt instanceof Composite) {
					DataTypeComponent[] components = ((Composite) dt).getComponents();
					for (DataTypeComponent dtc : components) {
						int offset = dtc.getOffset();
						String comment = dtc.getComment();
						String fieldName = dtc.getFieldName();
						if (fieldName == null) {
							fieldName = "field" + offset;
						}
						buf.append(newIndent + min.add(offset) + " " + dtc.getFieldName() + " " +
							dtc.getDataType().getName() + " " + "length=" + dtc.getLength() + " " +
							((comment != null) ? comment : "") + " " + newLine);
					}
				}
			}
			cu = listing.getCodeUnitAfter(cu.getMaxAddress());
			linesSoFar++;
		}
		if (linesSoFar >= maxVisibleLines) {
			buf.append(newIndent + "... Too many code unit lines for display, so truncating at " +
				maxVisibleLines + " lines." + newLine);
		}
		return buf.toString();
	}
Gets a string indicating the label name and its attributes.
@param symbol the symbol to get the name and attributes for.
@param nameLength the length of the name field.
@param typeLength the length of the type field.
@param sourceLength the length of the source field.
Ghidra/Features/Base/src/main/java/ghidra/program/util/ProgramDiffDetails.java