diff options
Diffstat (limited to 'src/wordsplit.c')
-rw-r--r-- | src/wordsplit.c | 101 |
1 files changed, 78 insertions, 23 deletions
diff --git a/src/wordsplit.c b/src/wordsplit.c index 403ffed..4a69725 100644 --- a/src/wordsplit.c +++ b/src/wordsplit.c @@ -100,6 +100,43 @@ _wsplt_nomem (struct wordsplit *wsp) return wsp->ws_errno; } +static int wordsplit_run (const char *command, size_t length, + struct wordsplit *wsp, + int flags, int lvl); + +static int +_wsplt_subsplit (struct wordsplit *wsp, struct wordsplit *wss, + char const *str, int len, + int flags) +{ + wss->ws_delim = wsp->ws_delim; + wss->ws_debug = wsp->ws_debug; + wss->ws_error = wsp->ws_error; + wss->ws_alloc_die = wsp->ws_alloc_die; + + flags |= WRDSF_DELIM + | WRDSF_ALLOC_DIE + | WRDSF_ERROR + | WRDSF_DEBUG + | (wsp->ws_flags & (WRDSF_SHOWDBG | WRDSF_SHOWERR)); + + return wordsplit_run (str, len, wss, flags, wsp->ws_lvl + 1); +} + +static void +_wsplt_seterr_sub (struct wordsplit *wsp, struct wordsplit *wss) +{ + if (wsp->ws_errno == WRDSE_USERERR) + free (wsp->ws_usererr); + wsp->ws_errno = wss->ws_errno; + if (wss->ws_errno == WRDSE_USERERR) + { + wsp->ws_usererr = wss->ws_usererr; + wss->ws_errno = WRDSE_EOF; + wss->ws_usererr = NULL; + } +} + static void wordsplit_init0 (struct wordsplit *wsp) { @@ -429,10 +466,12 @@ wordsplit_dump_nodes (struct wordsplit *wsp) for (p = wsp->ws_head, n = 0; p; p = p->next, n++) { if (p->flags & _WSNF_WORD) - wsp->ws_debug ("%4d: %p: %#04x (%s):%s;", + wsp->ws_debug ("(%02d) %4d: %p: %#04x (%s):%s;", + wsp->ws_lvl, n, p, p->flags, wsnode_flagstr (p->flags), p->v.word); else - wsp->ws_debug ("%4d: %p: %#04x (%s):%.*s;", + wsp->ws_debug ("(%02d) %4d: %p: %#04x (%s):%.*s;", + wsp->ws_lvl, n, p, p->flags, wsnode_flagstr (p->flags), (int) (p->v.segm.end - p->v.segm.beg), wsp->ws_input + p->v.segm.beg); @@ -897,14 +936,14 @@ expvar (struct wordsplit *wsp, const char *str, size_t len, { struct wordsplit ws; int i, rc; - - ws.ws_delim = wsp->ws_delim; - rc = wordsplit (value, &ws, - WRDSF_NOVAR | WRDSF_NOCMD | WRDSF_DELIM | - WRDSF_WS | WRDSF_QUOTE); + + rc = _wsplt_subsplit (wsp, &ws, value, strlen (value), + WRDSF_NOVAR | WRDSF_NOCMD | + WRDSF_WS | WRDSF_QUOTE); free (value); if (rc) { + _wsplt_seterr_sub (wsp, &ws); wordsplit_free (&ws); return 1; } @@ -1076,11 +1115,17 @@ expcmd (struct wordsplit *wsp, const char *str, size_t len, { struct wordsplit ws; - ws.ws_delim = wsp->ws_delim; - rc = wordsplit_len (str, j, &ws, - WRDSF_NOVAR | WRDSF_NOCMD | WRDSF_DELIM | - (wsp->ws_flags & (WRDSF_WS | WRDSF_QUOTE))); + rc = _wsplt_subsplit (wsp, &ws, str, j, + WRDSF_NOVAR | WRDSF_NOCMD | + WRDSF_WS | WRDSF_QUOTE); + if (rc) + { + _wsplt_seterr_sub (wsp, &ws); + wordsplit_free (&ws); + return 1; + } rc = wsp->ws_command (&value, str, j, ws.ws_wordv, wsp->ws_closure); + wordsplit_free (&ws); } else rc = wsp->ws_command (&value, str, j, NULL, wsp->ws_closure); @@ -1125,13 +1170,13 @@ expcmd (struct wordsplit *wsp, const char *str, size_t len, struct wordsplit ws; int i, rc; - ws.ws_delim = wsp->ws_delim; - rc = wordsplit (value, &ws, - WRDSF_NOVAR | WRDSF_NOCMD | WRDSF_DELIM | - WRDSF_WS | WRDSF_QUOTE); + rc = _wsplt_subsplit (wsp, &ws, value, strlen (value), + WRDSF_NOVAR | WRDSF_NOCMD | + WRDSF_WS | WRDSF_QUOTE); free (value); if (rc) { + _wsplt_seterr_sub (wsp, &ws); wordsplit_free (&ws); return 1; } @@ -1858,7 +1903,7 @@ wordsplit_process_list (struct wordsplit *wsp, size_t start) if (wsp->ws_flags & WRDSF_SHOWDBG) { - wsp->ws_debug (_("Initial list:")); + wsp->ws_debug ("(%02d) %s", wsp->ws_lvl, _("Initial list:")); wordsplit_dump_nodes (wsp); } @@ -1873,7 +1918,8 @@ wordsplit_process_list (struct wordsplit *wsp, size_t start) break; if (wsp->ws_flags & WRDSF_SHOWDBG) { - wsp->ws_debug (_("Coalesced list:")); + wsp->ws_debug ("(%02d) %s", wsp->ws_lvl, + _("Coalesced list:")); wordsplit_dump_nodes (wsp); } } @@ -1883,7 +1929,7 @@ wordsplit_process_list (struct wordsplit *wsp, size_t start) break; if (wsp->ws_flags & WRDSF_SHOWDBG) { - wsp->ws_debug ("%s:", _(p->descr)); + wsp->ws_debug ("(%02d) %s", wsp->ws_lvl, _(p->descr)); wordsplit_dump_nodes (wsp); } } @@ -1892,9 +1938,9 @@ wordsplit_process_list (struct wordsplit *wsp, size_t start) return wsp->ws_errno; } -int -wordsplit_len (const char *command, size_t length, struct wordsplit *wsp, - int flags) +static int +wordsplit_run (const char *command, size_t length, struct wordsplit *wsp, + int flags, int lvl) { int rc; size_t start; @@ -1923,10 +1969,11 @@ wordsplit_len (const char *command, size_t length, struct wordsplit *wsp, rc = wordsplit_init (wsp, cmdptr, cmdlen, flags); if (rc) return rc; + wsp->ws_lvl = lvl; } if (wsp->ws_flags & WRDSF_SHOWDBG) - wsp->ws_debug (_("Input:%.*s;"), (int) cmdlen, cmdptr); + wsp->ws_debug (_("(%02d) Input:%.*s;"), wsp->ws_lvl, (int) cmdlen, cmdptr); rc = wordsplit_process_list (wsp, start); if (rc == 0 && (flags & WRDSF_INCREMENTAL)) @@ -1938,7 +1985,8 @@ wordsplit_len (const char *command, size_t length, struct wordsplit *wsp, { cmdptr = wsp->ws_input + wsp->ws_endp; cmdlen = wsp->ws_len - wsp->ws_endp; - wsp->ws_debug (_("Restart:%.*s;"), (int) cmdlen, cmdptr); + wsp->ws_debug (_("(%02d) Restart:%.*s;"), + wsp->ws_lvl, (int) cmdlen, cmdptr); } rc = wordsplit_process_list (wsp, start); if (rc) @@ -1956,6 +2004,13 @@ wordsplit_len (const char *command, size_t length, struct wordsplit *wsp, } int +wordsplit_len (const char *command, size_t length, struct wordsplit *wsp, + int flags) +{ + return wordsplit_run (command, length, wsp, flags, 0); +} + +int wordsplit (const char *command, struct wordsplit *ws, int flags) { return wordsplit_len (command, command ? strlen (command) : 0, ws, flags); |