summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--src/wordsplit.c60
-rw-r--r--tests/wordsplit.at17
2 files changed, 76 insertions, 1 deletions
diff --git a/src/wordsplit.c b/src/wordsplit.c
index 6a33636..05c3643 100644
--- a/src/wordsplit.c
+++ b/src/wordsplit.c
@@ -1239,12 +1239,62 @@ expvar_recover (struct wordsplit *wsp, const char *str,
1239 newnode->v.word[2] = 0; 1239 newnode->v.word[2] = 0;
1240 *pend = str; 1240 *pend = str;
1241 return 0; 1241 return 0;
1242} 1242}
1243 1243
1244static int 1244static int
1245expand_paramv (struct wordsplit *wsp, struct wordsplit_node **ptail, int flg,
1246 int q)
1247{
1248 struct wordsplit ws;
1249 int wsflags = WRDSF_NOVAR | WRDSF_NOCMD | WRDSF_QUOTE
1250 | (WSP_RETURN_DELIMS (wsp) ? WRDSF_RETURN_DELIMS : 0)
1251 | (q ? WRDSF_NOSPLIT : 0);
1252 size_t i;
1253
1254 for (i = 0; i < wsp->ws_paramc; i++)
1255 {
1256 struct wordsplit_node *np;
1257 int rc = _wsplt_subsplit (wsp, &ws,
1258 wsp->ws_paramv[i], strlen (wsp->ws_paramv[i]),
1259 wsflags, q);
1260 if (rc)
1261 {
1262 _wsplt_seterr_sub (wsp, &ws);
1263 wordsplit_free (&ws);
1264 return 1;
1265 }
1266
1267 if (q)
1268 {
1269 if (wsnode_new (wsp, &np))
1270 return 1;
1271 wsnode_insert (wsp, np, *ptail, 0);
1272 *ptail = np;
1273 np->flags = _WSNF_WORD | _WSNF_NOEXPAND | flg;
1274 np->v.word = ws.ws_wordv[0];
1275
1276 ws.ws_wordv[0] = NULL;
1277 }
1278 else
1279 {
1280 for (np = ws.ws_head; np; np = np->next)
1281 np->flags = _WSNF_WORD | _WSNF_NOEXPAND | flg;
1282 wsnode_insert (wsp, ws.ws_head, *ptail, 0);
1283 *ptail = ws.ws_tail;
1284 ws.ws_head = ws.ws_tail = NULL;
1285 }
1286
1287 wsflags |= WRDSF_REUSE;
1288 }
1289 if (wsflags & WRDSF_REUSE)
1290 wordsplit_free (&ws);
1291 return 0;
1292}
1293
1294static int
1245expvar (struct wordsplit *wsp, const char *str, size_t len, 1295expvar (struct wordsplit *wsp, const char *str, size_t len,
1246 struct wordsplit_node **ptail, const char **pend, int flg) 1296 struct wordsplit_node **ptail, const char **pend, int flg)
1247{ 1297{
1248 size_t i = 0; 1298 size_t i = 0;
1249 const char *defstr = NULL; 1299 const char *defstr = NULL;
1250 char *value; 1300 char *value;
@@ -1282,12 +1332,20 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
1282 wsnode_insert (wsp, newnode, *ptail, 0); 1332 wsnode_insert (wsp, newnode, *ptail, 0);
1283 *ptail = newnode; 1333 *ptail = newnode;
1284 newnode->flags = _WSNF_WORD | _WSNF_NOEXPAND | flg; 1334 newnode->flags = _WSNF_WORD | _WSNF_NOEXPAND | flg;
1285 newnode->v.word = value; 1335 newnode->v.word = value;
1286 return 0; 1336 return 0;
1287 } 1337 }
1338 else if ((wsp->ws_options & WRDSO_PARAMV) && str[0] == '*')
1339 {
1340 return expand_paramv (wsp, ptail, flg, 0);
1341 }
1342 else if ((wsp->ws_options & WRDSO_PARAMV) && str[0] == '@')
1343 {
1344 return expand_paramv (wsp, ptail, flg, 1);
1345 }
1288 else if (str[0] == '{' 1346 else if (str[0] == '{'
1289 && (ISVARBEG (str[1]) 1347 && (ISVARBEG (str[1])
1290 || (is_param = (((wsp->ws_options & WRDSO_PARAMV) 1348 || (is_param = (((wsp->ws_options & WRDSO_PARAMV)
1291 && ISDIGIT (str[1])) 1349 && ISDIGIT (str[1]))
1292 || ((wsp->ws_options & WRDSO_PARAM_NEGIDX) 1350 || ((wsp->ws_options & WRDSO_PARAM_NEGIDX)
1293 && (str[1] == '-' 1351 && (str[1] == '-'
@@ -1593,13 +1651,13 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
1593 return 0; 1651 return 0;
1594} 1652}
1595 1653
1596static int 1654static int
1597begin_var_p (int c) 1655begin_var_p (int c)
1598{ 1656{
1599 return c == '{' || c == '#' || ISVARBEG (c) || ISDIGIT (c); 1657 return memchr("{#@*", c, 4) != NULL || ISVARBEG (c) || ISDIGIT (c);
1600} 1658}
1601 1659
1602static int 1660static int
1603node_expand (struct wordsplit *wsp, struct wordsplit_node *node, 1661node_expand (struct wordsplit *wsp, struct wordsplit_node *node,
1604 int (*beg_p) (int), 1662 int (*beg_p) (int),
1605 int (*ws_exp_fn) (struct wordsplit *wsp, 1663 int (*ws_exp_fn) (struct wordsplit *wsp,
diff --git a/tests/wordsplit.at b/tests/wordsplit.at
index ebd168b..0a9c4d6 100644
--- a/tests/wordsplit.at
+++ b/tests/wordsplit.at
@@ -969,12 +969,29 @@ $#],
969TOTAL: 3 969TOTAL: 3
970NF: 1 970NF: 1
9710: 12 9710: 12
972TOTAL: 1 972TOTAL: 1
973]) 973])
974 974
975TESTWSP([$* and $@],[],['one two' three 'four five'],
976[$*
977$@],
978[NF: 5
9790: one
9801: two
9812: three
9823: four
9834: five
984TOTAL: 5
985NF: 3
9860: "one two"
9871: three
9882: "four five"
989TOTAL: 3
990])
991
975m4_popdef([TESTWSP]) 992m4_popdef([TESTWSP])
976m4_popdef([wspnum]) 993m4_popdef([wspnum])
977m4_popdef([wspid]) 994m4_popdef([wspid])
978m4_popdef([genkw]) 995m4_popdef([genkw])
979m4_popdef([wspgroupnum]) 996m4_popdef([wspgroupnum])
980m4_popdef([wspgroupname]) 997m4_popdef([wspgroupname])

Return to:

Send suggestions and report system problems to the System administrator.