aboutsummaryrefslogtreecommitdiff
path: root/src/wordsplit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wordsplit.c')
-rw-r--r--src/wordsplit.c101
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);

Return to:

Send suggestions and report system problems to the System administrator.