Added ability to negate interpretation of the exit code.

Change-Id: Ica77a10d854f247921e6adb74f8da65de0c79c8a
diff --git a/utils/stc/src/main/java/org/onlab/stc/StepProcessor.java b/utils/stc/src/main/java/org/onlab/stc/StepProcessor.java
index 1dcff28..4994369 100644
--- a/utils/stc/src/main/java/org/onlab/stc/StepProcessor.java
+++ b/utils/stc/src/main/java/org/onlab/stc/StepProcessor.java
@@ -35,6 +35,8 @@
 class StepProcessor implements Runnable {
 
     private static final String IGNORE_CODE = "~";
+    private static final String NEGATE_CODE = "!";
+
     private static final int FAIL = -1;
 
     static String launcher = "stc-launcher ";
@@ -67,7 +69,9 @@
         delegate.onStart(step, command);
         int code = execute();
         boolean ignoreCode = step.env() != null && step.env.equals(IGNORE_CODE);
-        Status status = ignoreCode || code == 0 ? SUCCEEDED : FAILED;
+        boolean negateCode = step.env() != null && step.env.equals(NEGATE_CODE);
+        Status status = ignoreCode || code == 0 && !negateCode || code != 0 && negateCode ?
+                SUCCEEDED : FAILED;
         delegate.onCompletion(step, status);
     }