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

View File

@ -258,4 +258,18 @@ testing "sed nested {}s" \
"qwe\nasd\nacd\nacd\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

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

@ -73,7 +73,7 @@ testing()
if [ $# -ne 5 ]
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
fi