Mon Mar 10 23:47:02 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
authorRoland McGrath <roland@redhat.com>
Wed, 12 Mar 1997 21:17:08 +0000 (21:17 +0000)
committerRoland McGrath <roland@redhat.com>
Wed, 12 Mar 1997 21:17:08 +0000 (21:17 +0000)
* 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

diff --git a/job.c b/job.c
index 04ff39e59d010317c875f3f0ef9bd193e3da740d..ba0e24661f9ed6c9fccbc79f7c75a4f43ae97459 100644 (file)
--- 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,