diff options
| author | Ash Wolf <ninji@wuffs.org> | 2022-10-07 20:02:27 +0100 | 
|---|---|---|
| committer | Ash Wolf <ninji@wuffs.org> | 2022-10-07 20:02:27 +0100 | 
| commit | 97f6a2438df1eaeb4128ce36f29346ea38a3db4a (patch) | |
| tree | 78260f8f0f2b84fc70fadb1e50e7fc104390eee4 /UCLTMain.c | |
| download | MWCC-97f6a2438df1eaeb4128ce36f29346ea38a3db4a.tar.gz MWCC-97f6a2438df1eaeb4128ce36f29346ea38a3db4a.zip | |
first very unfinished commit lol
Diffstat (limited to '')
| -rw-r--r-- | UCLTMain.c | 384 | 
1 files changed, 384 insertions, 0 deletions
| diff --git a/UCLTMain.c b/UCLTMain.c new file mode 100644 index 0000000..7da89af --- /dev/null +++ b/UCLTMain.c @@ -0,0 +1,384 @@ +#include "UCWInterface.h" + +static short CLT_dummymain() { +    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); +} + +const char *STR12000[100]; // TODO do me later + +static int RegisterCmdLineResources() { +    return RegisterResource("Command-line strings", 12000, &STR12000); +} + +static int special_debug(unsigned char flag, char *) { +    if (flag) { +        SetupDebuggingTraps(); +        return 1; +    } else { +        return 0; +    } +} + +static int special_plugin_debug(unsigned char flag, char *) { +    if (flag) { +        clState.pluginDebug = 1; +        return 1; +    } else { +        return clState.pluginDebug; +    } +} + +static int special_stdout_base(unsigned char flag, char *) { +    if (flag) { +        return 1; +    } else { +        return clState.stdoutBase != 0; +    } +} + +struct SpecialOption { +    const char *name; +    char **location; +    int (*callback)(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) { +    int i; +    struct SpecialOption *opt; + +    if (*pArgc > 1) { +    restart: +        for (i = 0, opt = &special_options[0]; i < 3; i++, opt++) { +            if (!strcmp(opt->name, (*pArgv)[1])) { +                if (opt->location) { +                    *opt->location = (*pArgv)[2]; +                    opt->callback(1, *opt->location); +                    (*pArgv)[1] = (*pArgv)[0]; +                    (*pArgc)--; +                    (*pArgv)++; + +                    (*pArgv)[1] = (*pArgv)[0]; +                    (*pArgc)--; +                    (*pArgv)++; +                } else { +                    opt->callback(1, 0); +                    (*pArgv)[1] = (*pArgv)[0]; +                    (*pArgc)--; +                    (*pArgv)++; +                } +                break; +            } +        } + +        if ((*pArgc) > 1 && i < 3) +            goto restart; +    } +} + +void Main_PassSpecialArgs(void *unk1, void *unk2) { +    int i; +    struct SpecialOption *opt; + +    for (i = 0; i < 3; i++) { +        opt = &special_options[i]; +        if (opt->callback(0, 0)) { +            AppendArgumentList(unk1, unk2, opt->name); +            if (opt->location) +                AppendArgumentList(unk1, unk2, (*opt->location) ? *opt->location : ""); +        } +    } +} + +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 buf[256]; + +    OS_InitProgram(&argc, &argv); +    memset(&clState, 0, sizeof(CLState)); +    special_options[0].name = 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 code) { +    if (MainInitialized) { +        Plugins_Term(); +        License_Terminate(); +        Proj_Terminate(gProj); +        IO_Terminate(); +        MainInitialized = 0; +    } +    return code; +} + +static int Main_ParseCommandLine() { +    // TODO: clState, Plugins, gTarg, ... +} + +static int Main_SetupParamBlock() { +    // TODO: OS, PrefPanes, clState, ... +    PrefPanelsChangedCallback(0); +} + +static int Main_ResolveProject() { +    // TODO: Various project things +} + +static int UpdatePCmdLineFromVersion(const PCmdLine *oldVer, PCmdLine *newVer) { +    static unsigned char warned; +    short ver = oldVer->version; +    *newVer = *oldVer; + +    // TODO: clState +    return 0; +} + +static int UpdatePCmdLineEnvirFromVersion(const PCmdLineEnvir *oldVer, PCmdLineEnvir *newVer) { +    static unsigned char warned; +    short ver = oldVer->version; +    *newVer = *oldVer; + +    // TODO: clState +    return 0; +} + +static int UpdatePCmdLineCompilerFromVersion(const PCmdLineCompiler *oldVer, PCmdLineCompiler *newVer) { +    static unsigned char warned; +    short ver = oldVer->version; +    *newVer = *oldVer; + +    // TODO: clState +    return 0; +} + +static int UpdatePCmdLineLinkerFromVersion(const PCmdLineLinker *oldVer, PCmdLineLinker *newVer) { +    static unsigned char warned; +    short ver = oldVer->version; +    *newVer = *oldVer; + +    // TODO: clState +    return 0; +} + +static int UpdatePrefPanels(const char *name) { +    PrefPanel *panel; +    Handle handle; + +    if (!name || !ustrcmp(name, "CmdLine Panel")) { +        if ((panel = Prefs_FindPanel("CmdLine Panel")) && (handle = PrefPanel_GetHandle(panel))) { +            if (name) { +                if (!UpdatePCmdLineFromVersion((PCmdLine *) *handle, &optsCmdLine)) +                    return 0; +            } +        } else { +            CLReportError(91, "CmdLine Panel"); +            return 0; +        } +    } + +    if (!name || !ustrcmp(name, "CmdLine Environment")) { +        if ((panel = Prefs_FindPanel("CmdLine Environment")) && (handle = PrefPanel_GetHandle(panel))) { +            if (name) { +                if (!UpdatePCmdLineEnvirFromVersion((PCmdLineEnvir *) *handle, &optsEnvir)) +                    return 0; +            } +        } else { +            CLReportError(91, "CmdLine Environment"); +            return 0; +        } +    } + +    if (!name || !ustrcmp(name, "CmdLine Compiler Panel")) { +        if ((panel = Prefs_FindPanel("CmdLine Compiler Panel")) && (handle = PrefPanel_GetHandle(panel))) { +            if (name) { +                if (!UpdatePCmdLineCompilerFromVersion((PCmdLineCompiler *) *handle, &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")) && (handle = PrefPanel_GetHandle(panel))) { +            if (name) { +                if (!UpdatePCmdLineLinkerFromVersion((PCmdLineLinker *) *handle, &optsLinker)) +                    return 0; +            } +        } else { +            CLReportError(91, "CmdLine Linker Panel"); +            return 0; +        } +    } + +    return 1; +} + +static int SetupCmdLinePrefPanels() { +    int result; + +    PrefPanelsChangedCallback = UpdatePrefPanels; +    result = Prefs_AddPanel( +            PrefPanel_New("CmdLine Environment", &optsEnvir, sizeof(PCmdLineEnvir)) +    ); +    result |= ( +            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 result; +} + +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; +} + | 
