sed: fix a command with multible trailing backslashes
No binary (build failed)
—
(log yok)
| @@ -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 */ | |
| @@ -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 | |
| @@ -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 | |