diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-05-14 15:31:59 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-05-14 15:43:25 +0300 |
commit | 8652a500669059d77ce7bace6e9e9da1b30c54b0 (patch) | |
tree | 54ee082e3804c0574e67252be8fbceb48b8f156a /include | |
parent | 65f41a742e025487f8ec7f2e7ca2a3af3283fc96 (diff) | |
download | grecs-8652a500669059d77ce7bace6e9e9da1b30c54b0.tar.gz grecs-8652a500669059d77ce7bace6e9e9da1b30c54b0.tar.bz2 |
wordsplit: rewrite positional parameters implementation
This improves 3e07e3ad
* include/wordsplit.h (ws_paramv,ws_paramc)
(ws_parambuf,ws_paramidx,ws_paramsiz): New fields.
(WRDSO_PARAMV,WRDSO_PARAM_NEGIDX): New options.
(WRDSE_BADPARAM): New error code.
(wordsplit_free_parambuf): New proto.
* src/wordsplit.c (wordsplit_init): Initialize new fields.
(wsplt_assign_var): Fix double-free and memory leak.
(expvar): Expand positional parameters.
(begin_var_p): Add '#'
(wordsplit_free_envbuf): Fix condition.
(wordsplit_free_parambuf): New function.
(wordsplit_free): Call wordsplit_free_parambuf.
(_wordsplit_errstr): New error description.
* tests/wordsplit.at: Update wsp invocations.
Test positional parameters.
* tests/wsp.c: Rewrite.
Diffstat (limited to 'include')
-rw-r--r-- | include/wordsplit.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/include/wordsplit.h b/include/wordsplit.h index a175275..d7eb26f 100644 --- a/include/wordsplit.h +++ b/include/wordsplit.h @@ -77,2 +77,12 @@ struct wordsplit size_t ws_envsiz; /* Size of the ws_envbuf array */ + + char const **ws_paramv; /* [WRDSO_PARAMV] User-supplied positional + parameters */ + size_t ws_paramc; /* Number of positional parameters */ + + /* Temporary storage for parameters. Works similarly to ws_enbuf. + */ + char **ws_parambuf; + size_t ws_paramidx; + size_t ws_paramsiz; @@ -101,3 +111,3 @@ struct wordsplit return values. */ - + const char *ws_input; /* Input string (the S argument to wordsplit. */ @@ -228,2 +238,8 @@ struct wordsplit +/* Enable positional parameters */ +#define WRDSO_PARAMV 0x00004000 +/* Enable negative positional indices (${-1} is the last positional + parameter) */ +#define WRDSO_PARAM_NEGIDX 0x00008000 + #define WRDSO_BSKEEP WRDSO_BSKEEP_WORD @@ -252,2 +268,3 @@ struct wordsplit #define WRDSE_USERERR 9 +#define WRDSE_BADPARAM 10 @@ -258,2 +275,3 @@ void wordsplit_free_words (wordsplit_t *ws); void wordsplit_free_envbuf (wordsplit_t *ws); +void wordsplit_free_parambuf (struct wordsplit *ws); int wordsplit_get_words (wordsplit_t *ws, size_t *wordc, char ***wordv); |