From b834e13ac42c0b02838e8fffaa67c93353580070 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Wed, 10 Sep 2014 17:40:47 +0300 Subject: [PATCH] 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. --- tests/wordsplit.at | 38 ++++++++++++++++++++++++++++++++++---- tests/wsp.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/tests/wordsplit.at b/tests/wordsplit.at index d87fa74..15a51bc 100644 --- a/tests/wordsplit.at +++ b/tests/wordsplit.at @@ -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]) diff --git a/tests/wsp.c b/tests/wsp.c index e929de7..3e82e9a 100644 --- a/tests/wsp.c +++ b/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"); @@ -161,7 +161,26 @@ make_env_kv () newenv[j] = NULL; 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,7 +193,10 @@ 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]; for (i = 1; i < argc; i++) @@ -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