(construct_command_argv_internal): Swallow backslash-newline combinations

inside '' strings too.
This commit is contained in:
Roland McGrath 1994-05-10 20:27:17 +00:00
parent 65d0cd98a9
commit e83c7d40cd

24
job.c
View file

@ -1241,9 +1241,12 @@ construct_command_argv_internal (line, restp, shell, ifs)
if (instring) 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 == '\'') if (*p == '\'')
instring = 0; instring = 0;
else if (*p == '\\' && p[1] == '\n')
goto swallow_escaped_newline;
else if (*p == '\n' && restp != NULL) else if (*p == '\n' && restp != NULL)
{ {
/* End of the command line. */ /* End of the command line. */
@ -1275,6 +1278,8 @@ construct_command_argv_internal (line, restp, shell, ifs)
/* Backslash-newline combinations are eaten. */ /* Backslash-newline combinations are eaten. */
if (p[1] == '\n') if (p[1] == '\n')
{ {
swallow_escaped_newline:
/* Eat the backslash, the newline, and following whitespace, /* Eat the backslash, the newline, and following whitespace,
replacing it all with a single space. */ replacing it all with a single space. */
p += 2; p += 2;
@ -1286,13 +1291,18 @@ construct_command_argv_internal (line, restp, shell, ifs)
if (*p == '\t') if (*p == '\t')
strcpy (p, p + 1); strcpy (p, p + 1);
if (ap != new_argv[i]) if (instring)
/* Treat this as a space, ending the arg. *ap++ = *p;
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 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') else if (p[1] != '\0')
/* Copy and skip the following char. */ /* Copy and skip the following char. */