MWCC/command_line/C++_Parser/Src/Library/ParserFace.c

299 lines
8.3 KiB
C

#include "parser.h"
const char *failedCallback;
jmp_buf exit_plugin;
ParseOptsType parseopts;
static CWResult SetupParamBlock(CWPluginContext context) {
CWResult result;
int x;
Handle h;
PCmdLineEnvir cle;
memset(&parseopts, 0, sizeof(parseopts));
parseopts.context = context;
result = CWSecretGetNamedPreferences(context, "CmdLine Environment", &h);
if (result)
return result;
cle = **((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;
parseopts.success = 1;
parseopts.currentSegment = 1;
parseopts.currentOverlayGroup = 0;
parseopts.currentOverlay = 0;
Arg_InitToolArgs(&linkargs);
Arg_InitToolArgs(&prelinkargs);
Arg_InitToolArgs(&postlinkargs);
if (pTool->PreParse)
parseopts.success &= pTool->PreParse();
Arg_Init(parseopts.args->argc, parseopts.args->argv);
parseopts.noOptions = Arg_IsEmpty();
parseopts.success &= Options_Parse(Options_GetOptions(), OFLAGS_1) && !parseopts.hadErrors;
Arg_Reset();
result = Parser_StorePanels(context);
if (result)
return result;
if (pTool->MidParse && parseopts.success)
parseopts.success &= pTool->MidParse();
result = Parser_StorePanels(context);
if (result)
return result;
if (parseopts.showHelp && parseopts.success)
parseopts.success &= Options_DisplayHelp();
Arg_Reset();
if (parseopts.success)
parseopts.success &= Options_Parse(Options_GetOptions(), 0) && !parseopts.hadErrors;
if (pTool->PostParse && parseopts.success)
parseopts.success &= pTool->PostParse();
Arg_Terminate();
return (parseopts.success && !parseopts.hadErrors) ? cwNoErr : cwErrRequestFailed;
}
Handle Parser_FindPrefPanel(const char *name) {
int idx;
Handle h;
for (idx = 0; idx < pTool->numPrefDataPanels; idx++) {
if (!ustrcmp(name, pTool->prefDataPanels[idx].name)) {
h = NewHandle(pTool->prefDataPanels[idx].size);
if (!h)
return NULL;
HLock(h);
memcpy(*h, pTool->prefDataPanels[idx].ptr, pTool->prefDataPanels[idx].size);
HUnlock(h);
return h;
}
}
return NULL;
}
CWResult Parser_StorePanels(CWPluginContext context) {
int idx;
CWResult result;
const 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(CLPStr68, name);
return result;
}
}
}
return cwNoErr;
}
static CWResult StoreResults(CWPluginContext context) {
int idx; // r25
CWResult result;
CWCommandLineArgs args;
UInt32 id; // r8
UInt32 lg; // r10
result = Parser_StorePanels(context);
if (result)
return result;
for (idx = 0; idx < parseopts.numPlugins; idx++) {
if (parseopts.plugins[idx].plugintype == CWDROPINLINKERTYPE && parseopts.plugins[idx].storeCommandLine) {
if (parseopts.plugins[idx].dropinflags & isPreLinker) {
Arg_ToolArgsForPlugin(&prelinkargs, &args);
} else if (parseopts.plugins[idx].dropinflags & isPostLinker) {
Arg_ToolArgsForPlugin(&postlinkargs, &args);
} else {
Arg_ToolArgsForPlugin(&linkargs, &args);
}
result = CWParserStoreCommandLineForPlugin(parseopts.context, idx, &args);
if (result)
return result;
} else if (parseopts.plugins[idx].storeCommandLine) {
id = parseopts.plugins[idx].plugintype;
lg = parseopts.plugins[idx].language;
fprintf(stderr,
"*** No support for %c%c%c%c/%c%c%c%c tool\n",
(id & 0xFF000000) >> 24,
(id & 0x00FF0000) >> 16,
(id & 0x0000FF00) >> 8,
(id & 0x000000FF),
(lg & 0xFF000000) >> 24,
(lg & 0x00FF0000) >> 16,
(lg & 0x0000FF00) >> 8,
(lg & 0x000000FF)
);
}
}
return cwNoErr;
}
CWPLUGIN_ENTRY (CWParser_GetDropInFlags)(const DropInFlags **flags, SInt32 *flagsSize) {
static const DropInFlags sFlags = {
kCurrentDropInFlagsVersion,
CWDROPINPARSERTYPE,
7,
0,
'Seep',
12
};
*flags = &sFlags;
*flagsSize = sizeof(sFlags);
return 0;
}
CWPLUGIN_ENTRY (CWParser_GetDropInName)(const char **dropinName) {
static const char *sDropInName = "Command-Line Parser";
*dropinName = sDropInName;
return 0;
}
CWPLUGIN_ENTRY (CWParser_GetDisplayName)(const char **displayName) {
static const char *sDisplayName = "Command-Line Parser";
*displayName = sDisplayName;
return 0;
}
CWPLUGIN_ENTRY (CWParser_GetPanelList)(const CWPanelList **panelList) {
static CWPanelList sPanelList = {
kCurrentCWFamilyListVersion,
0,
0
};
*panelList = &sPanelList;
return 0;
}
CWPLUGIN_ENTRY (CWParser_GetTargetList)(const CWTargetList **targetList) {
static CWDataType sCPU = '****';
static CWDataType sOS = '****';
static CWTargetList sTargetList = {
kCurrentCWTargetListVersion,
1,
&sCPU,
1,
&sOS
};
*targetList = &sTargetList;
return 0;
}
CWPLUGIN_ENTRY (CWParser_GetVersionInfo)(const VersionInfo **versioninfo) {
static const VersionInfo vi = {
1, 1, 0, 0
};
*versioninfo = &vi;
return 0;
}
CWPLUGIN_ENTRY (Parser_SupportsPlugin)(const struct CLPluginInfo *pluginfo, CWDataType cpu, CWDataType os, Boolean *isSupported) {
*isSupported = ParserToolMatchesPlugin(pluginfo->plugintype, pluginfo->language, cpu, os);
return 0;
}
CWPLUGIN_ENTRY (Parser_SupportsPanels)(int numPanels, const char **panelNames, Boolean *isSupported) {
*isSupported = ParserToolHandlesPanels(numPanels, panelNames);
return 0;
}
CWPLUGIN_ENTRY (parser_main)(CWPluginContext context) {
CWResult result;
SInt32 request;
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;
}