diff options
Diffstat (limited to '')
-rw-r--r-- | command_line/CmdLine/Src/CLPluginRequests.cpp | 348 |
1 files changed, 348 insertions, 0 deletions
diff --git a/command_line/CmdLine/Src/CLPluginRequests.cpp b/command_line/CmdLine/Src/CLPluginRequests.cpp new file mode 100644 index 0000000..9de50ba --- /dev/null +++ b/command_line/CmdLine/Src/CLPluginRequests.cpp @@ -0,0 +1,348 @@ +#include "cmdline.h" +#include "plugin_internal.h" + +extern "C" { +static CWResult CallPlugin(Plugin *plugin) { + return Plugin_Call(plugin, plugin->context); +} +} + +static void SetupPluginContext(Plugin *plugin, CWResult request) { + OSSpec spec; + shellContextType *sc; + OSPathSpec cwd; + + sc = static_cast<shellContextType *>(plugin->context->shellContext); + sc->plugin = plugin; + sc->systemAccessPathsChanged = 1; + sc->userAccessPathsChanged = 1; + plugin->context->request = request; + plugin->context->apiVersion = 12; + plugin->context->pluginStorage = NULL; + + OS_MakeFileSpec("Project.mcp", &spec); + OS_OSSpec_To_FSSpec(&spec, &plugin->context->projectFile); + if (gTarg) { + OS_MakeSpecWithPath(&gTarg->outputDirectory, NULL, 0, &spec); + OS_OSSpec_To_FSSpec(&spec, &plugin->context->outputFileDirectory); + } else { + OS_GetCWD(&cwd); + OS_MakeSpecWithPath(&cwd, NULL, 0, &spec); + OS_OSSpec_To_FSSpec(&spec, &plugin->context->outputFileDirectory); + } + + plugin->context->shellSignature = CWFOURCHAR('C','W','I','E'); + plugin->context->pluginType = Plugin_GetDropInFlags(plugin)->dropintype; + + if (gTarg) + plugin->context->numFiles = Files_Count(&gTarg->files); + else + plugin->context->numFiles = 0; + + if (gTarg) + plugin->context->numOverlayGroups = Overlays_CountGroups(&gTarg->linkage.overlays); + else + plugin->context->numOverlayGroups = 0; + + plugin->context->pluginOSError = noErr; + plugin->context->callbackOSError = noErr; + plugin->context->accessPathList = NULL; +} + +static void DestroyPluginContext(CWPluginContext context) { +} + +Boolean SendParserRequest( + Plugin *plugin, + Target *target, + CWCommandLineArgs *args, + OSType cpu, + OSType os, + int numPlugins, + CLPluginInfo *pluginInfo, + int numPanels, + const char **panelNames, + CWCommandLineArgs *plugin_args, + CWCommandLineArgs *panel_args, + const char *build_date, + const char *build_time, + const ToolVersionInfo *build_tool +) { + int result; + CWParserContext *pc; + + SetupPluginContext(plugin, 1); + + pc = static_cast<CWParserContext *>(plugin->context); + pc->build_date = build_date; + pc->build_time = build_time; + pc->build_tool = build_tool; + pc->args = args; + pc->cpu = cpu; + pc->os = os; + pc->numPlugins = numPlugins; + pc->plugins = pluginInfo; + pc->numPanels = numPanels; + pc->panelNames = panelNames; + pc->plugin_args = plugin_args; + pc->panel_args = panel_args; + + if (CallPlugin(plugin) != cwNoErr) + return 0; + if (!SendTargetInfoRequest(target, target->linker, target->linkerDropinFlags)) + return 0; + + target->linkmodel = + (target->targetinfo->linkType == exelinkageSegmented) ? LinkModel1 : + (target->targetinfo->linkType == exelinkageOverlay1) ? LinkModel2 : + LinkModel0; + + if (!Plugin_VerifyPanels(plugin)) + return 0; + + SetupPluginContext(plugin, 2); + pc->args = args; + pc->cpu = cpu; + pc->os = os; + pc->numPlugins = numPlugins; + pc->plugins = pluginInfo; + pc->numPanels = numPanels; + pc->panelNames = panelNames; + pc->plugin_args = plugin_args; + pc->panel_args = panel_args; + + result = CallPlugin(plugin); + return (result == cwNoErr); +} + +Boolean SendCompilerRequest(Plugin *plugin, File *file, SInt16 stage) { + CWResult result; + CWCompilerLinkerContext *cc; + Boolean precompiling; + SInt16 type; + OSType mactype; + const char *pn; + int v; + + if (stage & CmdLineStageMask_Cg) { + if (optsCompiler.forcePrecompile == 1) + precompiling = 1; + else if (optsCompiler.forcePrecompile == 2) + precompiling = 0; + else + precompiling = !!(file->mappingflags & kPrecompile); + } else { + precompiling = 0; + } + + if (optsCmdLine.verbose) { + pn = Plugin_GetDropInName(plugin); + v = optsCmdLine.verbose > 1; + if (stage & CmdLineStageMask_Pp) { + CLReport(CLStr34 + v, file->srcfilename, pn); + } else if (stage & CmdLineStageMask_Cg) { + if (precompiling) + CLReport(CLStr32 + v, file->srcfilename, pn); + else + CLReport(CLStr30 + v, file->srcfilename, pn); + } else if (stage & CmdLineStageMask_Dp) { + CLReport(CLStr36 + v, file->srcfilename, pn); + } else if (stage & CmdLineStageMask_Ds) { + CLReport(CLStr46 + v, file->srcfilename, pn); + } else if (!stage) { + CLReport(CLStr48 + v, file->srcfilename, pn); + } + } + + if (!Plugin_VerifyPanels(plugin)) + return 0; + + SetupPluginContext(plugin, reqCompile); + cc = static_cast<CWCompilerLinkerContext *>(plugin->context); + *cc->targetinfo = *gTarg->targetinfo; + + OS_OSSpec_To_FSSpec(&file->srcfss, &cc->sourcefile); + if (!OS_GetMacFileType(&file->srcfss, &mactype) && mactype == CWFOURCHAR('T','E','X','T')) { + if (UCBGetFileText(cc, &cc->sourcefile, &cc->sourcetext, &cc->sourcetextsize, &type) != cwNoErr) + return 0; + } else { + cc->sourcetext = NULL; + cc->sourcetextsize = 0; + } + + cc->whichfile = file->filenum; + cc->debuginfo = optsCmdLine.debugInfo; + cc->recordbrowseinfo = file->recordbrowseinfo; + cc->fileID = file->browseFileID; + memcpy(&cc->browseoptions, file->browseoptions, sizeof(cc->browseoptions)); + + if (stage & (CmdLineStageMask_Pp | CmdLineStageMask_Dp)) { + if (stage & CmdLineStageMask_Pp) + cc->preprocess = 1; + else + cc->preprocess = 2; + } else { + cc->preprocess = 0; + } + + if ((stage & CmdLineStageMask_Cg) && precompiling) { + cc->precompile = 1; + cc->autoprecompile = 1; + } else { + cc->precompile = 0; + cc->autoprecompile = 0; + } + + if (!(stage & (CmdLineStageMask_Pp | CmdLineStageMask_Cg | CmdLineStageMask_Dp))) { + cc->preprocess = 2; + cc->precompile = 2; + } + + result = CallPlugin(plugin); + + if (cc->sourcetext) { + UCBReleaseFileText(cc, cc->sourcetext); + cc->sourcetext = NULL; + cc->sourcetextsize = 0; + } + + return (result == cwNoErr); +} + +Boolean SendTargetInfoRequest(Target *targ, Plugin *linker, SInt32 dropinflags) { + CWResult result; + CWCompilerLinkerContext *cc; + OSSpec spec; + FSSpec fss; + + if (linker && !(dropinflags & dropInExecutableTool)) { + if (optsCmdLine.verbose > 1) + CLReport(CLStr50, Plugin_GetDropInName(linker)); +#line 298 + OPTION_ASSERT(Plugin_GetPluginType(linker) == CWDROPINLINKERTYPE); + + if (!Plugin_VerifyPanels(linker)) + return 0; + + SetupPluginContext(linker, reqTargetInfo); + cc = static_cast<CWCompilerLinkerContext *>(linker->context); + *cc->targetinfo = *targ->targetinfo; + result = CallPlugin(linker); + *targ->targetinfo = *cc->targetinfo; + } else { + OS_MakeFileSpec("(unknown file)", &spec); + OS_OSSpec_To_FSSpec(&spec, &fss); + targ->targetinfo->outputType = linkOutputFile; + targ->targetinfo->outfile = fss; + targ->targetinfo->symfile = fss; + targ->targetinfo->runfile = fss; + targ->targetinfo->linkType = exelinkageFlat; + targ->targetinfo->canRun = 0; + targ->targetinfo->canDebug = 0; + targ->targetinfo->targetCPU = targ->cpu; + targ->targetinfo->targetOS = targ->os; + targ->targetinfo->outfileCreator = CWFOURCHAR('C','W','I','E'); + targ->targetinfo->outfileType = CWFOURCHAR('A','P','P','L'); + targ->targetinfo->debuggerCreator = CWFOURCHAR('M','W','D','B'); + targ->targetinfo->runHelperCreator = CWFOURCHAR('?','?','?','?'); + result = cwNoErr; + } + + return (result == cwNoErr); +} + +Boolean SendLinkerRequest(Plugin *plugin, SInt32 dropinflags, CWTargetInfo *targetInfo) { + CWResult result; + CWCompilerLinkerContext *cc; + const char *nm; + int v; + + if (optsCmdLine.verbose) { + nm = Plugin_GetDropInName(plugin); + v = optsCmdLine.verbose > 1; + if (dropinflags & isPostLinker) + CLReport(CLStr44 + v, nm); + else if (dropinflags & isPreLinker) + CLReport(CLStr42 + v, nm); + else + CLReport(CLStr40 + v, nm); + } + + if (!Plugin_VerifyPanels(plugin)) + return 0; + + SetupPluginContext(plugin, reqLink); + cc = static_cast<CWCompilerLinkerContext *>(plugin->context); + *cc->targetinfo = *targetInfo; + result = CallPlugin(plugin); + *targetInfo = *cc->targetinfo; + + return (result == cwNoErr); +} + +Boolean SendDisassemblerRequest(Plugin *linker, File *file) { + CWResult result; + Plugin *plugin; + + if (linker == NULL) + plugin = file->compiler; + else + plugin = linker; + + if (optsCmdLine.verbose) + CLReport((optsCmdLine.verbose > 1) + CLStr46, file->srcfilename, Plugin_GetDropInName(linker)); + + if (!Plugin_VerifyPanels(plugin)) + return 0; + + if (!linker) { + SetupPluginContext(plugin, reqCompDisassemble); + static_cast<CWCompilerLinkerContext *>(plugin->context)->whichfile = file->filenum; + result = CallPlugin(plugin); + } else { + SetupPluginContext(plugin, reqDisassemble); + static_cast<CWCompilerLinkerContext *>(plugin->context)->whichfile = file->filenum; + result = CallPlugin(plugin); + } + + return (result == cwNoErr); +} + +Boolean SendInitOrTermRequest(Plugin *plugin, Boolean reqIsInitialize) { + CWResult result; + OSType ty; + + result = cwErrRequestFailed; + + if (plugin) { + if (clState.pluginDebug) + CLReport(reqIsInitialize ? CLStr51 : CLStr52, Plugin_GetDropInName(plugin)); + + if (reqIsInitialize) { + ty = Plugin_GetDropInFlags(plugin)->dropintype; + if (ty == CWDROPINDRIVERTYPE) { + plugin->context = new CWPluginPrivateContext(ty); + } else if (ty == CWDROPINPARSERTYPE) { + plugin->context = new CWParserContext(); + } else if (ty == CWDROPINCOMPILERTYPE || ty == CWDROPINLINKERTYPE) { + plugin->context = new CWCompilerLinkerContext(); + } else { + plugin->context = NULL; + } + + plugin->context->shellContext = new shellContextType; + } + + if (plugin->context) { + SetupPluginContext(plugin, reqIsInitialize ? reqInitialize : reqTerminate); + result = CallPlugin(plugin); + } else { + result = cwNoErr; + } + + if (!reqIsInitialize) + License_AutoCheckin(); + } + + return (result == cwNoErr); +} |