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
|
[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])
|
||||||
|
|
43
tests/wsp.c
43
tests/wsp.c
|
@ -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");
|
||||||
|
@ -161,7 +161,26 @@ make_env_kv ()
|
||||||
newenv[j] = NULL;
|
newenv[j] = NULL;
|
||||||
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,7 +193,10 @@ 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];
|
||||||
|
|
||||||
for (i = 1; i < argc; i++)
|
for (i = 1; i < argc; i++)
|
||||||
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue