[BusyBox-cvs] busybox/editors sed.c,1.136,1.137
Glenn McGrath
bug1 at busybox.net
Sun Sep 14 06:01:19 UTC 2003
Update of /var/cvs/busybox/editors
In directory winder:/tmp/cvs-serv20444/editors
Modified Files:
sed.c
Log Message:
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
Index: sed.c
===================================================================
RCS file: /var/cvs/busybox/editors/sed.c,v
retrieving revision 1.136
retrieving revision 1.137
diff -u -d -r1.136 -r1.137
--- sed.c 14 Sep 2003 04:06:12 -0000 1.136
+++ sed.c 14 Sep 2003 06:01:14 -0000 1.137
@@ -475,9 +475,11 @@
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 @@
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 @@
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':{
More information about the busybox-cvs
mailing list