summaryrefslogtreecommitdiff
path: root/apps/plugins/sdl/progs/wolf3d/sdl_winmain.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2019-07-07 22:00:20 -0400
committerFranklin Wei <git@fwei.tk>2019-07-09 11:20:55 -0400
commit3f59fc8b771625aca9c3aefe03cf1038d8461963 (patch)
treee0623a323613baa0b0993411b38bcaed144b27ed /apps/plugins/sdl/progs/wolf3d/sdl_winmain.c
parent439a0d1d91fa040d261fc39b87278bc9f5391dcc (diff)
downloadrockbox-3f59fc8b771625aca9c3aefe03cf1038d8461963.tar.gz
rockbox-3f59fc8b771625aca9c3aefe03cf1038d8461963.zip
Wolfenstein 3-D!
This is a port of Wolf4SDL, which is derived from the original id software source release. The port runs on top of the SDL plugin runtime and is loaded as an overlay. Licensing of the game code is not an issue, as discussed below (essentially, the Debian project treats Wolf4SDL as GPLv2, with an email from John Carmack backing it up): http://forums.rockbox.org/index.php?topic=52872 Included is a copy of MAME's Yamaha OPL sound chip emulator (fmopl_gpl.c). This file was not part of the original Wolf4SDL source (which includes a non-GPL'd version), but was rather rebased from from a later MAME source which had been relicensed to GPLv2. Change-Id: I64c2ba035e0be7e2f49252f40640641416613439
Diffstat (limited to 'apps/plugins/sdl/progs/wolf3d/sdl_winmain.c')
-rw-r--r--apps/plugins/sdl/progs/wolf3d/sdl_winmain.c378
1 files changed, 378 insertions, 0 deletions
diff --git a/apps/plugins/sdl/progs/wolf3d/sdl_winmain.c b/apps/plugins/sdl/progs/wolf3d/sdl_winmain.c
new file mode 100644
index 0000000000..366616d5ff
--- /dev/null
+++ b/apps/plugins/sdl/progs/wolf3d/sdl_winmain.c
@@ -0,0 +1,378 @@
1#ifdef _WIN32
2
3/*
4 SDL_main.c, placed in the public domain by Sam Lantinga 4/13/98
5
6 Modified to write stdout/stderr to a message box at shutdown by Ripper 2007-12-27
7
8 The WinMain function -- calls your program's main() function
9*/
10
11#include <stdio.h>
12#include <stdlib.h>
13
14#define WIN32_LEAN_AND_MEAN
15#include <windows.h>
16
17#ifdef _WIN32_WCE
18# define DIR_SEPERATOR TEXT("\\")
19# undef _getcwd
20# define _getcwd(str,len) wcscpy(str,TEXT(""))
21# define setbuf(f,b)
22# define setvbuf(w,x,y,z)
23# define fopen _wfopen
24# define freopen _wfreopen
25# define remove(x) DeleteFile(x)
26#else
27# define DIR_SEPERATOR TEXT("/")
28# include <direct.h>
29#endif
30
31/* Include the SDL main definition header */
32#include "SDL.h"
33#include "SDL_main.h"
34
35#ifdef main
36# ifndef _WIN32_WCE_EMULATION
37# undef main
38# endif /* _WIN32_WCE_EMULATION */
39#endif /* main */
40
41/* The standard output files */
42#define STDOUT_FILE TEXT("stdout.txt")
43#define STDERR_FILE TEXT("stderr.txt")
44
45#ifndef NO_STDIO_REDIRECT
46# ifdef _WIN32_WCE
47 static wchar_t stdoutPath[MAX_PATH];
48 static wchar_t stderrPath[MAX_PATH];
49# else
50 static char stdoutPath[MAX_PATH];
51 static char stderrPath[MAX_PATH];
52# endif
53#endif
54
55#if defined(_WIN32_WCE) && _WIN32_WCE < 300
56/* seems to be undefined in Win CE although in online help */
57#define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t'))
58#endif /* _WIN32_WCE < 300 */
59
60/* Parse a command line buffer into arguments */
61static int ParseCommandLine(char *cmdline, char **argv)
62{
63 char *bufp;
64 int argc;
65
66 argc = 0;
67 for ( bufp = cmdline; *bufp; ) {
68 /* Skip leading whitespace */
69 while ( isspace(*bufp) ) {
70 ++bufp;
71 }
72 /* Skip over argument */
73 if ( *bufp == '"' ) {
74 ++bufp;
75 if ( *bufp ) {
76 if ( argv ) {
77 argv[argc] = bufp;
78 }
79 ++argc;
80 }
81 /* Skip over word */
82 while ( *bufp && (*bufp != '"') ) {
83 ++bufp;
84 }
85 } else {
86 if ( *bufp ) {
87 if ( argv ) {
88 argv[argc] = bufp;
89 }
90 ++argc;
91 }
92 /* Skip over word */
93 while ( *bufp && ! isspace(*bufp) ) {
94 ++bufp;
95 }
96 }
97 if ( *bufp ) {
98 if ( argv ) {
99 *bufp = '\0';
100 }
101 ++bufp;
102 }
103 }
104 if ( argv ) {
105 argv[argc] = NULL;
106 }
107 return(argc);
108}
109
110/* Show an error message */
111static void ShowError(const char *title, const char *message)
112{
113/* If USE_MESSAGEBOX is defined, you need to link with user32.lib */
114#ifdef USE_MESSAGEBOX
115 MessageBox(NULL, message, title, MB_ICONEXCLAMATION|MB_OK);
116#else
117 fprintf(stderr, "%s: %s\n", title, message);
118#endif
119}
120
121/* Pop up an out of memory message, returns to Windows */
122static bool OutOfMemory(void)
123{
124 ShowError("Fatal Error", "Out of memory - aborting");
125 return FALSE;
126}
127
128/* SDL_Quit() shouldn't be used with atexit() directly because
129 calling conventions may differ... */
130static void cleanup(void)
131{
132 SDL_Quit();
133}
134
135/* Remove the output files if there was no output written */
136static void cleanup_output(void)
137{
138#if 1
139#ifndef NO_STDIO_REDIRECT
140 FILE *file;
141#endif
142#endif
143
144 /* Flush the output in case anything is queued */
145 fclose(stdout);
146 fclose(stderr);
147
148#if 1
149#ifndef NO_STDIO_REDIRECT
150 /* See if the files have any output in them */
151 if ( stdoutPath[0] ) {
152 file = fopen(stdoutPath, TEXT("r"));
153 if ( file ) {
154 char buf[16384];
155 size_t readbytes = fread(buf, 1, 16383, file);
156 fclose(file);
157
158 if(readbytes != 0)
159 {
160 buf[readbytes] = 0; // cut after last byte (<=16383)
161 MessageBox(NULL, buf, "Wolf4SDL", MB_OK);
162 }
163 else
164 remove(stdoutPath); // remove empty file
165 }
166 }
167 if ( stderrPath[0] ) {
168 file = fopen(stderrPath, TEXT("rb"));
169 if ( file ) {
170 char buf[16384];
171 size_t readbytes = fread(buf, 1, 16383, file);
172 fclose(file);
173
174 if(readbytes != 0)
175 {
176 buf[readbytes] = 0; // cut after last byte (<=16383)
177 MessageBox(NULL, buf, "Wolf4SDL", MB_OK);
178 }
179 else
180 remove(stderrPath); // remove empty file
181 }
182 }
183#endif
184#endif
185}
186
187//#if defined(_MSC_VER) && !defined(_WIN32_WCE)
188///* The VC++ compiler needs main defined */
189//#define console_main main
190//#endif
191
192/* This is where execution begins [console apps] */
193int console_main(int argc, char *argv[])
194{
195 size_t n;
196 char *bufp, *appname;
197 int status;
198
199 /* Get the class name from argv[0] */
200 appname = argv[0];
201 if ( (bufp=SDL_strrchr(argv[0], '\\')) != NULL ) {
202 appname = bufp+1;
203 } else
204 if ( (bufp=SDL_strrchr(argv[0], '/')) != NULL ) {
205 appname = bufp+1;
206 }
207
208 if ( (bufp=SDL_strrchr(appname, '.')) == NULL )
209 n = SDL_strlen(appname);
210 else
211 n = (bufp-appname);
212
213 bufp = SDL_stack_alloc(char, n+1);
214 if ( bufp == NULL ) {
215 return OutOfMemory();
216 }
217 SDL_strlcpy(bufp, appname, n+1);
218 appname = bufp;
219
220 /* Load SDL dynamic link library */
221 if ( SDL_Init(SDL_INIT_NOPARACHUTE) < 0 ) {
222 ShowError("WinMain() error", SDL_GetError());
223 return(FALSE);
224 }
225 atexit(cleanup_output);
226 atexit(cleanup);
227
228 /* Sam:
229 We still need to pass in the application handle so that
230 DirectInput will initialize properly when SDL_RegisterApp()
231 is called later in the video initialization.
232 */
233 SDL_SetModuleHandle(GetModuleHandle(NULL));
234
235 /* Run the application main() code */
236 status = SDL_main(argc, argv);
237
238 /* Exit cleanly, calling atexit() functions */
239 exit(status);
240
241 /* Hush little compiler, don't you cry... */
242 return 0;
243}
244
245/* This is where execution begins [windowed apps] */
246#ifdef _WIN32_WCE
247int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPWSTR szCmdLine, int sw)
248#else
249int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
250#endif
251{
252 HINSTANCE handle;
253 char **argv;
254 int argc;
255 char *cmdline;
256#ifdef _WIN32_WCE
257 wchar_t *bufp;
258 int nLen;
259#else
260 char *bufp;
261 size_t nLen;
262#endif
263#ifndef NO_STDIO_REDIRECT
264 DWORD pathlen;
265#ifdef _WIN32_WCE
266 wchar_t path[MAX_PATH];
267#else
268 char path[MAX_PATH];
269#endif
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 pathlen = GetModuleFileName(NULL, path, SDL_arraysize(path));
284 while ( pathlen > 0 && path[pathlen] != '\\' ) {
285 --pathlen;
286 }
287 path[pathlen] = '\0';
288
289#ifdef _WIN32_WCE
290 wcsncpy( stdoutPath, path, SDL_arraysize(stdoutPath) );
291 wcsncat( stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
292#else
293 SDL_strlcpy( stdoutPath, path, SDL_arraysize(stdoutPath) );
294 SDL_strlcat( stdoutPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
295#endif
296
297 /* Redirect standard input and standard output */
298 newfp = freopen(stdoutPath, TEXT("w"), stdout);
299
300#ifndef _WIN32_WCE
301 if ( newfp == NULL ) { /* This happens on NT */
302#if !defined(stdout)
303 stdout = fopen(stdoutPath, TEXT("w"));
304#else
305 newfp = fopen(stdoutPath, TEXT("w"));
306 if ( newfp ) {
307 *stdout = *newfp;
308 }
309#endif
310 }
311#endif /* _WIN32_WCE */
312
313#ifdef _WIN32_WCE
314 wcsncpy( stderrPath, path, SDL_arraysize(stdoutPath) );
315 wcsncat( stderrPath, DIR_SEPERATOR STDOUT_FILE, SDL_arraysize(stdoutPath) );
316#else
317 SDL_strlcpy( stderrPath, path, SDL_arraysize(stderrPath) );
318 SDL_strlcat( stderrPath, DIR_SEPERATOR STDERR_FILE, SDL_arraysize(stderrPath) );
319#endif
320
321 newfp = freopen(stderrPath, TEXT("w"), stderr);
322#ifndef _WIN32_WCE
323 if ( newfp == NULL ) { /* This happens on NT */
324#if !defined(stderr)
325 stderr = fopen(stderrPath, TEXT("w"));
326#else
327 newfp = fopen(stderrPath, TEXT("w"));
328 if ( newfp ) {
329 *stderr = *newfp;
330 }
331#endif
332 }
333#endif /* _WIN32_WCE */
334
335 setvbuf(stdout, NULL, _IOLBF, BUFSIZ); /* Line buffered */
336 setbuf(stderr, NULL); /* No buffering */
337#endif /* !NO_STDIO_REDIRECT */
338
339#ifdef _WIN32_WCE
340 nLen = wcslen(szCmdLine)+128+1;
341 bufp = SDL_stack_alloc(wchar_t, nLen*2);
342 wcscpy (bufp, TEXT("\""));
343 GetModuleFileName(NULL, bufp+1, 128-3);
344 wcscpy (bufp+wcslen(bufp), TEXT("\" "));
345 wcsncpy(bufp+wcslen(bufp), szCmdLine,nLen-wcslen(bufp));
346 nLen = wcslen(bufp)+1;
347 cmdline = SDL_stack_alloc(char, nLen);
348 if ( cmdline == NULL ) {
349 return OutOfMemory();
350 }
351 WideCharToMultiByte(CP_ACP, 0, bufp, -1, cmdline, nLen, NULL, NULL);
352#else
353 /* Grab the command line */
354 bufp = GetCommandLine();
355 nLen = SDL_strlen(bufp)+1;
356 cmdline = SDL_stack_alloc(char, nLen);
357 if ( cmdline == NULL ) {
358 return OutOfMemory();
359 }
360 SDL_strlcpy(cmdline, bufp, nLen);
361#endif
362
363 /* Parse it into argv and argc */
364 argc = ParseCommandLine(cmdline, NULL);
365 argv = SDL_stack_alloc(char*, argc+1);
366 if ( argv == NULL ) {
367 return OutOfMemory();
368 }
369 ParseCommandLine(cmdline, argv);
370
371 /* Run the main program (after a little SDL initialization) */
372 console_main(argc, argv);
373
374 /* Hush little compiler, don't you cry... */
375 return 0;
376}
377
378#endif // _WIN32