aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2003-09-14 06:01:14 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2003-09-14 06:01:14 +0000
commitf4523562b615b8b2cfc8bcc7a962b4d0f5cb9168 (patch)
tree292257e3ebb8632bd292bf8a663c005aa36d1c0b
parent8aac05bfe5ffdbc4c9591d7d5b486c0af0769a7a (diff)
downloadbusybox-f4523562b615b8b2cfc8bcc7a962b4d0f5cb9168.tar.gz
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
-rw-r--r--editors/sed.c31
1 files 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':{