test: fix "test !" and "test abc -a !". closes bug 465
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 16 Jul 2009 22:59:26 +0000 (00:59 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 16 Jul 2009 22:59:26 +0000 (00:59 +0200)
function                                             old     new   delta
nexpr                                                826     840     +14

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/test.c
testsuite/test.tests

index 73048d311de8d23297b1b9aa569c14c29629af8f..c430f221015004417cce4878077431b845ae28a2 100644 (file)
@@ -627,7 +627,14 @@ static number_t nexpr(enum token n)
 
        nest_msg(">nexpr(%s)\n", TOKSTR[n]);
        if (n == UNOT) {
-               res = !nexpr(check_operator(*++args));
+               n = check_operator(*++args);
+               if (n == EOI) {
+                       /* special case: [ ! ], [ a -a ! ] are valid */
+                       /* IOW, "! ARG" may miss ARG */
+                       unnest_msg("<nexpr:1 (!EOI)\n");
+                       return 1;
+               }
+               res = !nexpr(n);
                unnest_msg("<nexpr:%lld\n", res);
                return res;
        }
@@ -798,7 +805,7 @@ int test_main(int argc, char **argv)
                check_operator(argv[1]);
                if (last_operator->op_type == BINOP) {
                        /* "test [!] arg1 <binary_op> arg2" */
-                       args = &argv[0];
+                       args = argv;
                        res = (binop() == 0);
                        goto ret;
                }
@@ -811,7 +818,7 @@ int test_main(int argc, char **argv)
                argv--;
        }
 #endif
-       args = &argv[0];
+       args = argv;
        res = !oexpr(check_operator(*args));
 
        if (*args != NULL && *++args != NULL) {
index d4be949ecabe844e4e37fe9e9507fa5506df2dfb..b7c84d9b2699b707c7e258dc9cefebfd66a7b6e2 100755 (executable)
@@ -21,6 +21,11 @@ testing "test '': should be false (1)" \
        "1\n" \
        "" ""
 
+testing "test !: should be true (0)" \
+       "busybox test !; echo \$?" \
+       "0\n" \
+       "" ""
+
 testing "test a: should be true (0)" \
        "busybox test a; echo \$?" \
        "0\n" \
@@ -51,6 +56,11 @@ testing "test -lt = -gt: should be false (1)" \
        "1\n" \
        "" ""
 
+testing "test a -a !: should be true (0)" \
+       "busybox test a -a !; echo \$?" \
+       "0\n" \
+       "" ""
+
 testing "test -f = a -o b: should be true (0)" \
        "busybox test -f = a -o b; echo \$?" \
        "0\n" \