[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