mirror of
git://git.gnu.org.ua/wordsplit.git
synced 2025-04-26 00:29:54 +03:00
Implement $* and $@
This commit is contained in:
parent
c884936422
commit
a2c81cc5fa
2 changed files with 76 additions and 1 deletions
|
@ -1241,6 +1241,56 @@ expvar_recover (struct wordsplit *wsp, const char *str,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
expand_paramv (struct wordsplit *wsp, struct wordsplit_node **ptail, int flg,
|
||||||
|
int q)
|
||||||
|
{
|
||||||
|
struct wordsplit ws;
|
||||||
|
int wsflags = WRDSF_NOVAR | WRDSF_NOCMD | WRDSF_QUOTE
|
||||||
|
| (WSP_RETURN_DELIMS (wsp) ? WRDSF_RETURN_DELIMS : 0)
|
||||||
|
| (q ? WRDSF_NOSPLIT : 0);
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < wsp->ws_paramc; i++)
|
||||||
|
{
|
||||||
|
struct wordsplit_node *np;
|
||||||
|
int rc = _wsplt_subsplit (wsp, &ws,
|
||||||
|
wsp->ws_paramv[i], strlen (wsp->ws_paramv[i]),
|
||||||
|
wsflags, q);
|
||||||
|
if (rc)
|
||||||
|
{
|
||||||
|
_wsplt_seterr_sub (wsp, &ws);
|
||||||
|
wordsplit_free (&ws);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (q)
|
||||||
|
{
|
||||||
|
if (wsnode_new (wsp, &np))
|
||||||
|
return 1;
|
||||||
|
wsnode_insert (wsp, np, *ptail, 0);
|
||||||
|
*ptail = np;
|
||||||
|
np->flags = _WSNF_WORD | _WSNF_NOEXPAND | flg;
|
||||||
|
np->v.word = ws.ws_wordv[0];
|
||||||
|
|
||||||
|
ws.ws_wordv[0] = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (np = ws.ws_head; np; np = np->next)
|
||||||
|
np->flags = _WSNF_WORD | _WSNF_NOEXPAND | flg;
|
||||||
|
wsnode_insert (wsp, ws.ws_head, *ptail, 0);
|
||||||
|
*ptail = ws.ws_tail;
|
||||||
|
ws.ws_head = ws.ws_tail = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wsflags |= WRDSF_REUSE;
|
||||||
|
}
|
||||||
|
if (wsflags & WRDSF_REUSE)
|
||||||
|
wordsplit_free (&ws);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
expvar (struct wordsplit *wsp, const char *str, size_t len,
|
expvar (struct wordsplit *wsp, const char *str, size_t len,
|
||||||
struct wordsplit_node **ptail, const char **pend, int flg)
|
struct wordsplit_node **ptail, const char **pend, int flg)
|
||||||
|
@ -1285,6 +1335,14 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
|
||||||
newnode->v.word = value;
|
newnode->v.word = value;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
else if ((wsp->ws_options & WRDSO_PARAMV) && str[0] == '*')
|
||||||
|
{
|
||||||
|
return expand_paramv (wsp, ptail, flg, 0);
|
||||||
|
}
|
||||||
|
else if ((wsp->ws_options & WRDSO_PARAMV) && str[0] == '@')
|
||||||
|
{
|
||||||
|
return expand_paramv (wsp, ptail, flg, 1);
|
||||||
|
}
|
||||||
else if (str[0] == '{'
|
else if (str[0] == '{'
|
||||||
&& (ISVARBEG (str[1])
|
&& (ISVARBEG (str[1])
|
||||||
|| (is_param = (((wsp->ws_options & WRDSO_PARAMV)
|
|| (is_param = (((wsp->ws_options & WRDSO_PARAMV)
|
||||||
|
@ -1596,7 +1654,7 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
|
||||||
static int
|
static int
|
||||||
begin_var_p (int c)
|
begin_var_p (int c)
|
||||||
{
|
{
|
||||||
return c == '{' || c == '#' || ISVARBEG (c) || ISDIGIT (c);
|
return memchr("{#@*", c, 4) != NULL || ISVARBEG (c) || ISDIGIT (c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
@ -972,6 +972,23 @@ NF: 1
|
||||||
TOTAL: 1
|
TOTAL: 1
|
||||||
])
|
])
|
||||||
|
|
||||||
|
TESTWSP([$* and $@],[],['one two' three 'four five'],
|
||||||
|
[$*
|
||||||
|
$@],
|
||||||
|
[NF: 5
|
||||||
|
0: one
|
||||||
|
1: two
|
||||||
|
2: three
|
||||||
|
3: four
|
||||||
|
4: five
|
||||||
|
TOTAL: 5
|
||||||
|
NF: 3
|
||||||
|
0: "one two"
|
||||||
|
1: three
|
||||||
|
2: "four five"
|
||||||
|
TOTAL: 3
|
||||||
|
])
|
||||||
|
|
||||||
m4_popdef([TESTWSP])
|
m4_popdef([TESTWSP])
|
||||||
m4_popdef([wspnum])
|
m4_popdef([wspnum])
|
||||||
m4_popdef([wspid])
|
m4_popdef([wspid])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue