diff options
author | Glenn L McGrath | 2003-09-14 06:01:14 +0000 |
---|---|---|
committer | Glenn L McGrath | 2003-09-14 06:01:14 +0000 |
commit | f4523562b615b8b2cfc8bcc7a962b4d0f5cb9168 (patch) | |
tree | 292257e3ebb8632bd292bf8a663c005aa36d1c0b | |
parent | 8aac05bfe5ffdbc4c9591d7d5b486c0af0769a7a (diff) | |
download | busybox-f4523562b615b8b2cfc8bcc7a962b4d0f5cb9168.zip busybox-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.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/editors/sed.c b/editors/sed.c index 7174288..aa3ce02 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':{ |