private StringDataInstance findNext() {
		forceAlignment();
		while (!addrs.isEmpty()) {
			if (monitor.isCancelled()) {
				return null;
			}

			if (!findStartOfString()) {
				break;
			}

			monitor.setProgress(origAddrCount - addrs.getNumAddresses());

			Address addr = addrs.getMinAddress();
			Data undefData = listing.getDataAt(addr);
			if (undefData == null) {
				break;
			}
			Address eos = findEndOfString();
			if (monitor.isCancelled()) {
				return null;
			}

			addrs.deleteFromMin(eos);
			long length = eos.subtract(addr) + 1;
			if (length < charSize || length > MAX_SANE_STRING_LENGTH) {
				// throw away, try next string
				continue;
			}

			StringDataInstance sdi =
				stringDataType.getStringDataInstance(undefData, stringSettings, (int) length);
			return sdi;

		}
		return null;
	}
Creates a new UndefinedStringIterator instance.

@param program {@link Program}
@param addrs set of {@link Address}es to search.
@param charSize size of the characters (and the null-terminator) that make up the string
@param charAlignment alignment requirements for the start of the string 
@param breakOnRef boolean flag, if true strings will be terminated early at locations that
have an in-bound memory reference
@param singleStringMode boolean flag, if true only one string will be returned, and it must
be located at the start of the specified address set (after alignment tweaks)
@param stringDataType a string data type that corresponds to the type of string being
searched for
@param stringSettings {@link Settings} for the string data type
@param monitor {@link TaskMonitor}
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/strings/UndefinedStringIterator.java