Edit

kc3-lang/SDL/src/main/windows/SDL_windows_main.c

Branch :

  • Show log

    Commit

  • Author : Ryan C. Gordon
    Date : 2014-07-27 19:52:52
    Hash : 2230df55
    Message : Remove dependency on C runtime from Windows SDLmain.

  • src/main/windows/SDL_windows_main.c
  • /*
        SDL_windows_main.c, placed in the public domain by Sam Lantinga  4/13/98
    
        The WinMain function -- calls your program's main() function
    */
    #include "SDL_config.h"
    
    #ifdef __WIN32__
    
    /* Include this so we define UNICODE properly */
    #include "../../core/windows/SDL_windows.h"
    
    /* Include the SDL main definition header */
    #include "SDL.h"
    #include "SDL_main.h"
    
    #ifdef main
    #  undef main
    #endif /* main */
    
    static void
    UnEscapeQuotes(char *arg)
    {
        char *last = NULL;
    
        while (*arg) {
            if (*arg == '"' && (last != NULL && *last == '\\')) {
                char *c_curr = arg;
                char *c_last = last;
    
                while (*c_curr) {
                    *c_last = *c_curr;
                    c_last = c_curr;
                    c_curr++;
                }
                *c_last = '\0';
            }
            last = arg;
            arg++;
        }
    }
    
    /* Parse a command line buffer into arguments */
    static int
    ParseCommandLine(char *cmdline, char **argv)
    {
        char *bufp;
        char *lastp = NULL;
        int argc, last_argc;
    
        argc = last_argc = 0;
        for (bufp = cmdline; *bufp;) {
            /* Skip leading whitespace */
            while (SDL_isspace(*bufp)) {
                ++bufp;
            }
            /* Skip over argument */
            if (*bufp == '"') {
                ++bufp;
                if (*bufp) {
                    if (argv) {
                        argv[argc] = bufp;
                    }
                    ++argc;
                }
                /* Skip over word */
                lastp = bufp;
                while (*bufp && (*bufp != '"' || *lastp == '\\')) {
                    lastp = bufp;
                    ++bufp;
                }
            } else {
                if (*bufp) {
                    if (argv) {
                        argv[argc] = bufp;
                    }
                    ++argc;
                }
                /* Skip over word */
                while (*bufp && !SDL_isspace(*bufp)) {
                    ++bufp;
                }
            }
            if (*bufp) {
                if (argv) {
                    *bufp = '\0';
                }
                ++bufp;
            }
    
            /* Strip out \ from \" sequences */
            if (argv && last_argc != argc) {
                UnEscapeQuotes(argv[last_argc]);
            }
            last_argc = argc;
        }
        if (argv) {
            argv[argc] = NULL;
        }
        return (argc);
    }
    
    /* Pop up an out of memory message, returns to Windows */
    static BOOL
    OutOfMemory(void)
    {
        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Fatal Error", "Out of memory - aborting", NULL);
        return FALSE;
    }
    
    #if defined(_MSC_VER)
    /* The VC++ compiler needs main defined */
    #define console_main main
    #endif
    
    /* This is where execution begins [console apps] */
    int
    console_main(int argc, char *argv[])
    {
        SDL_SetMainReady();
    
        /* Run the application main() code */
        return SDL_main(argc, argv);
    }
    
    /* This is where execution begins [windowed apps] */
    int WINAPI
    WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
    {
        char **argv;
        int argc;
        char *cmdline;
    
        /* Grab the command line */
        TCHAR *text = GetCommandLine();
    #if UNICODE
        cmdline = SDL_iconv_string("UTF-8", "UCS-2-INTERNAL", (char *)(text), (SDL_wcslen(text)+1)*sizeof(WCHAR));
    #else
        cmdline = SDL_strdup(text);
    #endif
        if (cmdline == NULL) {
            return OutOfMemory();
        }
    
        /* Parse it into argv and argc */
        argc = ParseCommandLine(cmdline, NULL);
        argv = SDL_stack_alloc(char *, argc + 1);
        if (argv == NULL) {
            return OutOfMemory();
        }
        ParseCommandLine(cmdline, argv);
    
        /* Run the main program */
        console_main(argc, argv);
    
        SDL_stack_free(argv);
    
        SDL_free(cmdline);
    
        /* Hush little compiler, don't you cry... */
        return 0;
    }
    
    #endif /* __WIN32__ */
    
    /* vi: set ts=4 sw=4 expandtab: */