private boolean convertToFormatArguments(String formatString,
			List<FormatArgument> formatArgumentList, boolean isOutputType) {

		FormatParsingData data = new FormatParsingData();
		for (int i = 0; i < formatString.length(); i++) {
			char c = formatString.charAt(i);
			i = preprocessChar(formatString, i, isOutputType);
			if (i == -1) {
				return false;
			}
			if (isFlag(c)) {
				continue;
			}
			if (data.getLengthModifier() != null) {
				return addArgumentWithModifier(c, data, formatArgumentList);
			}
			data.setLengthModifier(detectLengthModifier(c));
			if (data.getLengthModifier() == null) {
				data.setConversionSpecifier(detectConversionSpecifier(c));
				if (data.getConversionSpecifier() != null) {
					if (!verifyConversionPair(data.getLengthModifier(),
						data.getConversionSpecifier())) {
						return false;
					}
					formatArgumentList.add(new FormatArgument(data.getLengthModifier(),
						data.getConversionSpecifier()));
					return true;
				}
				// If length modifier and conversion specs aren't present
				// and we get an unknown char, format string is invalid
				if (data.isPrecisionComplete()) {
					return false;
				}
				if (!Character.isDigit(c) && c != '.' && c != '*') {
					return false;
				}
				if (isOutputType) {
					// At this point c is either a number, '*', or '.'
					i = handleOutputConversionArgument(formatString, i, data, formatArgumentList);
					if (i == -1) {
						return false;
					}
				}
				else {
					i = handleInputConversionArgument(formatString, i, data, formatArgumentList);
					if (i == -1) {
						return false;
					}
				}
			}
			else if (i + 1 < formatString.length()) {
				i = initiateLengthModifierExtension(formatString, i, data);
			}
		}
		return true;
	}
Takes in a single String from parseFormatString's output List and converts it to
the corresponding FormatArgument(s) and populates the formatArgumentList List.
isOutputType is true when using a format string for a function that "outputs"
Strings (e.g., printf, fprintf, etc.). When it's false, it evaluates the
String's data types as if the function "inputs" Strings (e.g., scanf)

@param formatString       Format String
@param formatArgumentList   List of FormatArgument that will be written to
@param isOutputType Type of variadic function
@return True if format string successfully parsed
Ghidra/Features/DecompilerDependent/src/main/java/ghidra/app/plugin/core/string/variadic/FormatStringParser.java