src/main/win32/SDL_win32_main.c
branchSDL-1.2
changeset 4246 8b8314cc34a6
parent 4118 3c068a8c016f
child 5882 32558685a904
equal deleted inserted replaced
4245:0319c84d274d 4246:8b8314cc34a6
    36 
    36 
    37 /* The standard output files */
    37 /* The standard output files */
    38 #define STDOUT_FILE	TEXT("stdout.txt")
    38 #define STDOUT_FILE	TEXT("stdout.txt")
    39 #define STDERR_FILE	TEXT("stderr.txt")
    39 #define STDERR_FILE	TEXT("stderr.txt")
    40 
    40 
    41 #ifndef NO_STDIO_REDIRECT
    41 /* Set a variable to tell if the stdio redirect has been enabled. */
    42 # ifdef _WIN32_WCE
    42 static int stdioRedirectEnabled = 0;
       
    43 
       
    44 #ifdef _WIN32_WCE
    43   static wchar_t stdoutPath[MAX_PATH];
    45   static wchar_t stdoutPath[MAX_PATH];
    44   static wchar_t stderrPath[MAX_PATH];
    46   static wchar_t stderrPath[MAX_PATH];
    45 # else
    47 #else
    46   static char stdoutPath[MAX_PATH];
    48   static char stdoutPath[MAX_PATH];
    47   static char stderrPath[MAX_PATH];
    49   static char stderrPath[MAX_PATH];
    48 # endif
       
    49 #endif
    50 #endif
    50 
    51 
    51 #if defined(_WIN32_WCE) && _WIN32_WCE < 300
    52 #if defined(_WIN32_WCE) && _WIN32_WCE < 300
    52 /* seems to be undefined in Win CE although in online help */
    53 /* seems to be undefined in Win CE although in online help */
    53 #define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t'))
    54 #define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t'))
   156 {
   157 {
   157 	SDL_Quit();
   158 	SDL_Quit();
   158 }
   159 }
   159 
   160 
   160 /* Remove the output files if there was no output written */
   161 /* Remove the output files if there was no output written */
   161 static void cleanup_output(void)
   162 static void cleanup_output(void) {
   162 {
       
   163 #ifndef NO_STDIO_REDIRECT
       
   164 	FILE *file;
   163 	FILE *file;
   165 	int empty;
   164 	int empty;
   166 #endif
       
   167 
   165 
   168 	/* Flush the output in case anything is queued */
   166 	/* Flush the output in case anything is queued */
   169 	fclose(stdout);
   167 	fclose(stdout);
   170 	fclose(stderr);
   168 	fclose(stderr);
   171 
   169 
   172 #ifndef NO_STDIO_REDIRECT
   170 	/* Without redirection we're done */
       
   171 	if (!stdioRedirectEnabled) {
       
   172 		return;
       
   173 	}
       
   174 
   173 	/* See if the files have any output in them */
   175 	/* See if the files have any output in them */
   174 	if ( stdoutPath[0] ) {
   176 	if ( stdoutPath[0] ) {
   175 		file = fopen(stdoutPath, TEXT("rb"));
   177 		file = fopen(stdoutPath, TEXT("rb"));
   176 		if ( file ) {
   178 		if ( file ) {
   177 			empty = (fgetc(file) == EOF) ? 1 : 0;
   179 			empty = (fgetc(file) == EOF) ? 1 : 0;
   189 			if ( empty ) {
   191 			if ( empty ) {
   190 				remove(stderrPath);
   192 				remove(stderrPath);
   191 			}
   193 			}
   192 		}
   194 		}
   193 	}
   195 	}
   194 #endif
   196 }
       
   197 
       
   198 /* Redirect the output (stdout and stderr) to a file */
       
   199 static void redirect_output(void)
       
   200 {
       
   201 	DWORD pathlen;
       
   202 #ifdef _WIN32_WCE
       
   203 	wchar_t path[MAX_PATH];
       
   204 #else
       
   205 	char path[MAX_PATH];
       
   206 #endif
       
   207 	FILE *newfp;
       
   208 
       
   209 	pathlen = GetModuleFileName(NULL, path, SDL_arraysize(path));
       
   210 	while ( pathlen > 0 && path[pathlen] != '\\' ) {
       
   211 		--pathlen;
       
   212 	}
       
   213 	path[pathlen] = '\0';
       
   214 
       
   215 #ifdef _WIN32_WCE
       
   216 	wcsncpy( stdoutPath, path, SDL_arraysize(stdoutPath) );
       
   217 	wcsncat( stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
       
   218 #else
       
   219 	SDL_strlcpy( stdoutPath, path, SDL_arraysize(stdoutPath) );
       
   220 	SDL_strlcat( stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
       
   221 #endif
       
   222     
       
   223 	/* Redirect standard input and standard output */
       
   224 	newfp = freopen(stdoutPath, TEXT("w"), stdout);
       
   225 
       
   226 #ifndef _WIN32_WCE
       
   227 	if ( newfp == NULL ) {	/* This happens on NT */
       
   228 #if !defined(stdout)
       
   229 		stdout = fopen(stdoutPath, TEXT("w"));
       
   230 #else
       
   231 		newfp = fopen(stdoutPath, TEXT("w"));
       
   232 		if ( newfp ) {
       
   233 			*stdout = *newfp;
       
   234 		}
       
   235 #endif
       
   236 	}
       
   237 #endif /* _WIN32_WCE */
       
   238 
       
   239 #ifdef _WIN32_WCE
       
   240 	wcsncpy( stderrPath, path, SDL_arraysize(stdoutPath) );
       
   241 	wcsncat( stderrPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
       
   242 #else
       
   243 	SDL_strlcpy( stderrPath, path, SDL_arraysize(stderrPath) );
       
   244 	SDL_strlcat( stderrPath, DIR_SEPERATOR STDERR_FILE, SDL_arraysize(stderrPath) );
       
   245 #endif
       
   246 
       
   247 	newfp = freopen(stderrPath, TEXT("w"), stderr);
       
   248 #ifndef _WIN32_WCE
       
   249 	if ( newfp == NULL ) {	/* This happens on NT */
       
   250 #if !defined(stderr)
       
   251 		stderr = fopen(stderrPath, TEXT("w"));
       
   252 #else
       
   253 		newfp = fopen(stderrPath, TEXT("w"));
       
   254 		if ( newfp ) {
       
   255 			*stderr = *newfp;
       
   256 		}
       
   257 #endif
       
   258 	}
       
   259 #endif /* _WIN32_WCE */
       
   260 
       
   261 	setvbuf(stdout, NULL, _IOLBF, BUFSIZ);	/* Line buffered */
       
   262 	setbuf(stderr, NULL);			/* No buffering */
       
   263 	stdioRedirectEnabled = 1;
   195 }
   264 }
   196 
   265 
   197 #if defined(_MSC_VER) && !defined(_WIN32_WCE)
   266 #if defined(_MSC_VER) && !defined(_WIN32_WCE)
   198 /* The VC++ compiler needs main defined */
   267 /* The VC++ compiler needs main defined */
   199 #define console_main main
   268 #define console_main main
   261 {
   330 {
   262 	HINSTANCE handle;
   331 	HINSTANCE handle;
   263 	char **argv;
   332 	char **argv;
   264 	int argc;
   333 	int argc;
   265 	char *cmdline;
   334 	char *cmdline;
       
   335 	char *env_str;
   266 #ifdef _WIN32_WCE
   336 #ifdef _WIN32_WCE
   267 	wchar_t *bufp;
   337 	wchar_t *bufp;
   268 	int nLen;
   338 	int nLen;
   269 #else
   339 #else
   270 	char *bufp;
   340 	char *bufp;
   271 	size_t nLen;
   341 	size_t nLen;
   272 #endif
       
   273 #ifndef NO_STDIO_REDIRECT
       
   274 	DWORD pathlen;
       
   275 #ifdef _WIN32_WCE
       
   276 	wchar_t path[MAX_PATH];
       
   277 #else
       
   278 	char path[MAX_PATH];
       
   279 #endif
       
   280 	FILE *newfp;
       
   281 #endif
   342 #endif
   282 
   343 
   283 	/* Start up DDHELP.EXE before opening any files, so DDHELP doesn't
   344 	/* Start up DDHELP.EXE before opening any files, so DDHELP doesn't
   284 	   keep them open.  This is a hack.. hopefully it will be fixed 
   345 	   keep them open.  This is a hack.. hopefully it will be fixed 
   285 	   someday.  DDHELP.EXE starts up the first time DDRAW.DLL is loaded.
   346 	   someday.  DDHELP.EXE starts up the first time DDRAW.DLL is loaded.
   287 	handle = LoadLibrary(TEXT("DDRAW.DLL"));
   348 	handle = LoadLibrary(TEXT("DDRAW.DLL"));
   288 	if ( handle != NULL ) {
   349 	if ( handle != NULL ) {
   289 		FreeLibrary(handle);
   350 		FreeLibrary(handle);
   290 	}
   351 	}
   291 
   352 
       
   353 	/* Check for stdio redirect settings and do the redirection */
       
   354 	if ((env_str = SDL_getenv("SDL_STDIO_REDIRECT"))) {
       
   355 		if (SDL_atoi(env_str)) {
       
   356 			redirect_output();
       
   357 		}
       
   358 	}
   292 #ifndef NO_STDIO_REDIRECT
   359 #ifndef NO_STDIO_REDIRECT
   293 	pathlen = GetModuleFileName(NULL, path, SDL_arraysize(path));
   360 	else {
   294 	while ( pathlen > 0 && path[pathlen] != '\\' ) {
   361 		redirect_output();
   295 		--pathlen;
   362 	}
   296 	}
   363 #endif
   297 	path[pathlen] = '\0';
       
   298 
       
   299 #ifdef _WIN32_WCE
       
   300 	wcsncpy( stdoutPath, path, SDL_arraysize(stdoutPath) );
       
   301 	wcsncat( stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
       
   302 #else
       
   303 	SDL_strlcpy( stdoutPath, path, SDL_arraysize(stdoutPath) );
       
   304 	SDL_strlcat( stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
       
   305 #endif
       
   306     
       
   307 	/* Redirect standard input and standard output */
       
   308 	newfp = freopen(stdoutPath, TEXT("w"), stdout);
       
   309 
       
   310 #ifndef _WIN32_WCE
       
   311 	if ( newfp == NULL ) {	/* This happens on NT */
       
   312 #if !defined(stdout)
       
   313 		stdout = fopen(stdoutPath, TEXT("w"));
       
   314 #else
       
   315 		newfp = fopen(stdoutPath, TEXT("w"));
       
   316 		if ( newfp ) {
       
   317 			*stdout = *newfp;
       
   318 		}
       
   319 #endif
       
   320 	}
       
   321 #endif /* _WIN32_WCE */
       
   322 
       
   323 #ifdef _WIN32_WCE
       
   324 	wcsncpy( stderrPath, path, SDL_arraysize(stdoutPath) );
       
   325 	wcsncat( stderrPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
       
   326 #else
       
   327 	SDL_strlcpy( stderrPath, path, SDL_arraysize(stderrPath) );
       
   328 	SDL_strlcat( stderrPath, DIR_SEPERATOR STDERR_FILE, SDL_arraysize(stderrPath) );
       
   329 #endif
       
   330 
       
   331 	newfp = freopen(stderrPath, TEXT("w"), stderr);
       
   332 #ifndef _WIN32_WCE
       
   333 	if ( newfp == NULL ) {	/* This happens on NT */
       
   334 #if !defined(stderr)
       
   335 		stderr = fopen(stderrPath, TEXT("w"));
       
   336 #else
       
   337 		newfp = fopen(stderrPath, TEXT("w"));
       
   338 		if ( newfp ) {
       
   339 			*stderr = *newfp;
       
   340 		}
       
   341 #endif
       
   342 	}
       
   343 #endif /* _WIN32_WCE */
       
   344 
       
   345 	setvbuf(stdout, NULL, _IOLBF, BUFSIZ);	/* Line buffered */
       
   346 	setbuf(stderr, NULL);			/* No buffering */
       
   347 #endif /* !NO_STDIO_REDIRECT */
       
   348 
   364 
   349 #ifdef _WIN32_WCE
   365 #ifdef _WIN32_WCE
   350 	nLen = wcslen(szCmdLine)+128+1;
   366 	nLen = wcslen(szCmdLine)+128+1;
   351 	bufp = SDL_stack_alloc(wchar_t, nLen*2);
   367 	bufp = SDL_stack_alloc(wchar_t, nLen*2);
   352 	wcscpy (bufp, TEXT("\""));
   368 	wcscpy (bufp, TEXT("\""));