Patch from Colin Watson (mangled slightly by Rob Landley):
authorRob Landley <rob@landley.net>
Wed, 18 May 2005 06:34:37 +0000 (06:34 -0000)
committerRob Landley <rob@landley.net>
Wed, 18 May 2005 06:34:37 +0000 (06:34 -0000)
This patch implements the 'T' command in sed. This is a GNU extension,
but one of the udev hotplug scripts uses it, so I need it in busybox
anyway.

Includes a test; 'svn add testsuite/sed/sed-branch-conditional-inverted'
after applying.

editors/sed.c
testsuite/sed/sed-branch-conditional-inverted [new file with mode: 0755]

index 1b6ed2b0f745f5da6486220162ea34145cd2f4fb..a0a127e2b758f396cbccc320998e97e9e49a5e3d 100644 (file)
@@ -57,7 +57,7 @@
         - grouped commands: {cmd1;cmd2}
         - transliteration (y/source-chars/dest-chars/)
         - pattern space hold space storing / swapping (g, h, x)
-        - labels / branching (: label, b, t)
+        - labels / branching (: label, b, t, T)
 
         (Note: Specifying an address (range) to match is *optional*; commands
         default to the whole pattern space if no specific address match was
@@ -65,7 +65,7 @@
 
        Unsupported features:
 
-        - GNU extensions
+        - most GNU extensions
         - and more.
 
        Todo:
@@ -440,7 +440,7 @@ static char *parse_cmd_args(sed_cmd_t *sed_cmd, char *cmdstr)
                if(sed_cmd->cmd=='w')
                        sed_cmd->file=bb_xfopen(sed_cmd->string,"w");
        /* handle branch commands */
-       } else if (strchr(":bt", sed_cmd->cmd)) {
+       } else if (strchr(":btT", sed_cmd->cmd)) {
                int length;
 
                while(isspace(*cmdstr)) cmdstr++;
@@ -1000,11 +1000,15 @@ restart:
                                                break;
                                        }
 
-                                       /* Test if substition worked, branch if so. */
+                                       /* Test/branch if substitution occurred */
                                        case 't':
-                                               if (!substituted) break;
+                                               if(!substituted) break;
                                                substituted=0;
-                                                       /* Fall through */
+                                               /* Fall through */
+                                       /* Test/branch if substitution didn't occur */
+                                       case 'T':
+                                               if (substituted) break;
+                                               /* Fall through */
                                        /* Branch to label */
                                        case 'b':
                                                if (!sed_cmd->string) goto discard_commands;
diff --git a/testsuite/sed/sed-branch-conditional-inverted b/testsuite/sed/sed-branch-conditional-inverted
new file mode 100755 (executable)
index 0000000..f4df84b
--- /dev/null
@@ -0,0 +1,14 @@
+busybox sed 's/a/1/;T notone;p;: notone;p'>output <<EOF
+a
+b
+c
+EOF
+cmp -s output - <<EOF
+1
+1
+1
+b
+b
+c
+c
+EOF