private int searchWithNullModifier(String formatString, int i, FormatParsingData data,
			Map<Integer, FormatArgument> formatArgumentMap) {
		char c = formatString.charAt(i);
		data.setConversionSpecifier(detectConversionSpecifier(c));
		if (data.getConversionSpecifier() != null) {
			formatArgumentMap.put(data.getParameterIndex(),
				new FormatArgument(data.getLengthModifier(), data.getConversionSpecifier()));
			data.setInConversion(false);
		}
		else {
			if (data.isPrecisionComplete()) {
				return -1;
			}
			if (!Character.isDigit(c) && c != '.' && c != '*') {
				return -1;
			}
			// At this point c is either a number, '*', or '.'
			if (!data.isPrecisionComplete() && !data.isFieldWidthComplete() && c != '.') {
				i = handleOutputConversionForParameters(formatString, i, data, formatArgumentMap);
				if (i == -1) {
					return -1;
				}
			}
			else if (data.isFieldWidthComplete() && c != '.') {
				return -1;
			}
			else if (!data.isPrecisionComplete() && c == '.') {
				i = handlePrecisionForParameters(formatString, i, data, formatArgumentMap);
				if (i == -1) {
					return -1;
				}
			}
			else {
				return -1;
			}
		}
		return i;
	}
Handles format Strings with parameters. In this parser, we define a format
String parameter to be an integer n provided in the form: "%n$" or "*n$", where n is
the index of the referred argument. If a placeholder uses a format
argument parameter, all other placeholders must also have a parameter. Also,
all gaps between format argument indices are not supported. For instance, if
the first and third arguments are used, there must also be a parameter for a
second argument. Any parameter pattern beginning with % or * and ending with
$ must have integer in between. Failing to adhere by the format string
parameter requirements returns null.

@param formatString format String
@return List of FormatArgument


        TODO: What if multiple conversion specs refer to the same placeholder
        with different types? Ex: "%1$*1$x" (uses unsigned int and int)
        Currently just overwrites previous type
Ghidra/Features/DecompilerDependent/src/main/java/ghidra/app/plugin/core/string/variadic/FormatStringParser.java