@Override
	public void run(TaskMonitor monitor) {

		FileDataTypeManager fileDtMgr = null;
		if (dataFile != null) {
			try {
				if ((languageId != null) != (compilerSpecId != null)) {
					Msg.showError(this, plugin.getDialog().getComponent(), "Archive Failure",
						"Language/CompilerSpec improperly specified: " + languageId + "/" +
							compilerSpecId);
					return;
				}
				fileDtMgr =
						FileDataTypeManager.createFileArchive(dataFile, languageId, compilerSpecId);
			}
			catch (IOException e) {
				Msg.showError(this, plugin.getDialog().getComponent(), "Archive Failure",
					"Failed to create archive datatype manager: " + e.getMessage());
				return;
			}
		}

		DataTypeManager dtMgr = fileDtMgr != null ? fileDtMgr : dataTypeManager;

		int initialDtCount = dtMgr.getDataTypeCount(true);

		try {

			CParseResults results = plugin.parse(filenames, includePaths, options, dtMgr, monitor);
			if (results == null) {
				return; // cancelled
			}

			if (fileDtMgr != null && dtMgr.getDataTypeCount(true) != 0) {
				// If archive created - save to file
				try {
					fileDtMgr.save();
				}
				catch (DuplicateFileException e) {
					Msg.showError(this, plugin.getDialog().getComponent(),
						"C-Parse Error During Save",
						e.getMessage());
				}
				catch (Exception e) {
					Msg.showError(this, plugin.getDialog().getComponent(),
						"C-Parse Error During Save",
						"Could not save to file " + dataFile.getPath(), e);
				}
			}

			String msg = getResultMessage(dtMgr, initialDtCount);

			SwingUtilities.invokeLater(() -> {
				if (!results.successful()) {
					MultiLineMessageDialog.showModalMessageDialog(
						plugin.getDialog().getComponent(), "C-Parse Failed",
						"Failed to parse header file(s) to " + getParseDestination(dtMgr),
						plugin.getFormattedParseMessage(msg),
						MultiLineMessageDialog.INFORMATION_MESSAGE);
				}
				else {
					MultiLineMessageDialog.showModalMessageDialog(
						plugin.getDialog().getComponent(),
						"C-Parse Completed",
						"Successfully parsed header file(s) to " + getParseDestination(dtMgr),
						plugin.getFormattedParseMessage(msg),
						MultiLineMessageDialog.INFORMATION_MESSAGE);
				}
			});
		}
		catch (ghidra.app.util.cparser.C.ParseException e) {
			final String errMsg = getResultMessage(dtMgr, initialDtCount) + "\n\n" + e.getMessage();
			SwingUtilities.invokeLater(() -> {
				MultiLineMessageDialog.showMessageDialog(plugin.getDialog().getComponent(),
					"C-Parse Failed",
					"Failed to parse header file(s) to " + getParseDestination(dtMgr),
					plugin.getFormattedParseMessage(errMsg),
					MultiLineMessageDialog.ERROR_MESSAGE);
			});
		}
		catch (ghidra.app.util.cparser.CPP.ParseException e) {
			final String errMsg = getResultMessage(dtMgr, initialDtCount) + "\n\n" + e.getMessage();
			SwingUtilities.invokeLater(() -> {
				MultiLineMessageDialog.showMessageDialog(plugin.getDialog().getComponent(),
					"C-PreProcessor Parse Failed",
					"Failed to parse header file(s) to " + getParseDestination(dtMgr),
					plugin.getFormattedParseMessage(errMsg),
					MultiLineMessageDialog.ERROR_MESSAGE);
			});
		}
		catch (Exception e) {
			final String errMsg = getResultMessage(dtMgr, initialDtCount) + "\n\n" + e.getMessage();
			Msg.showError(this, plugin.getDialog().getComponent(), "Error During C-Parse",
				"Parse header files failed" + "\n\nParser Messages:\n" + plugin.getParseMessage(),
				e);
			SwingUtilities.invokeLater(() -> {
				MultiLineMessageDialog.showMessageDialog(plugin.getDialog().getComponent(),
					"Error During C-Parse",
					"Failed to parse header file(s) to " + getParseDestination(dtMgr),
					plugin.getFormattedParseMessage(errMsg),
					MultiLineMessageDialog.ERROR_MESSAGE);
			});
		}
		finally {
			if (fileDtMgr != null) {
				boolean deleteFile = fileDtMgr.getDataTypeCount(true) == 0;
				fileDtMgr.close();
				if (deleteFile) {
					dataFile.delete();
				}
			}
		}
	}
Set the compiler spec ID to be used.  This ID must be defined for the specified language.

NOTE: The language ID must also be set, see {@code #setLanguageID(String)}.
See language *.ldefs file for defined compiler spec IDs or existing Program info.

@param compilerSpecId compiler spec ID
@return this task
@throws UnsupportedOperationException if task was constructed with a DataTypeManager whose
existing architecture will be used.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserTask.java