MWCC/ParserFace.c

227 lines
6.4 KiB
C

#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;
}