This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Quotes after --args


[Redirecting to gdb-patches@ from gdb@.]

> Date: Fri, 08 Jun 2012 17:50:07 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: gdb@sourceware.org
> 
> > Date: Fri, 08 Jun 2012 16:21:02 +0200
> > From: "Markus BÃhren" <bhr2@gmx.de>
> > 
> >   gdb --eval-command=run --batch --args test.exe -f "my testfile.txt"
> > 
> > My program should get two arguments, '-f' and 'my testfile.txt'. However, replacing my actual program test.exe by a program that just prints the input arguments, I get the following result:
> > 
> >   C:\>gdb --eval-command=run --batch --args test.exe -f "my testfile.txt"
> >   [New thread 6180.0xad0]
> >   argv[0] = >>C:/test.exe<<
> >   argv[1] = >>-f<<
> >   argv[2] = >>my\<<
> >   argv[3] = >>testfile.txt<<
> >   
> >   Program exited normally.
> > 
> > Can you help me to avoid that the file name is splitted into two arguments, with replacing the blank ' ' after 'my' by a backslash '\'? I have tried a lot of combinations of double double quotes '""', escaped double quotes '\"' and so on but I did not manage to get the file name passed as a single argument into my program.
> 
> It's a bug.  GDB handles the whitespace in a way that works on Posix
> platforms, but not on Windows.

Any objections to the patch below, which fixes this problem?  (I tried
to minimize uglifying the original sources; if someone sees a better
way, please tell.)


2012-06-09  Eli Zaretskii  <eliz@gnu.org>

	* infcmd.c (construct_inferior_arguments) [__MINGW32__]: Quote
	special characters correctly for the Windows shells.  See
	http://sourceware.org/ml/gdb/2012-06/msg00047.html for the bug
	report.

--- infcmd.c~0	2012-02-23 10:18:38.000000000 +0200
+++ infcmd.c	2012-06-09 17:20:57.750500000 +0300
@@ -275,10 +275,18 @@ construct_inferior_arguments (int argc, 
 
   if (STARTUP_WITH_SHELL)
     {
+#ifdef __MINGW32__
+      /* This holds all the characters considered special to the
+	 Windows shells.  */
+      char *special = "\"!&*|[]{}<>?`~^=;, \t\n";
+      const char quote = '"';
+#else
       /* This holds all the characters considered special to the
 	 typical Unix shells.  We include `^' because the SunOS
 	 /bin/sh treats it as a synonym for `|'.  */
       char *special = "\"!#$&*()\\|[]{}<>?'\"`~^; \t\n";
+      const char quote = '\'';
+#endif
       int i;
       int length = 0;
       char *out, *cp;
@@ -298,11 +306,20 @@ construct_inferior_arguments (int argc, 
 	  /* Need to handle empty arguments specially.  */
 	  if (argv[i][0] == '\0')
 	    {
-	      *out++ = '\'';
-	      *out++ = '\'';
+	      *out++ = quote;
+	      *out++ = quote;
 	    }
 	  else
 	    {
+#ifdef __MINGW32__
+	      int quoted = 0;
+
+	      if (strpbrk (argv[i], special))
+		{
+		  quoted = 1;
+		  *out++ = quote;
+		}
+#endif
 	      for (cp = argv[i]; *cp; ++cp)
 		{
 		  if (*cp == '\n')
@@ -310,17 +327,25 @@ construct_inferior_arguments (int argc, 
 		      /* A newline cannot be quoted with a backslash (it
 			 just disappears), only by putting it inside
 			 quotes.  */
-		      *out++ = '\'';
+		      *out++ = quote;
 		      *out++ = '\n';
-		      *out++ = '\'';
+		      *out++ = quote;
 		    }
 		  else
 		    {
+#ifdef __MINGW32__
+		      if (*cp == quote)
+#else
 		      if (strchr (special, *cp) != NULL)
+#endif
 			*out++ = '\\';
 		      *out++ = *cp;
 		    }
 		}
+#ifdef __MINGW32__
+	      if (quoted)
+		*out++ = quote;
+#endif
 	    }
 	}
       *out = '\0';


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]