mirror of
git://git.gnu.org.ua/wordsplit.git
synced 2025-04-26 08:39:54 +03:00
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:
parent
07a7d68690
commit
b834e13ac4
2 changed files with 74 additions and 7 deletions
|
@ -469,7 +469,7 @@ TESTWSP([default error message],[wsp-var wsp-var16 wsp42],[],
|
|||
[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],
|
||||
[NF: 3
|
||||
0: a
|
||||
|
@ -479,7 +479,7 @@ TESTWSP([custom error message (defined)],[wsp-var wsp-var17 wsp43],[],
|
|||
[],
|
||||
[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],
|
||||
[NF: 2
|
||||
0: a
|
||||
|
@ -488,7 +488,7 @@ TESTWSP([custom error message],[wsp-var wsp-var18 wsp44],[],
|
|||
[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],
|
||||
[NF: 3
|
||||
0: a
|
||||
|
@ -498,12 +498,42 @@ TESTWSP([alternate value (defined)],[wsp-var wsp-var19 wsp45],[],
|
|||
[],
|
||||
[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],
|
||||
[NF: 2
|
||||
0: a
|
||||
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])
|
||||
|
|
39
tests/wsp.c
39
tests/wsp.c
|
@ -81,7 +81,7 @@ help ()
|
|||
{
|
||||
size_t i;
|
||||
|
||||
printf ("usage: %s [options]\n", progname);
|
||||
printf ("usage: %s [options] [VAR=VALUE...]\n", progname);
|
||||
printf ("options are:\n");
|
||||
printf (" [-]trimnl\n");
|
||||
printf (" [-]plaintext\n");
|
||||
|
@ -162,6 +162,25 @@ make_env_kv ()
|
|||
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
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
|
@ -174,6 +193,9 @@ main (int argc, char **argv)
|
|||
WRDSF_ENV | WRDSF_SHOWERR;
|
||||
struct wordsplit ws;
|
||||
int next_call = 0;
|
||||
char *fenvbase[128];
|
||||
size_t fenvidx = 0;
|
||||
size_t fenvmax = sizeof (fenvbase) / sizeof (fenvbase[0]);
|
||||
|
||||
progname = argv[0];
|
||||
|
||||
|
@ -296,11 +318,26 @@ main (int argc, char **argv)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (strchr(opt, '='))
|
||||
{
|
||||
assert (fenvidx < fenvmax - 1);
|
||||
fenvbase[fenvidx++] = opt;
|
||||
continue;
|
||||
}
|
||||
|
||||
fprintf (stderr, "%s: unrecognized argument: %s\n",
|
||||
progname, opt);
|
||||
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)
|
||||
ws.ws_env = (const char **) make_env_kv ();
|
||||
else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue