[klibc] [klibc:update-dash] [BUILTIN] Correctly handle test ! ! = !
klibc-bot for Herbert Xu
herbert at gondor.apana.org.au
Thu Jan 24 19:15:13 PST 2019
Commit-ID: 4061dd0658545bd7ea6a677663e31be9ee7f57cb
Gitweb: http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=4061dd0658545bd7ea6a677663e31be9ee7f57cb
Author: Herbert Xu <herbert at gondor.apana.org.au>
AuthorDate: Sun, 28 Sep 2014 18:40:18 +0800
Committer: Ben Hutchings <ben at decadent.org.uk>
CommitDate: Fri, 25 Jan 2019 02:57:21 +0000
[klibc] [BUILTIN] Correctly handle test ! ! = !
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 at gondor.apana.org.au>
Signed-off-by: Ben Hutchings <ben at decadent.org.uk>
---
usr/dash/bltin/test.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/usr/dash/bltin/test.c b/usr/dash/bltin/test.c
index baa91a57..458e9f55 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)
More information about the klibc
mailing list