sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

commit 8311023781d0d150d29878d05d8b719c27877524
parent 4608d91c6d21fafe95bd167d754044c09aadb071
Author: sin <sin@2f30.org>
Date:   Thu, 16 Oct 2014 10:10:00 +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

Diffstat:
MTODO | 2--
Mtest.c | 18++++++++++++------
2 files changed, 12 insertions(+), 8 deletions(-)

diff --git 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 @@ -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)