mirror of https://git.wuffs.org/MWCC
227 lines
6.4 KiB
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;
|
|
}
|