commit 8311023781d0d150d29878d05d8b719c27877524
Author: sin <[email protected]>
Date:   Thu Oct 16 10:10:00 2014 +0100

    Fix test(1) semantics
    
    Evan Gates says:
    
    After writing my own test[0] I checked and sbase already has test. I'm
    including a patch to remove test from the TODO. I also noticed that
    sbase's test handles a few specific cases incorrectly (documentation
    at [1]).
    
    test ! = foo
    When there are 3 arguments and the second is a valid binary primary
    test should perform that binary test. Only if the second argument is
    not a valid binary primary and the first is ! should test negate the
    two argument test. I've attached a patch that should fix this.
    
    test ! ! !
    test ! ! ! !
    When there are 3 arguments and the second is not a valid primary and
    the first is !, test should return the negation of the remaining two
    argument test. In this case sbase's test works correctly for ! and ! !
    but fails afterwards as it's not recursive. I don't yet have a patch
    for this but I'm working on one.
    
    Then again both of these areas may be places in which worse is better.
    [0] 
https://bitbucket.org/emg/tidbits/src/11329f3834caad03f619f17c11cf3f530052ae74/test.c?at=master
    [1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html

diff --git a/TODO b/TODO
index 132dabe..969a09c 100644
--- a/TODO
+++ b/TODO
@@ -2,8 +2,6 @@ diff [-ru] file1 file2
 
 id [-ruGgn] username
 
-test [expression...]
-
 tr:
        support for character classes [:alnum:]
 
diff --git a/test.c b/test.c
index 2284ab0..57fff4b 100644
--- a/test.c
+++ b/test.c
@@ -7,6 +7,12 @@
 #include <sys/stat.h>
 #include "util.h"
 
+static char *optexts[] = {
+       "-eq", "-ge", "-gt",
+       "-le", "-lt", "-ne",
+       "=", "!="
+};
+
 static bool unary(const char *, const char *);
 static bool binary(const char *, const char *, const char *);
 
@@ -23,6 +29,7 @@ int
 main(int argc, char *argv[])
 {
        bool ret = false, not = false;
+       int i = LEN(optexts);
 
        argv0 = argv[0];
 
@@ -32,7 +39,11 @@ main(int argc, char *argv[])
                        usage();
                argc--;
        }
-       if(argc > 1 && !strcmp(argv[1], "!")) {
+       if(argc == 4)
+       for(i = 0; i < LEN(optexts); i++)
+               if(strcmp(argv[2], optexts[i]) == 0)
+                       break;
+       if(argc > 1 && !strcmp(argv[1], "!") && i == LEN(optexts)) {
                not = true;
                argv++;
                argc--;
@@ -118,11 +129,6 @@ binary(const char *arg1, const char *op, const char *arg2)
        int i;
        long narg1, narg2;
        enum operator { EQ, GE, GT, LE, LT, NE, STREQ, STRNE } oper;
-       char *optexts[] = {
-               "-eq", "-ge", "-gt",
-               "-le", "-lt", "-ne",
-               "=", "!="
-       };
 
        for (i = 0; i < LEN(optexts); i++) {
                if (strcmp(op, optexts[i]) != 0)


Reply via email to