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] 11329f3834/test.c
[1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
This commit is contained in:
parent
4608d91c6d
commit
8311023781
2
TODO
2
TODO
@ -2,8 +2,6 @@ diff [-ru] file1 file2
|
|||||||
|
|
||||||
id [-ruGgn] username
|
id [-ruGgn] username
|
||||||
|
|
||||||
test [expression...]
|
|
||||||
|
|
||||||
tr:
|
tr:
|
||||||
support for character classes [:alnum:]
|
support for character classes [:alnum:]
|
||||||
|
|
||||||
|
18
test.c
18
test.c
@ -7,6 +7,12 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
static char *optexts[] = {
|
||||||
|
"-eq", "-ge", "-gt",
|
||||||
|
"-le", "-lt", "-ne",
|
||||||
|
"=", "!="
|
||||||
|
};
|
||||||
|
|
||||||
static bool unary(const char *, const char *);
|
static bool unary(const char *, const char *);
|
||||||
static bool binary(const char *, const char *, const char *);
|
static bool binary(const char *, const char *, const char *);
|
||||||
|
|
||||||
@ -23,6 +29,7 @@ int
|
|||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
bool ret = false, not = false;
|
bool ret = false, not = false;
|
||||||
|
int i = LEN(optexts);
|
||||||
|
|
||||||
argv0 = argv[0];
|
argv0 = argv[0];
|
||||||
|
|
||||||
@ -32,7 +39,11 @@ main(int argc, char *argv[])
|
|||||||
usage();
|
usage();
|
||||||
argc--;
|
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;
|
not = true;
|
||||||
argv++;
|
argv++;
|
||||||
argc--;
|
argc--;
|
||||||
@ -118,11 +129,6 @@ binary(const char *arg1, const char *op, const char *arg2)
|
|||||||
int i;
|
int i;
|
||||||
long narg1, narg2;
|
long narg1, narg2;
|
||||||
enum operator { EQ, GE, GT, LE, LT, NE, STREQ, STRNE } oper;
|
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++) {
|
for (i = 0; i < LEN(optexts); i++) {
|
||||||
if (strcmp(op, optexts[i]) != 0)
|
if (strcmp(op, optexts[i]) != 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user