Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
367 lines (327 loc) · 8.98 KB

SDL_win32_main.c

File metadata and controls

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