comparison src/main/windows/SDL_windows_main.c @ 5062:e8916fe9cfc8

Fixed bug #925 Changed "win32" to "windows"
author Sam Lantinga <slouken@libsdl.org>
date Thu, 20 Jan 2011 18:04:05 -0800
parents src/main/win32/SDL_win32_main.c@ae7799d16c87
children
comparison
equal deleted inserted replaced
5061:9e9940eae455 5062:e8916fe9cfc8
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 <stdlib.h>
9
10 #define WIN32_LEAN_AND_MEAN
11 #include <windows.h>
12
13 /* Include the SDL main definition header */
14 #include "SDL.h"
15 #include "SDL_main.h"
16
17 #ifdef main
18 # ifndef _WIN32_WCE_EMULATION
19 # undef main
20 # endif /* _WIN32_WCE_EMULATION */
21 #endif /* main */
22
23 #if defined(_WIN32_WCE) && _WIN32_WCE < 300
24 /* seems to be undefined in Win CE although in online help */
25 #define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t'))
26 #endif /* _WIN32_WCE < 300 */
27
28 static void
29 UnEscapeQuotes(char *arg)
30 {
31 char *last = NULL;
32
33 while (*arg) {
34 if (*arg == '"' && *last == '\\') {
35 char *c_curr = arg;
36 char *c_last = last;
37
38 while (*c_curr) {
39 *c_last = *c_curr;
40 c_last = c_curr;
41 c_curr++;
42 }
43 *c_last = '\0';
44 }
45 last = arg;
46 arg++;
47 }
48 }
49
50 /* Parse a command line buffer into arguments */
51 static int
52 ParseCommandLine(char *cmdline, char **argv)
53 {
54 char *bufp;
55 char *lastp = NULL;
56 int argc, last_argc;
57
58 argc = last_argc = 0;
59 for (bufp = cmdline; *bufp;) {
60 /* Skip leading whitespace */
61 while (isspace(*bufp)) {
62 ++bufp;
63 }
64 /* Skip over argument */
65 if (*bufp == '"') {
66 ++bufp;
67 if (*bufp) {
68 if (argv) {
69 argv[argc] = bufp;
70 }
71 ++argc;
72 }
73 /* Skip over word */
74 lastp = bufp;
75 while (*bufp && (*bufp != '"' || *lastp == '\\')) {
76 lastp = bufp;
77 ++bufp;
78 }
79 } else {
80 if (*bufp) {
81 if (argv) {
82 argv[argc] = bufp;
83 }
84 ++argc;
85 }
86 /* Skip over word */
87 while (*bufp && !isspace(*bufp)) {
88 ++bufp;
89 }
90 }
91 if (*bufp) {
92 if (argv) {
93 *bufp = '\0';
94 }
95 ++bufp;
96 }
97
98 /* Strip out \ from \" sequences */
99 if (argv && last_argc != argc) {
100 UnEscapeQuotes(argv[last_argc]);
101 }
102 last_argc = argc;
103 }
104 if (argv) {
105 argv[argc] = NULL;
106 }
107 return (argc);
108 }
109
110 /* Show an error message */
111 static void
112 ShowError(const char *title, const char *message)
113 {
114 /* If USE_MESSAGEBOX is defined, you need to link with user32.lib */
115 #ifdef USE_MESSAGEBOX
116 MessageBox(NULL, message, title, MB_ICONEXCLAMATION | MB_OK);
117 #else
118 fprintf(stderr, "%s: %s\n", title, message);
119 #endif
120 }
121
122 /* Pop up an out of memory message, returns to Windows */
123 static BOOL
124 OutOfMemory(void)
125 {
126 ShowError("Fatal Error", "Out of memory - aborting");
127 return FALSE;
128 }
129
130 #if defined(_MSC_VER) && !defined(_WIN32_WCE)
131 /* The VC++ compiler needs main defined */
132 #define console_main main
133 #endif
134
135 /* This is where execution begins [console apps] */
136 int
137 console_main(int argc, char *argv[])
138 {
139 int status;
140
141 /* Run the application main() code */
142 status = SDL_main(argc, argv);
143
144 /* Exit cleanly, calling atexit() functions */
145 exit(status);
146
147 /* Hush little compiler, don't you cry... */
148 return 0;
149 }
150
151 /* This is where execution begins [windowed apps] */
152 int WINAPI
153 WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR szCmdLine, int sw)
154 {
155 char **argv;
156 int argc;
157 char *cmdline;
158 #ifdef _WIN32_WCE
159 wchar_t *bufp;
160 int nLen;
161 #else
162 char *bufp;
163 size_t nLen;
164 #endif
165
166 #ifdef _WIN32_WCE
167 nLen = wcslen(szCmdLine) + 128 + 1;
168 bufp = SDL_stack_alloc(wchar_t, nLen * 2);
169 wcscpy(bufp, TEXT("\""));
170 GetModuleFileName(NULL, bufp + 1, 128 - 3);
171 wcscpy(bufp + wcslen(bufp), TEXT("\" "));
172 wcsncpy(bufp + wcslen(bufp), szCmdLine, nLen - wcslen(bufp));
173 nLen = wcslen(bufp) + 1;
174 cmdline = SDL_stack_alloc(char, nLen);
175 if (cmdline == NULL) {
176 return OutOfMemory();
177 }
178 WideCharToMultiByte(CP_ACP, 0, bufp, -1, cmdline, nLen, NULL, NULL);
179 #else
180 /* Grab the command line */
181 bufp = GetCommandLine();
182 nLen = SDL_strlen(bufp) + 1;
183 cmdline = SDL_stack_alloc(char, nLen);
184 if (cmdline == NULL) {
185 return OutOfMemory();
186 }
187 SDL_strlcpy(cmdline, bufp, nLen);
188 #endif
189
190 /* Parse it into argv and argc */
191 argc = ParseCommandLine(cmdline, NULL);
192 argv = SDL_stack_alloc(char *, argc + 1);
193 if (argv == NULL) {
194 return OutOfMemory();
195 }
196 ParseCommandLine(cmdline, argv);
197
198 /* Run the main program */
199 console_main(argc, argv);
200
201 /* Hush little compiler, don't you cry... */
202 return 0;
203 }
204
205 /* vi: set ts=4 sw=4 expandtab: */