summaryrefslogtreecommitdiff
path: root/command_line/CmdLine/Src/CLMain.c
diff options
context:
space:
mode:
Diffstat (limited to 'command_line/CmdLine/Src/CLMain.c')
-rw-r--r--command_line/CmdLine/Src/CLMain.c390
1 files changed, 390 insertions, 0 deletions
diff --git a/command_line/CmdLine/Src/CLMain.c b/command_line/CmdLine/Src/CLMain.c
new file mode 100644
index 0000000..c4d782b
--- /dev/null
+++ b/command_line/CmdLine/Src/CLMain.c
@@ -0,0 +1,390 @@
+#include "mwcc_decomp.h"
+
+static short CLT_dummymain(void *context) {
+ return 0;
+}
+
+static short CLT_GetDropInFlags(const DropInFlags **flags, long *flagsSize) {
+ static const DropInFlags sFlags = {
+ kCurrentDropInFlagsVersion,
+ CWFOURCHAR('c','l','d','r'),
+ 7,
+ 0,
+ 0,
+ 12
+ };
+ *flags = &sFlags;
+ *flagsSize = sizeof(sFlags);
+ return 0;
+}
+
+static short CLT_GetDropInName(const char **dropinName) {
+ static const char *sDropInName = "Command-Line Driver";
+ *dropinName = sDropInName;
+ return 0;
+}
+
+static short CLT_GetDisplayName(const char **displayName) {
+ static const char *sDisplayName = "Command-Line Driver";
+ *displayName = sDisplayName;
+ return 0;
+}
+
+static short CLT_GetPanelList(const CWPanelList **panelList) {
+ static const char *sPanelNames[4];
+ static CWPanelList sPanelList = {
+ kCurrentCWPanelListVersion,
+ 4,
+ sPanelNames
+ };
+
+ sPanelNames[0] = "CmdLine Panel";
+ if (clState.plugintype == CWDROPINCOMPILERTYPE) {
+ sPanelNames[1] = "CmdLine Compiler Panel";
+ sPanelNames[2] = "CmdLine Linker Panel";
+ sPanelList.count = 3;
+ } else {
+ sPanelNames[1] = "CmdLine Linker Panel";
+ sPanelList.count = 2;
+ }
+ *panelList = &sPanelList;
+ return 0;
+}
+
+static short CLT_GetTargetList(const CWTargetList **targetList) {
+ static CWDataType sCPU = CWFOURCHAR('*','*','*','*');
+ static CWDataType sOS = CWFOURCHAR('*','*','*','*');
+ static CWTargetList sTargetList = {
+ kCurrentCWTargetListVersion,
+ 1,
+ &sCPU,
+ 1,
+ &sOS
+ };
+ *targetList = &sTargetList;
+ return 0;
+}
+
+static short CLT_GetVersionInfo(const VersionInfo **versioninfo) {
+ static const VersionInfo vi = {
+ 3, 0, 0, 0
+ };
+ *versioninfo = &vi;
+ return 0;
+}
+
+static short CLT_GetFileTypeMappings(const OSFileTypeMappingList **mappinglist) {
+ static const OSFileTypeMapping ftmes[2] = {
+ {CWFOURCHAR('B','r','w','s'), "DubL", 4, 0, 0},
+ {CWFOURCHAR('M','M','P','r'), "looc", 4, 0, 0}
+ };
+ static const OSFileTypeMappingList ftml = {
+ 2,
+ ftmes
+ };
+ *mappinglist = &ftml;
+ return 0;
+}
+
+static BasePluginCallbacks clcb = {
+ CLT_dummymain,
+ CLT_GetDropInFlags,
+ CLT_GetDisplayName,
+ CLT_GetDropInName,
+ CLT_GetPanelList,
+ 0,
+ 0,
+ CLT_GetVersionInfo,
+ CLT_GetFileTypeMappings
+};
+
+static int RegisterStaticCmdLinePlugin() {
+ return RegisterStaticPlugin(&clcb);
+}
+
+// TODO do me later - this comes from CmdLine/Project/Resources/CLErrors.r
+const char *STR12000[100];
+
+static int RegisterCmdLineResources() {
+ return RegisterResource("Command-line strings", 12000, &STR12000);
+}
+
+static int special_debug(unsigned char pre, char *) {
+ if (pre) {
+ SetupDebuggingTraps();
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+static int special_plugin_debug(unsigned char pre, char *) {
+ if (pre) {
+ clState.pluginDebug = 1;
+ return 1;
+ } else {
+ return clState.pluginDebug;
+ }
+}
+
+static int special_stdout_base(unsigned char pre, char *) {
+ if (pre) {
+ return 1;
+ } else {
+ return clState.stdoutBase != 0;
+ }
+}
+
+struct SpecialOption {
+ const char *optname;
+ char **argp;
+ int (*func)(unsigned char a, char *b);
+};
+static struct SpecialOption special_options[3] = {
+ {"", 0, special_debug},
+ {"--plugin-debug", 0, special_plugin_debug},
+ {"--stdout", /*TODO clState*/ 0, special_stdout_base}
+};
+
+void Main_PreParse(int *pArgc, char ***pArgv) {
+ struct SpecialOption *so;
+ int idx;
+
+ if (*pArgc > 1) {
+ restart:
+ for (idx = 0, so = &special_options[0]; idx < 3; idx++, so++) {
+ if (!strcmp(so->optname, (*pArgv)[1])) {
+ if (so->argp) {
+ *so->argp = (*pArgv)[2];
+ so->func(1, *so->argp);
+ (*pArgv)[1] = (*pArgv)[0];
+ (*pArgc)--;
+ (*pArgv)++;
+
+ (*pArgv)[1] = (*pArgv)[0];
+ (*pArgc)--;
+ (*pArgv)++;
+ } else {
+ so->func(1, 0);
+ (*pArgv)[1] = (*pArgv)[0];
+ (*pArgc)--;
+ (*pArgv)++;
+ }
+ break;
+ }
+ }
+
+ if ((*pArgc) > 1 && idx < 3)
+ goto restart;
+ }
+}
+
+void Main_PassSpecialArgs(void *unk1, void *unk2) {
+ struct SpecialOption *so;
+ int idx;
+
+ for (idx = 0; idx < 3; idx++) {
+ so = &special_options[idx];
+ if (so->func(0, 0)) {
+ AppendArgumentList(unk1, unk2, so->optname);
+ if (so->argp)
+ AppendArgumentList(unk1, unk2, (*so->argp) ? *so->argp : "");
+ }
+ }
+}
+
+static int MainInitialized;
+void *gProj;
+PCmdLine optsCmdLine;
+PCmdLineEnvir optsEnvir;
+PCmdLineCompiler optsCompiler;
+PCmdLineLinker optsLinker;
+
+int Main_Initialize(int argc, const char **argv) {
+ static char secret[8];
+ char exename[256];
+
+ OS_InitProgram(&argc, &argv);
+ memset(&clState, 0, sizeof(CLState));
+ special_options[0].optname = secret;
+ secret[7] = 0;
+ secret[4] = 'b';
+ secret[1] = '-';
+ secret[5] = 'u';
+ secret[2] = 'd';
+ secret[0] = '-';
+ secret[3] = 'e';
+ secret[6] = 'g';
+
+ Main_PreParse(&argc, &argv);
+ clState.argc = argc;
+ clState.argv = argv;
+ // TODO more shite
+
+ MainInitialized = 1;
+ return 0;
+}
+
+int Main_Terminate(int exitcode) {
+ if (MainInitialized) {
+ Plugins_Term();
+ License_Terminate();
+ Proj_Terminate(gProj);
+ IO_Terminate();
+ MainInitialized = 0;
+ }
+ return exitcode;
+}
+
+static int Main_ParseCommandLine() {
+ // TODO: clState, Plugins, gTarg, ...
+ long vislang;
+ int x, y;
+ CWCommandLineArgs myargs;
+}
+
+static int Main_SetupParamBlock() {
+ // TODO: OS, PrefPanes, clState, ...
+ PrefPanelsChangedCallback(0);
+}
+
+static int Main_ResolveProject() {
+ // TODO: Various project things
+ int err;
+ long startTime, endTime;
+}
+
+static int UpdatePCmdLineFromVersion(const PCmdLine *given, PCmdLine *target) {
+ static unsigned char warned;
+ short version = given->version;
+ *target = *given;
+
+ // TODO: clState
+ return 0;
+}
+
+static int UpdatePCmdLineEnvirFromVersion(const PCmdLineEnvir *given, PCmdLineEnvir *target) {
+ static unsigned char warned;
+ short version = given->version;
+ *target = *given;
+
+ // TODO: clState
+ return 0;
+}
+
+static int UpdatePCmdLineCompilerFromVersion(const PCmdLineCompiler *given, PCmdLineCompiler *target) {
+ static unsigned char warned;
+ short version = given->version;
+ *target = *given;
+
+ // TODO: clState
+ return 0;
+}
+
+static int UpdatePCmdLineLinkerFromVersion(const PCmdLineLinker *given, PCmdLineLinker *target) {
+ static unsigned char warned;
+ short version = given->version;
+ *target = *given;
+
+ // TODO: clState
+ return 0;
+}
+
+static int UpdatePrefPanels(const char *name) {
+ PrefPanel *panel;
+ Handle h;
+
+ if (!name || !ustrcmp(name, "CmdLine Panel")) {
+ if ((panel = Prefs_FindPanel("CmdLine Panel")) && (h = PrefPanel_GetHandle(panel))) {
+ if (name) {
+ if (!UpdatePCmdLineFromVersion((PCmdLine *) *h, &optsCmdLine))
+ return 0;
+ }
+ } else {
+ CLReportError(91, "CmdLine Panel");
+ return 0;
+ }
+ }
+
+ if (!name || !ustrcmp(name, "CmdLine Environment")) {
+ if ((panel = Prefs_FindPanel("CmdLine Environment")) && (h = PrefPanel_GetHandle(panel))) {
+ if (name) {
+ if (!UpdatePCmdLineEnvirFromVersion((PCmdLineEnvir *) *h, &optsEnvir))
+ return 0;
+ }
+ } else {
+ CLReportError(91, "CmdLine Environment");
+ return 0;
+ }
+ }
+
+ if (!name || !ustrcmp(name, "CmdLine Compiler Panel")) {
+ if ((panel = Prefs_FindPanel("CmdLine Compiler Panel")) && (h = PrefPanel_GetHandle(panel))) {
+ if (name) {
+ if (!UpdatePCmdLineCompilerFromVersion((PCmdLineCompiler *) *h, &optsCompiler))
+ return 0;
+ }
+ } else {
+ CLReportError(91, "CmdLine Compiler Panel");
+ return 0;
+ }
+ }
+
+ if (!name || !ustrcmp(name, "CmdLine Linker Panel")) {
+ if ((panel = Prefs_FindPanel("CmdLine Linker Panel")) && (h = PrefPanel_GetHandle(panel))) {
+ if (name) {
+ if (!UpdatePCmdLineLinkerFromVersion((PCmdLineLinker *) *h, &optsLinker))
+ return 0;
+ }
+ } else {
+ CLReportError(91, "CmdLine Linker Panel");
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static int SetupCmdLinePrefPanels() {
+ int ret;
+
+ PrefPanelsChangedCallback = UpdatePrefPanels;
+ ret = Prefs_AddPanel(
+ PrefPanel_New("CmdLine Environment", &optsEnvir, sizeof(PCmdLineEnvir))
+ );
+ ret |= (
+ Prefs_AddPanel(PrefPanel_New("CmdLine Panel", 0, sizeof(PCmdLine)))
+ && Prefs_AddPanel(PrefPanel_New("CmdLine Compiler Panel", 0, sizeof(PCmdLineCompiler)))
+ && Prefs_AddPanel(PrefPanel_New("CmdLine Linker Panel", 0, sizeof(PCmdLineLinker)))
+ );
+
+ return ret;
+}
+
+static int Main_SetupContext() {
+ // TODO Target, Plugins, clState
+ return 1;
+}
+
+jmp_buf exit_program;
+
+int Main_Driver() {
+ volatile int result;
+
+ result = setjmp(exit_program);
+ if (!result) {
+ if (!SetupCmdLinePrefPanels())
+ CLFatalError("Could not initialize preferences");
+
+ Main_SetupContext();
+ if (!(result = Main_ParseCommandLine())) {
+ if (!(result = Main_SetupParamBlock()))
+ result = Main_ResolveProject();
+ }
+ } else {
+ result = 1;
+ }
+
+ return result;
+}
+