private Address getCUString(String indent, StringBuffer buf, CodeUnit cu) {
		Address min = cu.getMinAddress();
		Address max = cu.getMaxAddress();
		String addrRangeStr = min + ((min.equals(max)) ? "" : " - " + max);
		String cuRep;
		if (cu instanceof Data data) {
			cuRep = data.getDataType().getPathName();
		}
		else if (cu instanceof Instruction) {
			Instruction inst = (Instruction) cu;
			boolean removedFallThrough =
				inst.isFallThroughOverridden() && (inst.getFallThrough() == null);
			boolean hasFlowOverride = inst.getFlowOverride() != FlowOverride.NONE;
			boolean hasLengthOverride = inst.isLengthOverridden();
			cuRep = cu.toString();
			if (removedFallThrough) {
				cuRep += newLine + indent + getSpaces(addrRangeStr.length()) + "    " +
					"Removed FallThrough";
			}
			else if (inst.isFallThroughOverridden()) {
				// Show the fallthrough override.
				Address fallThroughAddress = inst.getFallThrough();
				Reference[] refs = inst.getReferencesFrom();
				for (Reference ref : refs) {
					if (ref.getReferenceType().isFallthrough()) {
						Address toAddress = ref.getToAddress();
						boolean isOverride = SystemUtilities.isEqual(fallThroughAddress, toAddress);
						String prefix =
							isOverride ? "FallThrough Override: " : "FallThrough Reference: ";
						cuRep += newLine + indent + getSpaces(addrRangeStr.length()) + "    " +
							prefix + DiffUtility.getUserToAddressString(inst.getProgram(), ref);
					}
				}
			}
			if (hasFlowOverride) {
				cuRep += newLine + indent + getSpaces(addrRangeStr.length()) + "    " +
					"Flow Override: " + inst.getFlowOverride();
			}
			if (hasLengthOverride) {
				cuRep += newLine + indent + getSpaces(addrRangeStr.length()) + "    " +
					"Length Override: " + inst.getLength() + " (actual length is " +
					inst.getParsedLength() + ")";
			}
			cuRep += newLine + indent + getSpaces(addrRangeStr.length()) + "    " +
				"Instruction Prototype hash = " +
				Integer.toHexString(inst.getPrototype().hashCode());
		}
		else {
			cuRep = cu.toString();
		}
		buf.append(indent + addrRangeStr + "    " + cuRep + newLine);

		if (cu instanceof Data data) {
			// NOTE: Diff operates on the outmost code-unit only and not data components
			String[] settingNames = data.getNames();
			if (settingNames.length != 0) {
				Map<String, SettingsDefinition> defMap = new HashMap<>();
				for (SettingsDefinition settingsDef : data.getDataType().getSettingsDefinitions()) {
					defMap.put(settingsDef.getStorageKey(), settingsDef);
				}
				buf.append(indent + indent + "Data Settings: ");
				int count = 0;
				Arrays.sort(settingNames);
				for (String settingName : settingNames) {
					Object value = data.getValue(settingName);
					SettingsDefinition def = defMap.get(settingName);
					if (def != null) {
						settingName = def.getName();
					}
					if (value instanceof Long && def instanceof EnumSettingsDefinition eDef) {
						value = eDef.getValueString(data);
					}
					if (count++ != 0) {
						buf.append(", ");
					}
					buf.append(settingName + "=" + value);
				}
				buf.append(newLine);
			}
		}
		return min;
	}
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