|
|
1.1 ! root 1: /* ! 2: SDL_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: ! 7: #include <stdio.h> ! 8: #include <string.h> ! 9: #include <ctype.h> ! 10: #include <stdlib.h> ! 11: ! 12: #include <windows.h> ! 13: #include <malloc.h> /* For _alloca() */ ! 14: ! 15: #ifdef _WIN32_WCE ! 16: # define DIR_SEPERATOR TEXT("\\") ! 17: # undef _getcwd ! 18: # define _getcwd(str,len) wcscpy(str,TEXT("")) ! 19: # define setbuf(f,b) ! 20: # define setvbuf(w,x,y,z) ! 21: # define fopen _wfopen ! 22: # define freopen _wfreopen ! 23: # define remove(x) DeleteFile(x) ! 24: # define strcat wcscat ! 25: #else ! 26: # define DIR_SEPERATOR TEXT("/") ! 27: # include <direct.h> ! 28: #endif ! 29: ! 30: /* Include the SDL main definition header */ ! 31: #include "SDL.h" ! 32: #include "SDL_main.h" ! 33: extern C_LINKAGE int SDL_main_env(int argc, char *argv[], char **env); ! 34: ! 35: #ifdef main ! 36: # ifndef _WIN32_WCE_EMULATION ! 37: # undef main ! 38: # endif /* _WIN32_WCE_EMULATION */ ! 39: #endif /* main */ ! 40: ! 41: #define NO_STDIO_REDIRECT ! 42: ! 43: /* The standard output files */ ! 44: #define STDOUT_FILE TEXT("stdout.txt") ! 45: #define STDERR_FILE TEXT("stderr.txt") ! 46: ! 47: #ifndef NO_STDIO_REDIRECT ! 48: # ifdef _WIN32_WCE ! 49: static wchar_t stdoutPath[MAX_PATH]; ! 50: static wchar_t stderrPath[MAX_PATH]; ! 51: # else ! 52: static char stdoutPath[MAX_PATH]; ! 53: static char stderrPath[MAX_PATH]; ! 54: # endif ! 55: #endif ! 56: ! 57: /* Special Dynamic/Static hackery */ ! 58: #include "sdlfuncs.h" ! 59: struct sdlfuncs sdl; ! 60: ! 61: #if defined(_WIN32_WCE) && _WIN32_WCE < 300 ! 62: /* seems to be undefined in Win CE although in online help */ ! 63: #define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t')) ! 64: ! 65: /* seems to be undefined in Win CE although in online help */ ! 66: char *strrchr(char *str, int c) ! 67: { ! 68: char *p; ! 69: ! 70: /* Skip to the end of the string */ ! 71: p=str; ! 72: while (*p) ! 73: p++; ! 74: ! 75: /* Look for the given character */ ! 76: while ( (p >= str) && (*p != (CHAR)c) ) ! 77: p--; ! 78: ! 79: /* Return NULL if character not found */ ! 80: if ( p < str ) { ! 81: p = NULL; ! 82: } ! 83: return p; ! 84: } ! 85: #endif /* _WIN32_WCE < 300 */ ! 86: ! 87: /* Parse a command line buffer into arguments */ ! 88: static int ParseCommandLine(char *cmdline, char **argv) ! 89: { ! 90: char *bufp; ! 91: int argc; ! 92: ! 93: argc = 0; ! 94: for ( bufp = cmdline; *bufp; ) { ! 95: /* Skip leading whitespace */ ! 96: while ( isspace(*bufp) ) { ! 97: ++bufp; ! 98: } ! 99: /* Skip over argument */ ! 100: if ( *bufp == '"' ) { ! 101: ++bufp; ! 102: if ( *bufp ) { ! 103: if ( argv ) { ! 104: argv[argc] = bufp; ! 105: } ! 106: ++argc; ! 107: } ! 108: /* Skip over word */ ! 109: while ( *bufp && (*bufp != '"') ) { ! 110: ++bufp; ! 111: } ! 112: } else { ! 113: if ( *bufp ) { ! 114: if ( argv ) { ! 115: argv[argc] = bufp; ! 116: } ! 117: ++argc; ! 118: } ! 119: /* Skip over word */ ! 120: while ( *bufp && ! isspace(*bufp) ) { ! 121: ++bufp; ! 122: } ! 123: } ! 124: if ( *bufp ) { ! 125: if ( argv ) { ! 126: *bufp = '\0'; ! 127: } ! 128: ++bufp; ! 129: } ! 130: } ! 131: if ( argv ) { ! 132: argv[argc] = NULL; ! 133: } ! 134: return(argc); ! 135: } ! 136: ! 137: /* Show an error message */ ! 138: static void ShowError(const char *title, const char *message) ! 139: { ! 140: /* If USE_MESSAGEBOX is defined, you need to link with user32.lib */ ! 141: #ifdef USE_MESSAGEBOX ! 142: MessageBox(NULL, message, title, MB_ICONEXCLAMATION|MB_OK); ! 143: #else ! 144: fprintf(stderr, "%s: %s\n", title, message); ! 145: #endif ! 146: } ! 147: ! 148: /* Pop up an out of memory message, returns to Windows */ ! 149: static BOOL OutOfMemory(void) ! 150: { ! 151: ShowError("Fatal Error", "Out of memory - aborting"); ! 152: return FALSE; ! 153: } ! 154: ! 155: /* Remove the output files if there was no output written */ ! 156: static void __cdecl cleanup_output(void) ! 157: { ! 158: #ifndef NO_STDIO_REDIRECT ! 159: FILE *file; ! 160: int empty; ! 161: #endif ! 162: ! 163: /* Flush the output in case anything is queued */ ! 164: fclose(stdout); ! 165: fclose(stderr); ! 166: ! 167: #ifndef NO_STDIO_REDIRECT ! 168: /* See if the files have any output in them */ ! 169: if ( stdoutPath[0] ) { ! 170: file = fopen(stdoutPath, TEXT("rb")); ! 171: if ( file ) { ! 172: empty = (fgetc(file) == EOF) ? 1 : 0; ! 173: fclose(file); ! 174: if ( empty ) { ! 175: remove(stdoutPath); ! 176: } ! 177: } ! 178: } ! 179: if ( stderrPath[0] ) { ! 180: file = fopen(stderrPath, TEXT("rb")); ! 181: if ( file ) { ! 182: empty = (fgetc(file) == EOF) ? 1 : 0; ! 183: fclose(file); ! 184: if ( empty ) { ! 185: remove(stderrPath); ! 186: } ! 187: } ! 188: } ! 189: #endif ! 190: } ! 191: ! 192: #if (defined(__BORLANDC__) || defined(_MSC_VER)) && !defined(_WIN32_WCE) ! 193: /* The VC++ compiler needs main defined */ ! 194: #define console_main main ! 195: #endif ! 196: ! 197: /* This is where execution begins [console apps] */ ! 198: int console_main(int argc, char *argv[], char **env) ! 199: { ! 200: int n; ! 201: char *bufp, *appname; ! 202: ! 203: /* Get the class name from argv[0] */ ! 204: appname = argv[0]; ! 205: if ( (bufp=strrchr(argv[0], '\\')) != NULL ) { ! 206: appname = bufp+1; ! 207: } else ! 208: if ( (bufp=strrchr(argv[0], '/')) != NULL ) { ! 209: appname = bufp+1; ! 210: } ! 211: ! 212: if ( (bufp=strrchr(appname, '.')) == NULL ) ! 213: n = strlen(appname); ! 214: else ! 215: n = (bufp-appname); ! 216: ! 217: bufp = (char *)alloca(n+1); ! 218: if ( bufp == NULL ) { ! 219: return OutOfMemory(); ! 220: } ! 221: strncpy(bufp, appname, n); ! 222: bufp[n] = '\0'; ! 223: appname = bufp; ! 224: ! 225: /* Load SDL dynamic link library */ ! 226: if(!load_sdl_funcs(&sdl)) { ! 227: if ( sdl.Init(SDL_INIT_NOPARACHUTE) < 0 ) { ! 228: return(FALSE); ! 229: } ! 230: atexit(cleanup_output); ! 231: ! 232: #ifndef DISABLE_VIDEO ! 233: /* Sam: ! 234: We still need to pass in the application handle so that ! 235: DirectInput will initialize properly when SDL_RegisterApp() ! 236: is called later in the video initialization. ! 237: */ ! 238: sdl.SetModuleHandle(GetModuleHandle(NULL)); ! 239: #endif /* !DISABLE_VIDEO */ ! 240: } ! 241: ! 242: /* Run the application main() code */ ! 243: n=SDL_main_env(argc, argv, env); ! 244: ! 245: /* Exit cleanly, calling atexit() functions */ ! 246: exit(n); ! 247: ! 248: /* Hush little compiler, don't you cry... */ ! 249: return(n); ! 250: } ! 251: ! 252: /* This is where execution begins [windowed apps] */ ! 253: #ifdef _WIN32_WCE ! 254: int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPWSTR szCmdLine, int sw) ! 255: #else ! 256: int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) ! 257: #endif ! 258: { ! 259: HINSTANCE handle; ! 260: char **argv; ! 261: int argc; ! 262: char *cmdline; ! 263: #ifdef _WIN32_WCE ! 264: wchar_t *bufp; ! 265: int nLen; ! 266: #else ! 267: char *bufp; ! 268: #endif ! 269: #ifndef NO_STDIO_REDIRECT ! 270: FILE *newfp; ! 271: #endif ! 272: ! 273: /* Start up DDHELP.EXE before opening any files, so DDHELP doesn't ! 274: keep them open. This is a hack.. hopefully it will be fixed ! 275: someday. DDHELP.EXE starts up the first time DDRAW.DLL is loaded. ! 276: */ ! 277: handle = LoadLibrary(TEXT("DDRAW.DLL")); ! 278: if ( handle != NULL ) { ! 279: FreeLibrary(handle); ! 280: } ! 281: ! 282: #ifndef NO_STDIO_REDIRECT ! 283: _getcwd( stdoutPath, sizeof( stdoutPath ) ); ! 284: strcat( stdoutPath, DIR_SEPERATOR STDOUT_FILE ); ! 285: ! 286: /* Redirect standard input and standard output */ ! 287: newfp = freopen(stdoutPath, TEXT("w"), stdout); ! 288: ! 289: #ifndef _WIN32_WCE ! 290: if ( newfp == NULL ) { /* This happens on NT */ ! 291: #if !defined(stdout) ! 292: stdout = fopen(stdoutPath, TEXT("w")); ! 293: #else ! 294: newfp = fopen(stdoutPath, TEXT("w")); ! 295: if ( newfp ) { ! 296: *stdout = *newfp; ! 297: } ! 298: #endif ! 299: } ! 300: #endif /* _WIN32_WCE */ ! 301: ! 302: _getcwd( stderrPath, sizeof( stderrPath ) ); ! 303: strcat( stderrPath, DIR_SEPERATOR STDERR_FILE ); ! 304: ! 305: newfp = freopen(stderrPath, TEXT("w"), stderr); ! 306: #ifndef _WIN32_WCE ! 307: if ( newfp == NULL ) { /* This happens on NT */ ! 308: #if !defined(stderr) ! 309: stderr = fopen(stderrPath, TEXT("w")); ! 310: #else ! 311: newfp = fopen(stderrPath, TEXT("w")); ! 312: if ( newfp ) { ! 313: *stderr = *newfp; ! 314: } ! 315: #endif ! 316: } ! 317: #endif /* _WIN32_WCE */ ! 318: ! 319: setvbuf(stdout, NULL, _IOLBF, BUFSIZ); /* Line buffered */ ! 320: setbuf(stderr, NULL); /* No buffering */ ! 321: #endif /* !NO_STDIO_REDIRECT */ ! 322: ! 323: #ifdef _WIN32_WCE ! 324: nLen = wcslen(szCmdLine)+128+1; ! 325: bufp = (wchar_t *)alloca(nLen*2); ! 326: wcscpy (bufp, TEXT("\"")); ! 327: GetModuleFileName(NULL, bufp+1, 128-3); ! 328: wcscpy (bufp+wcslen(bufp), TEXT("\" ")); ! 329: wcsncpy(bufp+wcslen(bufp), szCmdLine,nLen-wcslen(bufp)); ! 330: nLen = wcslen(bufp)+1; ! 331: cmdline = (char *)alloca(nLen); ! 332: if ( cmdline == NULL ) { ! 333: return OutOfMemory(); ! 334: } ! 335: WideCharToMultiByte(CP_ACP, 0, bufp, -1, cmdline, nLen, NULL, NULL); ! 336: #else ! 337: /* Grab the command line (use alloca() on Windows) */ ! 338: bufp = GetCommandLine(); ! 339: cmdline = (char *)alloca(strlen(bufp)+1); ! 340: if ( cmdline == NULL ) { ! 341: return OutOfMemory(); ! 342: } ! 343: strcpy(cmdline, bufp); ! 344: #endif ! 345: ! 346: /* Parse it into argv and argc */ ! 347: argc = ParseCommandLine(cmdline, NULL); ! 348: argv = (char **)alloca((argc+1)*(sizeof *argv)); ! 349: if ( argv == NULL ) { ! 350: return OutOfMemory(); ! 351: } ! 352: ParseCommandLine(cmdline, argv); ! 353: ! 354: /* Run the main program (after a little SDL initialization) */ ! 355: return(console_main(argc, argv, _environ)); ! 356: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.