aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2014-09-28 18:40:18 +0800
committerBen Hutchings <ben@decadent.org.uk>2020-03-28 21:42:54 +0000
commitb72377e6b73676c43bd0cff5eb202694a9c2b4ea (patch)
treebaa71592f0006faa08f849c934b37f15dcd9d4f8
parent8e4ecd111d7e780e24830ef28093677b30180f4e (diff)
downloadklibc-b72377e6b73676c43bd0cff5eb202694a9c2b4ea.tar.gz
[klibc] dash: [BUILTIN] Correctly handle test ! ! = !
[ dash commit 4f7e4c8201e580b9d31c09d8a484741072033c01 ] This patch adds a special case in testcmd for the 4-argument expression beginning with a !. Without this ! ! = ! is deemed a syntax error, which breaks POSIX. Note that this special case does not extend down into subexpressions so if ! ! = ! is used inside parentheses then a syntax error will still occur as before. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--usr/dash/bltin/test.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/usr/dash/bltin/test.c b/usr/dash/bltin/test.c
index baa91a57430c2..458e9f5555b10 100644
--- a/usr/dash/bltin/test.c
+++ b/usr/dash/bltin/test.c
@@ -177,7 +177,7 @@ testcmd(int argc, char **argv)
{
const struct t_op *op;
enum token n;
- int res;
+ int res = 1;
if (*argv[0] == '[') {
if (*argv[--argc] != ']')
@@ -185,11 +185,12 @@ testcmd(int argc, char **argv)
argv[argc] = NULL;
}
+recheck:
argv++;
argc--;
if (argc < 1)
- return 1;
+ return res;
/*
* POSIX prescriptions: he who wrote this deserves the Nobel
@@ -209,6 +210,9 @@ testcmd(int argc, char **argv)
argv[--argc] = NULL;
argv++;
argc--;
+ } else if (!strcmp(argv[0], "!")) {
+ res = 0;
+ goto recheck;
}
}
@@ -216,7 +220,7 @@ testcmd(int argc, char **argv)
eval:
t_wp = argv;
- res = !oexpr(n);
+ res ^= oexpr(n);
argv = t_wp;
if (argv[0] != NULL && argv[1] != NULL)