private Symbol createTypeinfoSymbolFromNonMangledString(Address typeinfoAddress)
			throws DuplicateNameException, InvalidInputException, CancelledException {

		Address typeinfoNameAddress = getTypeinfoNameAddress(typeinfoAddress);

		if (typeinfoNameAddress == null) {
			Msg.debug(this,
				"Could not get typeinfo-name address from " + typeinfoAddress.toString());
			return null;
		}

		String typeinfoNameString = getStringFromMemory(typeinfoNameAddress);

		if (typeinfoNameString == null) {
			Msg.debug(this, "Could not get typeinfo string from " + typeinfoNameAddress.toString());
			return null;
		}

		// get length from start of string
		String lenString = getAsciiLengthString(typeinfoNameString);
		if (lenString.isEmpty()) {
			Msg.debug(this,
				"Could not get typeinfo-name string len from " + typeinfoNameAddress.toString());
			return null;
		}

		// convert lenString to int len
		try {
			int len = Integer.parseInt(lenString);

			// get className from string - if not exactly the correct len then return null
			String className = typeinfoNameString.substring(lenString.length());
			if (className.length() != len) {
				Msg.debug(this, "Expected typeinfo-name to be len " + len + " but it was " +
					className.length());
				return null;
			}

			program.getListing()
					.clearCodeUnits(typeinfoNameAddress,
						typeinfoNameAddress.add(typeinfoNameString.length()), true);
			boolean created = createString(typeinfoNameAddress, typeinfoNameString.length());
			if (!created) {
				Msg.debug(this, "Could not create string at " + typeinfoNameAddress);
			}

			// create typeinfo name symbol
			Namespace classNamespace =
				symbolTable.getOrCreateNameSpace(globalNamespace, className, SourceType.ANALYSIS);
			Symbol typeinfoNameSymbol = symbolTable.createLabel(typeinfoNameAddress,
				"typeinfo-name", classNamespace, SourceType.ANALYSIS);
			typeinfoNameSymbol.setPrimary();

			// create the new typeinfo symbol in the demangled namespace
			Symbol typeinfoSymbol = symbolTable.createLabel(typeinfoAddress, "typeinfo",
				classNamespace, SourceType.ANALYSIS);
			typeinfoSymbol.setPrimary();

			api.setPlateComment(typeinfoAddress, "typeinfo for " + classNamespace.getName(true));

			return typeinfoSymbol;
		}
		catch (NumberFormatException ex) {
			return null;
		}
	}
Method to determine if the given address has one of the ClassTypeinfoDataType
types applied

@param address the given address
@return true if already has a class data type applied or false if not
Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java