public List<FormatArgument> convertToFormatArgumentList(String formatString,
			boolean isOutputType) {

		if (formatString == null) {
			return null;
		}
		List<String> formatStrArgumentList = parseFormatString(formatString);
		if (formatStrArgumentList == null) {
			return null;
		}
		List<FormatArgument> formatArgumentList = new ArrayList<>();
		for (String formatStrArgument : formatStrArgumentList) {
			boolean status =
				convertToFormatArguments(formatStrArgument, formatArgumentList, isOutputType);
			if (!status) {
				if (formatStrArgumentList.stream()
						.filter(str -> str.contains("$"))
						.findAny()
						.isPresent()) {
					return analyzeFormatStringWithParameters(formatString);
				}
				return null;
			}
		}
		return formatArgumentList.contains(null) ? null : formatArgumentList;
	}
Takes in a String and converts it to a List of FormatArgument with each FormatArgument
corresponding to an additional argument. isOutputType is true when using a
format string for output data types (e.g. printf, fprintf, etc.). When it's
false, it evaluates the String's data types as if they were input types (e.g.
scanf)

@param formatString format String
@param isOutputType Type of variadic function
@return List of FormatArgument
Ghidra/Features/DecompilerDependent/src/main/java/ghidra/app/plugin/core/string/variadic/FormatStringParser.java