aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--job.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/job.c b/job.c
index 59e945a..954c0c9 100644
--- a/job.c
+++ b/job.c
@@ -1241,9 +1241,12 @@ construct_command_argv_internal (line, restp, shell, ifs)
if (instring)
{
- /* Inside a string, just copy any char except a closing quote. */
+ /* Inside a string, just copy any char except a closing quote
+ or a backslash-newline combination. */
if (*p == '\'')
instring = 0;
+ else if (*p == '\\' && p[1] == '\n')
+ goto swallow_escaped_newline;
else if (*p == '\n' && restp != NULL)
{
/* End of the command line. */
@@ -1275,6 +1278,8 @@ construct_command_argv_internal (line, restp, shell, ifs)
/* Backslash-newline combinations are eaten. */
if (p[1] == '\n')
{
+ swallow_escaped_newline:
+
/* Eat the backslash, the newline, and following whitespace,
replacing it all with a single space. */
p += 2;
@@ -1286,13 +1291,18 @@ construct_command_argv_internal (line, restp, shell, ifs)
if (*p == '\t')
strcpy (p, p + 1);
- if (ap != new_argv[i])
- /* Treat this as a space, ending the arg.
- But if it's at the beginning of the arg, it should
- just get eaten, rather than becoming an empty arg. */
- goto end_of_arg;
+ if (instring)
+ *ap++ = *p;
else
- p = next_token (p) - 1;
+ {
+ if (ap != new_argv[i])
+ /* Treat this as a space, ending the arg.
+ But if it's at the beginning of the arg, it should
+ just get eaten, rather than becoming an empty arg. */
+ goto end_of_arg;
+ else
+ p = next_token (p) - 1;
+ }
}
else if (p[1] != '\0')
/* Copy and skip the following char. */