changeset 4118:3c068a8c016f SDL-1.2

Tony White fixed bug #503 Support escaped quotes on Win32 command lines.
author Sam Lantinga <slouken@libsdl.org>
date Sat, 29 Dec 2007 18:58:09 +0000
parents dbb5f9556796
children 98dee075dae0
files src/main/win32/SDL_win32_main.c
diffstat 1 files changed, 32 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/win32/SDL_win32_main.c	Sat Dec 29 18:50:33 2007 +0000
+++ b/src/main/win32/SDL_win32_main.c	Sat Dec 29 18:58:09 2007 +0000
@@ -53,13 +53,35 @@
 #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) ) {
@@ -75,7 +97,8 @@
 				++argc;
 			}
 			/* Skip over word */
-			while ( *bufp && (*bufp != '"') ) {
+			while ( *bufp && ( *bufp != '"' || *lastp == '\\' ) ) {
+				lastp = bufp;
 				++bufp;
 			}
 		} else {
@@ -96,6 +119,12 @@
 			}
 			++bufp;
 		}
+
+		/* Strip out \ from \" sequences */
+		if( argv && last_argc != argc ) {
+			UnEscapeQuotes( argv[last_argc] );	
+		}
+		last_argc = argc;	
 	}
 	if ( argv ) {
 		argv[argc] = NULL;