sed: fix a command with multible trailing backslashes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2010-05-12 01:49:04 +02:00
parent 94043e8ad2
commit a2215b98f7
3 changed files with 23 additions and 7 deletions

View File

@ -487,7 +487,7 @@ static const char *parse_cmd_args(sed_cmd_t *sed_cmd, const char *cmdstr)
static void add_cmd(const char *cmdstr) static void add_cmd(const char *cmdstr)
{ {
sed_cmd_t *sed_cmd; sed_cmd_t *sed_cmd;
int temp; unsigned len, n;
/* Append this line to any unfinished line from last time. */ /* Append this line to any unfinished line from last time. */
if (G.add_cmd_line) { if (G.add_cmd_line) {
@ -496,12 +496,14 @@ static void add_cmd(const char *cmdstr)
cmdstr = G.add_cmd_line = tp; cmdstr = G.add_cmd_line = tp;
} }
/* If this line ends with backslash, request next line. */ /* If this line ends with unescaped backslash, request next line. */
temp = strlen(cmdstr); n = len = strlen(cmdstr);
if (temp && cmdstr[--temp] == '\\') { while (n && cmdstr[n-1] == '\\')
n--;
if ((len - n) & 1) { /* if odd number of trailing backslashes */
if (!G.add_cmd_line) if (!G.add_cmd_line)
G.add_cmd_line = xstrdup(cmdstr); G.add_cmd_line = xstrdup(cmdstr);
G.add_cmd_line[temp] = '\0'; G.add_cmd_line[len-1] = '\0';
return; return;
} }
@ -560,7 +562,7 @@ static void add_cmd(const char *cmdstr)
/* last part (mandatory) will be a command */ /* last part (mandatory) will be a command */
if (!*cmdstr) if (!*cmdstr)
bb_error_msg_and_die("missing command"); bb_error_msg_and_die("missing command");
sed_cmd->cmd = *(cmdstr++); sed_cmd->cmd = *cmdstr++;
cmdstr = parse_cmd_args(sed_cmd, cmdstr); cmdstr = parse_cmd_args(sed_cmd, cmdstr);
/* Add the command to the command array */ /* Add the command to the command array */

View File

@ -258,4 +258,18 @@ testing "sed nested {}s" \
"qwe\nasd\nacd\nacd\n" "" \ "qwe\nasd\nacd\nacd\n" "" \
"qwe\nasd\nzxc\n" "qwe\nasd\nzxc\n"
testing "sed a cmd ended by double backslash" \
"sed -e '/| one /a \\
| three \\\\' -e '/| one-/a \\
| three-* \\\\'" \
' | one \\
| three \\
| two \\
' '' \
' | one \\
| two \\
'
# testing "description" "arguments" "result" "infile" "stdin"
exit $FAILCOUNT exit $FAILCOUNT

2
testsuite/testing.sh Executable file → Normal file
View File

@ -73,7 +73,7 @@ testing()
if [ $# -ne 5 ] if [ $# -ne 5 ]
then then
echo "Test $NAME has wrong number of arguments (must be 5) ($# $*)" >&2 echo "Test $NAME has wrong number of arguments: $# (must be 5)" >&2
exit 1 exit 1
fi fi