aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/wordsplit.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/wordsplit.c b/src/wordsplit.c
index af747b3..6dba914 100644
--- a/src/wordsplit.c
+++ b/src/wordsplit.c
@@ -109,2 +109,26 @@ _wsplt_nomem (struct wordsplit *wsp)
+static void
+_wsplt_store_errctx (struct wordsplit *wsp, char const *str, size_t len)
+{
+ free (wsp->ws_errctx);
+ wsp->ws_errctx = malloc (len + 1);
+ if (!wsp->ws_errctx)
+ {
+ wsp->ws_error ("%s",
+ _("memory exhausted while trying to store error subject"));
+ }
+ else
+ {
+ memcpy (wsp->ws_errctx, str, len);
+ wsp->ws_errctx[len] = 0;
+ }
+}
+
+static inline int
+_wsplt_setctxerr (struct wordsplit *wsp, int ec, char const *str, size_t len)
+{
+ _wsplt_store_errctx (wsp, str, len);
+ return _wsplt_seterr (wsp, ec);
+}
+
static int wordsplit_run (const char *command, size_t length,
@@ -309,2 +333,4 @@ wordsplit_init (struct wordsplit *wsp, const char *input, size_t len,
+ wsp->ws_errctx = NULL;
+
wordsplit_init0 (wsp);
@@ -1577,3 +1603,3 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
{
- _wsplt_seterr (wsp, WRDSE_UNDEF);
+ _wsplt_setctxerr (wsp, WRDSE_UNDEF, str, *pend - str + 1);
return 1;
@@ -1682,3 +1708,3 @@ begin_var_p (int c)
{
- return memchr("{#@*", c, 4) != NULL || ISVARBEG (c) || ISDIGIT (c);
+ return memchr ("{#@*", c, 4) != NULL || ISVARBEG (c) || ISDIGIT (c);
}
@@ -2100,3 +2126,3 @@ wordsplit_pathexpand (struct wordsplit *wsp)
free (pattern);
- return _wsplt_seterr (wsp, WRDSE_GLOBERR);
+ return _wsplt_setctxerr (wsp, WRDSE_GLOBERR, pattern, slen);
}
@@ -2756,2 +2782,6 @@ wordsplit_clearerr (struct wordsplit *ws)
ws->ws_usererr = NULL;
+
+ free (ws->ws_errctx);
+ ws->ws_errctx = NULL;
+
ws->ws_errno = WRDSE_OK;
@@ -2762,2 +2792,3 @@ wordsplit_free (struct wordsplit *ws)
{
+ wordsplit_clearerr (ws);
wordsplit_free_nodes (ws);
@@ -2825,3 +2856,6 @@ wordsplit_perror (struct wordsplit *wsp)
default:
- wsp->ws_error ("%s", wordsplit_strerror (wsp));
+ if (wsp->ws_errctx)
+ wsp->ws_error ("%s: %s", wordsplit_strerror (wsp), wsp->ws_errctx);
+ else
+ wsp->ws_error ("%s", wordsplit_strerror (wsp));
}

Return to:

Send suggestions and report system problems to the System administrator.