diff options
Diffstat (limited to 'src/wordsplit.c')
-rw-r--r-- | src/wordsplit.c | 60 |
1 files changed, 59 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 | |||
@@ -1242,6 +1242,56 @@ expvar_recover (struct wordsplit *wsp, const char *str, | |||
1242 | } | 1242 | } |
1243 | 1243 | ||
1244 | static int | 1244 | static int |
1245 | expand_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 | |||
1294 | static int | ||
1245 | expvar (struct wordsplit *wsp, const char *str, size_t len, | 1295 | expvar (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 | { |
@@ -1285,6 +1335,14 @@ expvar (struct wordsplit *wsp, const char *str, size_t len, | |||
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) |
@@ -1596,7 +1654,7 @@ expvar (struct wordsplit *wsp, const char *str, size_t len, | |||
1596 | static int | 1654 | static int |
1597 | begin_var_p (int c) | 1655 | begin_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 | ||
1602 | static int | 1660 | static int |