Fix branching commands.
authorGlenn L McGrath <bug1@ihug.co.nz>
Sun, 14 Sep 2003 06:01:14 +0000 (06:01 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Sun, 14 Sep 2003 06:01:14 +0000 (06:01 -0000)
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

index 7174288a23dd501e8dacd7997b66dc47160bbb1e..aa3ce024ec8063fcce3c90f89c0df10b44cc7ac6 100644 (file)
@@ -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':{