private void addLocalVars(Function function, List<Variable> variables,
			boolean overwriteConflicts) throws InvalidInputException {
		for (Variable v : variables) {

			VariableUtilities.checkVariableConflict(function, v, v.getVariableStorage(),
				overwriteConflicts);

			try {
				String name = v.getName();
				boolean isDefaultVariableName = (name == null) ||
					SymbolUtilities.getDefaultLocalName(program, v.getStackOffset(), 0)
							.equals(name);

				SourceType sourceType =
					isDefaultVariableName ? SourceType.DEFAULT : SourceType.USER_DEFINED;

				function.addLocalVariable(v, sourceType);
			}
			catch (DuplicateNameException e) {
				log.appendMsg("Could not add local variable to function " + funcDesc(function) +
					": " + v.getName() + ": " + e.getMessage());
			}
		}
	}
Parses a list of {@link Function function} definitions from xml and creates then, adding them to the current
{@link Program program}.
<p>
Information from a TYPEINFO_COMMENT is used in preference to information from RETURN_TYPE and STACK_FRAME/STACK_VARs that
are tagged as parameters.
<p>
DTD for the FUNCTION element:
<pre><code>
&lt;!ELEMENT FUNCTION (RETURN_TYPE?, ADDRESS_RANGE*, REGULAR_CMT?, REPEATABLE_CMT?, TYPEINFO_CMT?, STACK_FRAME?, REGISTER_VAR*)&gt;
</code></pre>

@param parser the parser
@param overwriteConflicts true to overwrite any conflicts
@param ignoreStackFrames true to ignore stack frames
@param monitor the task monitor
@throws AddressFormatException if any address is not parsable 
@throws CancelledException if the operation is cancelled through the monitor
Ghidra/Features/Base/src/main/java/ghidra/app/util/xml/FunctionsXmlMgr.java