From d78f2db327122165f4d3f471dc09781c585604ca Mon Sep 17 00:00:00 2001
From: Roland McGrath <roland@redhat.com>
Date: Wed, 12 Mar 1997 21:17:08 +0000
Subject: [PATCH] Mon Mar 10 23:47:02 1997  Andreas Schwab 
 <schwab@issan.informatik.uni-dortmund.de>

	* job.c (construct_command_argv_internal): Don't discard an
	explicit empty argument at the end of the command line.  In the
	slow case return immediately if the command line was empty.
---
 job.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/job.c b/job.c
index 04ff39e5..ba0e2466 100644
--- a/job.c
+++ b/job.c
@@ -1682,7 +1682,7 @@ construct_command_argv_internal (line, restp, shell, ifs)
   register char *p;
   register char *ap;
   char *end;
-  int instring, word_has_equals, seen_nonequals;
+  int instring, word_has_equals, seen_nonequals, last_argument_was_empty;
   char **new_argv = 0;
 #ifdef WIN32
   int slow_flag = 0;
@@ -1741,7 +1741,7 @@ construct_command_argv_internal (line, restp, shell, ifs)
 
   /* I is how many complete arguments have been found.  */
   i = 0;
-  instring = word_has_equals = seen_nonequals = 0;
+  instring = word_has_equals = seen_nonequals = last_argument_was_empty = 0;
   for (p = line; *p != '\0'; ++p)
     {
       if (ap > end)
@@ -1753,7 +1753,11 @@ construct_command_argv_internal (line, restp, shell, ifs)
 	  /* Inside a string, just copy any char except a closing quote
 	     or a backslash-newline combination.  */
 	  if (*p == instring)
-	    instring = 0;
+	    {
+	      instring = 0;
+	      if (*ap == '\0')
+		last_argument_was_empty = 1;
+	    }
 	  else if (*p == '\\' && p[1] == '\n')
 	    goto swallow_escaped_newline;
 	  else if (*p == '\n' && restp != NULL)
@@ -1846,6 +1850,7 @@ construct_command_argv_internal (line, restp, shell, ifs)
 	       Terminate the text of the argument.  */
 	    *ap++ = '\0';
 	    new_argv[++i] = ap;
+	    last_argument_was_empty = 0;
 
 	    /* Update SEEN_NONEQUALS, which tells us if every word
 	       heretofore has contained an `='.  */
@@ -1887,7 +1892,7 @@ construct_command_argv_internal (line, restp, shell, ifs)
   /* Terminate the last argument and the argument list.  */
 
   *ap = '\0';
-  if (new_argv[i][0] != '\0')
+  if (new_argv[i][0] != '\0' || last_argument_was_empty)
     ++i;
   new_argv[i] = 0;
 
@@ -2053,6 +2058,9 @@ construct_command_argv_internal (line, restp, shell, ifs)
 	  *ap++ = '\\';
 	*ap++ = *p;
       }
+    if (ap == new_line + shell_len + sizeof (minus_c) - 1)
+      /* Line was empty.  */
+      return 0;
     *ap = '\0';
 
     new_argv = construct_command_argv_internal (new_line, (char **) NULL,