MWCC/command_line/CmdLine/Src/Callbacks/CLParserCallbacks_v1.cpp

221 lines
6.1 KiB
C++

#include "cmdline.h"
#include "plugin_internal.h"
extern char STSbuf[256];
CWResult UCBParserAddAccessPath(CWPluginContext context, const CWNewAccessPathInfo *api) {
OSSpec oss;
Paths *paths;
Path *path;
int err;
if ((err = OS_FSSpec_To_OSSpec(&api->pathSpec, &oss))) {
context->callbackOSError = OS_MacError(err);
return cwErrInvalidParameter;
}
if (optsCmdLine.verbose > 2)
CLReport(CLStr77, " search path", OS_PathSpecToString(&oss.path, STSbuf, sizeof(STSbuf)));
if ((api->type & cwAccessPathTypeFlag1) == 0)
paths = &gTarg->sysPaths;
else
paths = &gTarg->userPaths;
path = Path_New(&oss.path);
path->flags = api->type & cwAccessPathTypeFlag2;
if ((api->position >= 0) ? (Paths_InsertPath(paths, api->position, path) == 0) : (Paths_AddPath(paths, path) == 0))
return cwErrRequestFailed;
if (api->recursive) {
Paths_GatherRecurse(path);
if (CheckForUserBreak())
return cwErrUserCanceled;
}
if (!(api->type & cwAccessPathTypeFlag1))
static_cast<shellContextType *>(context->shellContext)->systemAccessPathsChanged = 1;
else
static_cast<shellContextType *>(context->shellContext)->userAccessPathsChanged = 1;
return cwNoErr;
}
CWResult UCBParserSwapAccessPaths(CWPluginContext context) {
Path *tmp;
UInt16 idx;
for (idx = 0; idx < Paths_Count(&gTarg->sysPaths); idx++) {
tmp = Paths_GetPath(&gTarg->sysPaths, idx);
if (!(tmp->flags & cwAccessPathTypeFlag2)) {
Paths_AddPath(&gTarg->userPaths, tmp);
Paths_RemovePath(&gTarg->sysPaths, idx);
idx--;
}
}
return cwNoErr;
}
int (*PrefPanelsChangedCallback)(const char *);
CWResult UCBParserSetNamedPreferences(CWPluginContext context, const char *panelName, Handle paneldata) {
PrefPanel *panel;
panel = Prefs_FindPanel(panelName);
if (!panel) {
panel = PrefPanel_New(panelName, *paneldata, GetHandleSize(paneldata));
if (!panel || !Prefs_AddPanel(panel))
return cwErrRequestFailed;
} else {
if (!PrefPanel_PutHandle(panel, paneldata))
return cwErrRequestFailed;
}
if (PrefPanelsChangedCallback)
PrefPanelsChangedCallback(panelName);
return cwNoErr;
}
CWResult UCBParserSetFileOutputName(CWPluginContext context, SInt32 position, short which, const char *outfilename) {
if (position < 0)
return cwErrInvalidParameter;
File *file = Files_GetFile(&gTarg->files, position);
if (!file)
return cwErrUnknownFile;
if (file->outfileowner)
CLReportError(CLStr103, file->srcfilename, file->outfilename);
strcpy(file->outfilename, outfilename);
if (which == 1)
file->outfileowner = CmdLineStageMask_Cg;
else if (which == 2)
file->outfileowner = CmdLineStageMask_Pp;
else if (which == 3)
file->outfileowner = CmdLineStageMask_Ds;
else
return cwErrInvalidParameter;
return cwNoErr;
}
CWResult UCBParserSetOutputFileDirectory(CWPluginContext context, const CWFileSpec *idefss) {
OSSpec fss;
int err;
if ((err = OS_FSSpec_To_OSSpec(idefss, &fss))) {
context->callbackOSError = OS_MacError(err);
return cwErrInvalidParameter;
}
gTarg->outputDirectory = fss.path;
context->outputFileDirectory = *idefss;
return cwNoErr;
}
CWResult UCBParserAddOverlay1Group(CWPluginContext context, const char *name, const CWAddr64 *addr, SInt32 *newGroupNumber) {
if (gTarg->linkmodel != LinkModel2)
return cwErrInvalidCallback;
OvlGroup *grp;
OvlAddr oaddr;
oaddr.hi = addr->hi;
oaddr.lo = addr->lo;
grp = OvlGroup_New(name, oaddr);
if (!grp)
return cwErrRequestFailed;
if (!Overlays_AddOvlGroup(&gTarg->linkage.overlays, grp, newGroupNumber))
return cwErrRequestFailed;
++context->numOverlayGroups;
if (optsCmdLine.verbose > 2)
CLReport(CLStr79, name, oaddr.hi, oaddr.lo);
return cwNoErr;
}
CWResult UCBParserAddOverlay1(CWPluginContext context, const char *name, SInt32 groupNumber, SInt32 *newOverlayNumber) {
if (gTarg->linkmodel != LinkModel2)
return cwErrInvalidCallback;
OvlGroup *grp;
Overlay *ovl;
grp = Overlays_GetOvlGroup(&gTarg->linkage.overlays, groupNumber);
if (!grp)
return cwErrRequestFailed;
ovl = Overlay_New(name);
if (!ovl)
return cwErrOutOfMemory;
if (!OvlGroup_AddOverlay(grp, ovl, newOverlayNumber))
return cwErrOutOfMemory;
if (optsCmdLine.verbose > 2)
CLReport(CLStr78, name, grp->name);
return cwNoErr;
}
CWResult UCBParserAddSegment(CWPluginContext context, const char *name, short attrs, SInt32 *newSegmentNumber) {
if (gTarg->linkmodel != LinkModel1)
return cwErrInvalidCallback;
Segment *seg;
UInt16 index;
seg = Segment_New(name, attrs);
if (!Segments_AddSegment(&gTarg->linkage.segs, seg, &index))
return cwErrRequestFailed;
*newSegmentNumber = index;
return cwNoErr;
}
CWResult UCBParserSetSegment(CWPluginContext context, SInt32 segmentNumber, const char *name, short attrs) {
if (gTarg->linkmodel != LinkModel1)
return cwErrInvalidCallback;
Segment *seg = Segments_GetSegment(&gTarg->linkage.segs, segmentNumber);
if (!seg)
return cwErrUnknownSegment;
strncpy(seg->name, name, sizeof(seg->name));
seg->name[sizeof(seg->name) - 1] = 0;
seg->attrs = attrs;
return cwNoErr;
}
static CWParserCallbacks parser_cb = {
UCBParserAddAccessPath,
UCBParserSwapAccessPaths,
UCBParserSetNamedPreferences,
UCBParserSetFileOutputName,
UCBParserSetOutputFileDirectory,
UCBParserAddOverlay1Group,
UCBParserAddOverlay1,
UCBParserAddSegment,
UCBParserSetSegment
};
CWParserContext::CWParserContext() : CWPluginPrivateContext(CWDROPINPARSERTYPE, -1) {
args = NULL;
os = 0;
cpu = 0;
numPlugins = 0;
plugins = NULL;
numPanels = 0;
panelNames = NULL;
panel_args = NULL;
plugin_args = NULL;
callbacks = &parser_cb;
}
CWParserContext::~CWParserContext() {
}