Merged fix for bug #503 from SDL 1.2 revision 3487
authorSam Lantinga <slouken@libsdl.org>
Sat, 29 Dec 2007 19:29:20 +0000
changeset 2286 41a6675d8700
parent 2285 a5de28552be4
child 2287 15a242fca6c4
Merged fix for bug #503 from SDL 1.2 revision 3487
src/main/win32/SDL_win32_main.c
--- a/src/main/win32/SDL_win32_main.c	Sat Dec 29 06:17:31 2007 +0000
+++ b/src/main/win32/SDL_win32_main.c	Sat Dec 29 19:29:20 2007 +0000
@@ -25,14 +25,37 @@
 #define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t'))
 #endif /* _WIN32_WCE < 300 */
 
+static void
+UnEscapeQuotes(char *arg)
+{
+    char *last = NULL;
+
+    while (*arg) {
+        if (*arg == '"' && *last == '\\') {
+            char *c_curr = arg;
+            char *c_last = last;
+
+            while (*c_curr) {
+                *c_last = *c_curr;
+                c_last = c_curr;
+                c_curr++;
+            }
+            *c_last = '\0';
+        }
+        last = arg;
+        arg++;
+    }
+}
+
 /* Parse a command line buffer into arguments */
 static int
 ParseCommandLine(char *cmdline, char **argv)
 {
     char *bufp;
-    int argc;
+    char *lastp = NULL;
+    int argc, last_argc;
 
-    argc = 0;
+    argc = last_argc = 0;
     for (bufp = cmdline; *bufp;) {
         /* Skip leading whitespace */
         while (isspace(*bufp)) {
@@ -48,7 +71,8 @@
                 ++argc;
             }
             /* Skip over word */
-            while (*bufp && (*bufp != '"')) {
+            while (*bufp && (*bufp != '"' || *lastp == '\\')) {
+                lastp = bufp;
                 ++bufp;
             }
         } else {
@@ -69,6 +93,12 @@
             }
             ++bufp;
         }
+
+        /* Strip out \ from \" sequences */
+        if (argv && last_argc != argc) {
+            UnEscapeQuotes(argv[last_argc]);
+        }
+        last_argc = argc;
     }
     if (argv) {
         argv[argc] = NULL;