@Override
	public boolean applyTo(Program program, Address address, DemanglerOptions options,
			TaskMonitor monitor) throws Exception {
		if (isAlreadyDemangled(program, address)) {
			return true;
		}

		if (!super.applyTo(program, address, options, monitor)) {
			return false;
		}

		Symbol s = applyDemangledName(address, true, false, program);
		if (s == null) {
			return false;
		}

		if (address.isExternalAddress()) {
			Msg.warn(this,
				"Unable to fully apply external demangled Address Table: " + s.getName(true));
			return true;
		}

		Listing listing = program.getListing();
		if (program.getMemory().isExternalBlockAddress(address)) {
			Msg.warn(this, "Unable to fully apply external demangled Address Table at " + address +
				": " + s.getName(true));
			listing.setComment(address, CommentType.EOL,
				"WARNING: Unable to apply demangled Address Table");
			return true; // don't complain
		}

		if (calculateLength) {
			// determine length of address table
			Data d = listing.getDefinedDataAt(address);
			if (d != null && Undefined.isUndefinedArray(d.getDataType())) {
				// use length of Undefined array at start of table to indicate length
				length = d.getLength();
			}
			else {
				length = guessTableLength(program, address);
				if (length <= 0) {
					return false;
				}
			}
			calculateLength = false;
		}

		if (isUndefinedInRange(program, address, address.add(length - 1))) {
			long count = length / program.getDefaultPointerSize();
			createPointers(program, address, (int) count);
		}

		return true;
	}
Returns the length of the address table.
-1 indicates the length is unknown.
@return the length of the address table
Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledAddressTable.java