From f4523562b615b8b2cfc8bcc7a962b4d0f5cb9168 Mon Sep 17 00:00:00 2001 From: Glenn L McGrath Date: Sun, 14 Sep 2003 06:01:14 +0000 Subject: [PATCH] Fix branching commands. If a label isnt specified, jump to end of script, not the last command in the script. Print an error and exit if you try and jump to a non-existant label Works for the following testcase # cat strings a b c d e f g # cat strings | ./busybox sed -n '/d/b;p' a b c e f g --- editors/sed.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/editors/sed.c b/editors/sed.c index 7174288a2..aa3ce024e 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -475,9 +475,11 @@ static char *parse_cmd_str(sed_cmd_t * sed_cmd, char *cmdstr) int length; cmdstr += strspn(cmdstr, " "); - length = strcspn(cmdstr, "; \n"); - sed_cmd->label = strndup(cmdstr, length); - cmdstr += length; + length = strcspn(cmdstr, semicolon_whitespace); + if (length) { + sed_cmd->label = strndup(cmdstr, length); + cmdstr += length; + } } /* translation command */ else if (sed_cmd->cmd == 'y') { @@ -771,13 +773,11 @@ static sed_cmd_t *branch_to(const char *label) sed_cmd_t *sed_cmd; for (sed_cmd = sed_cmd_head.next; sed_cmd; sed_cmd = sed_cmd->next) { - if ((sed_cmd->label) && (strcmp(sed_cmd->label, label) == 0)) { - break; + if ((sed_cmd->cmd == ':') && (sed_cmd->label) && (strcmp(sed_cmd->label, label) == 0)) { + return (sed_cmd); } } - - /* If no match returns last command */ - return (sed_cmd); + bb_error_msg_and_die("Can't find label for jump to `%s'", label); } static void process_file(FILE * file) @@ -998,12 +998,17 @@ static void process_file(FILE * file) linenum++; } break; - case 'b': - sed_cmd = branch_to(sed_cmd->label); - break; case 't': - if (substituted) { - sed_cmd = branch_to(sed_cmd->label); + if (substituted) + /* Fall through */ + case 'b': + { + if (sed_cmd->label == NULL) { + /* Jump to end of script */ + deleted = 1; + } else { + sed_cmd = branch_to(sed_cmd->label); + } } break; case 'y':{