diff options
Diffstat (limited to '')
-rw-r--r-- | ParserFace.c | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/ParserFace.c b/ParserFace.c new file mode 100644 index 0000000..7ce84e5 --- /dev/null +++ b/ParserFace.c @@ -0,0 +1,226 @@ +#include "UCWInterface.h" + +struct ParseOptsType parseopts; + +// TODO move me imports +extern CWResult CWSecretGetNamedPreferences(CWPluginContext context, const char *name, Handle *pHandle); +extern CWResult CWParserSetNamedPreferences(CWPluginContext context, const char *name, Handle pHandle); +extern CWResult CWParserGetCommandLine(CWPluginContext context, CWCommandLineArgs **pArgs); +extern CWResult CWParserGetToolInfo(CWPluginContext context, struct ToolVersionInfo **pToolVersion); +extern CWResult CWParserGetTargetInfo(CWPluginContext context, unsigned long *pCpu, unsigned long *pOs); +extern CWResult CWParserGetPanels(CWPluginContext context, int *pNumPanels, char ***pPanelNames); +extern CWResult CWParserGetPlugins(CWPluginContext context, int *pNumPlugins, struct CLPluginInfo **pPlugins); +extern void/*?*/ CWGetPluginRequest(CWPluginContext context, long *request); +extern void/*?*/ CWDonePluginRequest(CWPluginContext context, CWResult result); +extern void *pTool; +extern void SetupParserToolOptions(); +extern void CLPReportError(short code, ...); +extern unsigned char ParserToolMatchesPlugin(unsigned long plugintype, unsigned long language, unsigned long cpu, unsigned long os); +extern unsigned char ParserToolHandlesPanels(int numPanels, char **panelNames); +// TODO move me imports + +char *failedCallback; + +static CWResult SetupParamBlock(CWPluginContext context) { + struct PCmdLineEnvir cle; + Handle h; + int x; + CWResult result; + + memset(&parseopts, 0, sizeof(parseopts)); + parseopts.context = context; + + result = CWSecretGetNamedPreferences(context, "CmdLine Environment", &h); + if (result) + return result; + + cle = **((struct PCmdLineEnvir **) h); + parseopts.underIDE = cle.underIDE; + parseopts.ioRows = cle.rows; + parseopts.ioCols = cle.cols; + + result = CWParserGetCommandLine(context, &parseopts.args); + if (result) + return result; + + result = CWParserGetToolInfo(context, &parseopts.toolVersion); + if (result) + return result; + + result = CWParserGetTargetInfo(context, &parseopts.cpu, &parseopts.os); + if (result) + return result; + + result = CWParserGetPanels(context, &parseopts.numPanels, &parseopts.panelNames); + if (result) + return result; + + result = CWParserGetPlugins(context, &parseopts.numPlugins, &parseopts.plugins); + if (result) + return result; + + parseopts.passingArgs = 0; + for (x = 0; x < parseopts.numPlugins; x++) { + if (parseopts.plugins[x].storeCommandLine) + parseopts.passingArgs = 1; + } + + return 0; +} + +static CWResult SetupOptions(CWPluginContext context) { + if (!pTool) { + return 2; + } else { + SetupParserToolOptions(); + return 0; + } +} + +static CWResult Parse(CWPluginContext context) { + CWResult result; + + // TODO + return result; +} + +Handle Parser_FindPrefPanel(char *name) { + Handle h; + int idx; + + // TODO pTool +} + +CWResult Parser_StorePanels(CWPluginContext context) { + int idx; + CWResult result; + char *name; + Handle h; + + for (idx = 0; idx < parseopts.numPanels; idx++) { + name = parseopts.panelNames[idx]; + h = Parser_FindPrefPanel(name); + if (h) { + result = CWParserSetNamedPreferences(parseopts.context, name, h); + if (result) { + CLPReportError(68, name); + return result; + } + } + } + + return 0; +} + +static CWResult StoreResults(CWPluginContext context) { + // TODO Arg +} + +short CWParser_GetDropInFlags(const DropInFlags **flags, long *flagsSize) { + static const DropInFlags sFlags = { + kCurrentDropInFlagsVersion, + CWFOURCHAR('P','a','r','s'), + 7, + 0, + 'Seep', + 12 + }; + *flags = &sFlags; + *flagsSize = sizeof(sFlags); + return 0; +} + +short CWParser_GetDropInName(const char **dropinName) { + static const char *sDropInName = "Command-Line Parser"; + *dropinName = sDropInName; + return 0; +} + +short CWParser_GetDisplayName(const char **displayName) { + static const char *sDisplayName = "Command-Line Parser"; + *displayName = sDisplayName; + return 0; +} + +short CWParser_GetPanelList(const CWPanelList **panelList) { + static const CWPanelList sPanelList = { + kCurrentCWFamilyListVersion, + 0, + 0 + }; + *panelList = &sPanelList; + return 0; +} + +short CWParser_GetTargetList(const CWTargetList **targetList) { + static const unsigned long sCPU = '****'; + static const unsigned long sOS = '****'; + static const CWTargetList sTargetList = { + kCurrentCWTargetListVersion, + 1, + &sCPU, + 1, + &sOS + }; + *targetList = &sTargetList; + return 0; +} + +short CWParser_GetVersionInfo(const VersionInfo **versioninfo) { + static const VersionInfo vi = { + 1, 1, 0, 0 + }; + *versioninfo = &vi; + return 0; +} + +short Parser_SupportsPlugin(struct CLPluginInfo *pluginfo, CWDataType cpu, CWDataType os, Boolean *isSupported) { + *isSupported = ParserToolMatchesPlugin(pluginfo->plugintype, pluginfo->language, cpu, os); + return 0; +} + +short Parser_SupportsPanels(int numPanels, char **panelNames, Boolean *isSupported) { + *isSupported = ParserToolHandlesPanels(numPanels, panelNames); + return 0; +} + +jmp_buf exit_plugin; + +short parser_main(CWPluginContext context) { + long request; + CWResult result; + + CWGetPluginRequest(context, &request); + result = setjmp(exit_plugin); + if (result == 0) { + switch (request) { + case reqInitialize: + result = 0; + break; + case 0: + break; + case 1: + result = SetupParamBlock(context); + if (!result) + result = Parser_StorePanels(context); + break; + case 2: + result = SetupParamBlock(context); + if (!result) { + result = SetupOptions(context); + if (!result) { + result = Parse(context); + if (!result) + result = StoreResults(context); + } + } + break; + } + } else { + if (failedCallback && result != 1) + fprintf(stderr, "Unexpected error in %s [%d]\n", failedCallback, result); + } + CWDonePluginRequest(context, result); + + return result; +} |