summaryrefslogtreecommitdiff
path: root/src/skaembutils/s6-test.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/skaembutils/s6-test.c')
-rw-r--r--src/skaembutils/s6-test.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/skaembutils/s6-test.c b/src/skaembutils/s6-test.c
index 3dda0b7..9ee11e0 100644
--- a/src/skaembutils/s6-test.c
+++ b/src/skaembutils/s6-test.c
@@ -53,7 +53,8 @@ enum opnum
T_NUMGREATER,
T_NUMGREATERE,
T_NUMLESSER,
- T_NUMLESSERE
+ T_NUMLESSERE,
+ T_ENV
} ;
struct token
@@ -74,7 +75,7 @@ struct node
static unsigned int lex (struct node *tree, char const *const *argv)
{
- static struct token const tokens[44] =
+ static struct token const tokens[45] =
{
{ "-n", T_NONZERO, 2 },
{ "-z", T_ZERO, 2 },
@@ -119,6 +120,7 @@ static unsigned int lex (struct node *tree, char const *const *argv)
{ "<=", T_STRLESSERE, 3 },
{ ">", T_STRGREATER, 3 },
{ ">=", T_STRGREATERE, 3 },
+ { "-v", T_ENV, 2 },
{ 0, 0, 0 }
} ;
register unsigned int pos = 0 ;
@@ -274,16 +276,16 @@ static unsigned int parse (struct node *tree, unsigned int n)
return stack[1] ;
}
-static int run (struct node const *tree, unsigned int root)
+static int run (struct node const *tree, unsigned int root, char const *const *envp)
{
switch (tree[root].op)
{
case T_NOT :
- return !run(tree, tree[root].arg1) ;
+ return !run(tree, tree[root].arg1, envp) ;
case T_AND :
- return run(tree, tree[root].arg1) && run(tree, tree[root].arg2) ;
+ return run(tree, tree[root].arg1, envp) && run(tree, tree[root].arg2, envp) ;
case T_OR :
- return run(tree, tree[root].arg1) || run(tree, tree[root].arg2) ;
+ return run(tree, tree[root].arg1, envp) || run(tree, tree[root].arg2, envp) ;
case T_EXIST :
{
struct stat st ;
@@ -489,6 +491,10 @@ static int run (struct node const *tree, unsigned int root)
goto errorint ;
return n1 <= n2 ;
}
+ case T_ENV :
+ {
+ return env_get2(envp, tree[tree[root].arg1].data) ? 1 : 0 ;
+ }
default:
strerr_dief1x(111, "operation not implemented") ;
}
@@ -497,12 +503,12 @@ errorint:
strerr_dief2x(100, tree[root].data, " requires integer arguments") ;
}
-int main (int argc, char const *const *argv)
+int main (int argc, char const *const *argv, char const *const *envp)
{
PROG = "s6-test" ;
if (argc <= 1) return 1 ;
{
- struct node tree[argc + 2] ;
+ struct node tree[argc + 2] ;
unsigned int n = lex(tree, argv+1) ;
if ((argv[0][0] == '[') && !argv[0][1])
{
@@ -510,6 +516,6 @@ int main (int argc, char const *const *argv)
n-- ;
else strerr_dief1x(100, "parse error: missing closing bracket") ;
}
- return !run(tree, parse(tree, n)) ;
+ return !run(tree, parse(tree, n), envp) ;
}
}