From d78f2db327122165f4d3f471dc09781c585604ca Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 12 Mar 1997 21:17:08 +0000 Subject: Mon Mar 10 23:47:02 1997 Andreas Schwab * 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 04ff39e..ba0e246 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, -- cgit v1.2.3