cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

SDL_windows_main.c (3723B)


      1/*
      2    SDL_windows_main.c, placed in the public domain by Sam Lantinga  4/13/98
      3
      4    The WinMain function -- calls your program's main() function
      5*/
      6#include "SDL_config.h"
      7
      8#ifdef __WIN32__
      9
     10/* Include this so we define UNICODE properly */
     11#include "../../core/windows/SDL_windows.h"
     12
     13/* Include the SDL main definition header */
     14#include "SDL.h"
     15#include "SDL_main.h"
     16
     17#ifdef main
     18#  undef main
     19#endif /* main */
     20
     21static void
     22UnEscapeQuotes(char *arg)
     23{
     24    char *last = NULL;
     25
     26    while (*arg) {
     27        if (*arg == '"' && (last != NULL && *last == '\\')) {
     28            char *c_curr = arg;
     29            char *c_last = last;
     30
     31            while (*c_curr) {
     32                *c_last = *c_curr;
     33                c_last = c_curr;
     34                c_curr++;
     35            }
     36            *c_last = '\0';
     37        }
     38        last = arg;
     39        arg++;
     40    }
     41}
     42
     43/* Parse a command line buffer into arguments */
     44static int
     45ParseCommandLine(char *cmdline, char **argv)
     46{
     47    char *bufp;
     48    char *lastp = NULL;
     49    int argc, last_argc;
     50
     51    argc = last_argc = 0;
     52    for (bufp = cmdline; *bufp;) {
     53        /* Skip leading whitespace */
     54        while (SDL_isspace(*bufp)) {
     55            ++bufp;
     56        }
     57        /* Skip over argument */
     58        if (*bufp == '"') {
     59            ++bufp;
     60            if (*bufp) {
     61                if (argv) {
     62                    argv[argc] = bufp;
     63                }
     64                ++argc;
     65            }
     66            /* Skip over word */
     67            lastp = bufp;
     68            while (*bufp && (*bufp != '"' || *lastp == '\\')) {
     69                lastp = bufp;
     70                ++bufp;
     71            }
     72        } else {
     73            if (*bufp) {
     74                if (argv) {
     75                    argv[argc] = bufp;
     76                }
     77                ++argc;
     78            }
     79            /* Skip over word */
     80            while (*bufp && !SDL_isspace(*bufp)) {
     81                ++bufp;
     82            }
     83        }
     84        if (*bufp) {
     85            if (argv) {
     86                *bufp = '\0';
     87            }
     88            ++bufp;
     89        }
     90
     91        /* Strip out \ from \" sequences */
     92        if (argv && last_argc != argc) {
     93            UnEscapeQuotes(argv[last_argc]);
     94        }
     95        last_argc = argc;
     96    }
     97    if (argv) {
     98        argv[argc] = NULL;
     99    }
    100    return (argc);
    101}
    102
    103/* Pop up an out of memory message, returns to Windows */
    104static BOOL
    105OutOfMemory(void)
    106{
    107    SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Fatal Error", "Out of memory - aborting", NULL);
    108    return FALSE;
    109}
    110
    111#if defined(_MSC_VER)
    112/* The VC++ compiler needs main defined */
    113#define console_main main
    114#endif
    115
    116/* This is where execution begins [console apps] */
    117int
    118console_main(int argc, char *argv[])
    119{
    120    SDL_SetMainReady();
    121
    122    /* Run the application main() code */
    123    return SDL_main(argc, argv);
    124}
    125
    126/* This is where execution begins [windowed apps] */
    127int WINAPI
    128WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
    129{
    130    char **argv;
    131    int argc;
    132    char *cmdline;
    133
    134    /* Grab the command line */
    135    TCHAR *text = GetCommandLine();
    136#if UNICODE
    137    cmdline = SDL_iconv_string("UTF-8", "UCS-2-INTERNAL", (char *)(text), (SDL_wcslen(text)+1)*sizeof(WCHAR));
    138#else
    139    cmdline = SDL_strdup(text);
    140#endif
    141    if (cmdline == NULL) {
    142        return OutOfMemory();
    143    }
    144
    145    /* Parse it into argv and argc */
    146    argc = ParseCommandLine(cmdline, NULL);
    147    argv = SDL_stack_alloc(char *, argc + 1);
    148    if (argv == NULL) {
    149        return OutOfMemory();
    150    }
    151    ParseCommandLine(cmdline, argv);
    152
    153    /* Run the main program */
    154    console_main(argc, argv);
    155
    156    SDL_stack_free(argv);
    157
    158    SDL_free(cmdline);
    159
    160    /* Hush little compiler, don't you cry... */
    161    return 0;
    162}
    163
    164#endif /* __WIN32__ */
    165
    166/* vi: set ts=4 sw=4 expandtab: */