diff options
author | Roland McGrath <roland@redhat.com> | 1994-05-10 20:27:17 +0000 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 1994-05-10 20:27:17 +0000 |
commit | e83c7d40cd1c05a663ec50d4b3f1f30a951571b5 (patch) | |
tree | 110806309cdd1b2346f479736ee1b4ab55d58b8c | |
parent | 65d0cd98a9fc51a4737c1e160eaf39207e47bda0 (diff) | |
download | gunmake-e83c7d40cd1c05a663ec50d4b3f1f30a951571b5.tar.gz |
(construct_command_argv_internal): Swallow backslash-newline combinations
inside '' strings too.
-rw-r--r-- | job.c | 24 |
1 files changed, 17 insertions, 7 deletions
@@ -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. */ |