Test ws_getvar/ws_closure functionality.

* tests/wsp.c (help): Update.
(wsp_getvar): New function.
(main): Callect all arguments in form X=Y to an array
and set ws_getvar member if this array is not empty.
* tests/wordsplit.at: Add tests for ws_getenv function.
This commit is contained in:
Sergey Poznyakoff 2014-09-10 17:40:47 +03:00
parent 07a7d68690
commit b834e13ac4
2 changed files with 74 additions and 7 deletions

View file

@ -469,7 +469,7 @@ TESTWSP([default error message],[wsp-var wsp-var16 wsp42],[],
[FOO: variable null or not set [FOO: variable null or not set
]) ])
TESTWSP([custom error message (defined)],[wsp-var wsp-var17 wsp43],[], TESTWSP([custom error message (defined)],[wsp-var wsp-var17 wsp-custom-err wsp-custom-err00 wsp43],[],
[a ${FOO:?please define it} test], [a ${FOO:?please define it} test],
[NF: 3 [NF: 3
0: a 0: a
@ -479,7 +479,7 @@ TESTWSP([custom error message (defined)],[wsp-var wsp-var17 wsp43],[],
[], [],
[FOO=bar]) [FOO=bar])
TESTWSP([custom error message],[wsp-var wsp-var18 wsp44],[], TESTWSP([custom error message],[wsp-var wsp-var18 wsp-custom-err wsp-custom-err01 wsp44],[],
[a ${FOO:?please define it} test], [a ${FOO:?please define it} test],
[NF: 2 [NF: 2
0: a 0: a
@ -488,7 +488,7 @@ TESTWSP([custom error message],[wsp-var wsp-var18 wsp44],[],
[FOO: please define it [FOO: please define it
]) ])
TESTWSP([alternate value (defined)],[wsp-var wsp-var19 wsp45],[], TESTWSP([alternate value (defined)],[wsp-var wsp-var19 wsp-alt wsp-alt00 wsp45],[],
[a ${FOO:+isset} test], [a ${FOO:+isset} test],
[NF: 3 [NF: 3
0: a 0: a
@ -498,12 +498,42 @@ TESTWSP([alternate value (defined)],[wsp-var wsp-var19 wsp45],[],
[], [],
[FOO=bar]) [FOO=bar])
TESTWSP([alternate value],[wsp-var wsp-var20 wsp46],[], TESTWSP([alternate value],[wsp-var wsp-var20 wsp-alt wsp-alt01 wsp46],[],
[a ${FOO:+isset} test], [a ${FOO:+isset} test],
[NF: 2 [NF: 2
0: a 0: a
1: test 1: test
]) ])
TESTWSP([getvar],[wsp-var wsp-var21 wsp-getvar wsp-getvar00 wsp47],
[foo=bar x=quux],
[begin $foo $x end],
[NF: 4
0: begin
1: bar
2: quux
3: end
])
TESTWSP([getvar and env],[wsp-var wsp-var22 wsp-getvar wsp-getvar01 wsp48],
[foo=bar x=quux],
[begin $foo $TVAR $x end],
[NF: 5
0: begin
1: bar
2: 12
3: quux
4: end
],
[],
[TVAR=12])
TESTWSP([getvar, alternate value],[wsp-var wsp-var23 wsp-alt wsp-alt02 wsp-getvar02 wsp49],
[foo=bar],
[a ${foo:+isset}],
[NF: 2
0: a
1: isset
])
m4_popdef([TESTWSP]) m4_popdef([TESTWSP])

View file

@ -81,7 +81,7 @@ help ()
{ {
size_t i; size_t i;
printf ("usage: %s [options]\n", progname); printf ("usage: %s [options] [VAR=VALUE...]\n", progname);
printf ("options are:\n"); printf ("options are:\n");
printf (" [-]trimnl\n"); printf (" [-]trimnl\n");
printf (" [-]plaintext\n"); printf (" [-]plaintext\n");
@ -162,6 +162,25 @@ make_env_kv ()
return newenv; return newenv;
} }
static char *
wsp_getvar (const char *vptr, size_t vlen, void *data)
{
char **base = data;
int i;
for (i = 0; base[i]; i++)
{
size_t l = strcspn (base[i], "=");
if (l == vlen && memcmp (base[i], vptr, vlen) == 0)
{
char *p = strdup (base[i] + vlen + 1);
assert (p != NULL);
return p;
}
}
return NULL;
}
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
@ -174,6 +193,9 @@ main (int argc, char **argv)
WRDSF_ENV | WRDSF_SHOWERR; WRDSF_ENV | WRDSF_SHOWERR;
struct wordsplit ws; struct wordsplit ws;
int next_call = 0; int next_call = 0;
char *fenvbase[128];
size_t fenvidx = 0;
size_t fenvmax = sizeof (fenvbase) / sizeof (fenvbase[0]);
progname = argv[0]; progname = argv[0];
@ -296,11 +318,26 @@ main (int argc, char **argv)
continue; continue;
} }
if (strchr(opt, '='))
{
assert (fenvidx < fenvmax - 1);
fenvbase[fenvidx++] = opt;
continue;
}
fprintf (stderr, "%s: unrecognized argument: %s\n", fprintf (stderr, "%s: unrecognized argument: %s\n",
progname, opt); progname, opt);
exit (1); exit (1);
} }
if (fenvidx)
{
fenvbase[fenvidx] = NULL;
wsflags |= WRDSF_GETVAR | WRDSF_CLOSURE;
ws.ws_getvar = wsp_getvar;
ws.ws_closure = fenvbase;
}
if (wsflags & WRDSF_ENV_KV) if (wsflags & WRDSF_ENV_KV)
ws.ws_env = (const char **) make_env_kv (); ws.ws_env = (const char **) make_env_kv ();
else else