aboutsummaryrefslogtreecommitdiff
path: root/src/wordsplit.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2014-10-23 17:29:01 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2015-12-17 15:25:24 +0200
commit82f402caf19c334f3975fd5a74c2a7fd3f21603d (patch)
tree07718190450cb5f892e56bd212a8258b79a7a9dc /src/wordsplit.c
parentfc6012da9a3c264d168f47219630054747a553ac (diff)
downloadgrecs-82f402caf19c334f3975fd5a74c2a7fd3f21603d.tar.gz
grecs-82f402caf19c334f3975fd5a74c2a7fd3f21603d.tar.bz2
cleanup in wordsplit
Diffstat (limited to 'src/wordsplit.c')
-rw-r--r--src/wordsplit.c83
1 files changed, 31 insertions, 52 deletions
diff --git a/src/wordsplit.c b/src/wordsplit.c
index a67e455..b2382c8 100644
--- a/src/wordsplit.c
+++ b/src/wordsplit.c
@@ -802,6 +802,8 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
break;
case WRDSE_USERERR:
+ if (wsp->ws_errno == WRDSE_USERERR)
+ free (wsp->ws_usererr);
wsp->ws_usererr = value;
/* fall through */
default:
@@ -1007,7 +1009,7 @@ node_expand (struct wordsplit *wsp, struct wordsplit_node *node,
return 0;
}
-/* Remove NULL lists */
+/* Remove NULL nodes from the list */
static void
wsnode_nullelim (struct wordsplit *wsp)
{
@@ -1063,7 +1065,7 @@ expcmd (struct wordsplit *wsp, const char *str, size_t len,
if (find_closing_paren (str, 0, len, &j, "()"))
{
- _wsplt_seterr (wsp, WRDSE_CBRACE);
+ _wsplt_seterr (wsp, WRDSE_PAREN);
return 1;
}
@@ -1086,7 +1088,11 @@ expcmd (struct wordsplit *wsp, const char *str, size_t len,
else if (rc)
{
if (rc == WRDSE_USERERR)
- wsp->ws_usererr = value;
+ {
+ if (wsp->ws_errno == WRDSE_USERERR)
+ free (wsp->ws_usererr);
+ wsp->ws_usererr = value;
+ }
_wsplt_seterr (wsp, rc);
return 1;
}
@@ -1647,7 +1653,7 @@ wordsplit_process_list (struct wordsplit *wsp, size_t start)
}
}
- /* Expand variables (FIXME: & commands) */
+ /* Expand variables */
if (!(wsp->ws_flags & WRDSF_NOVAR))
{
if (wordsplit_varexp (wsp))
@@ -1662,6 +1668,7 @@ wordsplit_process_list (struct wordsplit *wsp, size_t start)
}
}
+ /* Expand commands */
if (!(wsp->ws_flags & WRDSF_NOCMD))
{
if (wsnode_coalesce (wsp))
@@ -1774,8 +1781,7 @@ wordsplit_len (const char *command, size_t length, struct wordsplit *wsp,
int
wordsplit (const char *command, struct wordsplit *ws, int flags)
{
- return wordsplit_len (command, command ? strlen (command) : 0, ws,
- flags);
+ return wordsplit_len (command, command ? strlen (command) : 0, ws, flags);
}
void
@@ -1812,59 +1818,15 @@ wordsplit_free (struct wordsplit *ws)
ws->ws_wordv = NULL;
}
-void
-wordsplit_perror (struct wordsplit *wsp)
-{
- switch (wsp->ws_errno)
- {
- case WRDSE_EOF:
- wsp->ws_error (_("no error"));
- break;
-
- case WRDSE_QUOTE:
- wsp->ws_error (_("missing closing %c (start near #%lu)"),
- wsp->ws_input[wsp->ws_endp],
- (unsigned long) wsp->ws_endp);
- break;
-
- case WRDSE_NOSPACE:
- wsp->ws_error (_("memory exhausted"));
- break;
-
- case WRDSE_NOSUPP:
- wsp->ws_error (_("command substitution is not yet supported"));
- break;
-
- case WRDSE_USAGE:
- wsp->ws_error (_("invalid wordsplit usage"));
- break;
-
- case WRDSE_CBRACE:
- wsp->ws_error (_("unbalanced curly brace"));
- break;
-
- case WRDSE_UNDEF:
- wsp->ws_error (_("undefined variable"));
- break;
-
- case WRDSE_NOINPUT:
- wsp->ws_error (_("input exhausted"));
- break;
-
- default:
- wsp->ws_error (_("unknown error"));
- }
-}
-
const char *_wordsplit_errstr[] = {
N_("no error"),
N_("missing closing quote"),
N_("memory exhausted"),
- N_("command substitution is not yet supported"),
N_("invalid wordsplit usage"),
N_("unbalanced curly brace"),
N_("undefined variable"),
- N_("input exhausted")
+ N_("input exhausted"),
+ N_("unbalanced parenthesis")
};
int _wordsplit_nerrs =
sizeof (_wordsplit_errstr) / sizeof (_wordsplit_errstr[0]);
@@ -1878,3 +1840,20 @@ wordsplit_strerror (struct wordsplit *ws)
return _wordsplit_errstr[ws->ws_errno];
return N_("unknown error");
}
+
+void
+wordsplit_perror (struct wordsplit *wsp)
+{
+ switch (wsp->ws_errno)
+ {
+ case WRDSE_QUOTE:
+ wsp->ws_error (_("missing closing %c (start near #%lu)"),
+ wsp->ws_input[wsp->ws_endp],
+ (unsigned long) wsp->ws_endp);
+ break;
+
+ default:
+ wsp->ws_error (wordsplit_strerror (wsp));
+ }
+}
+

Return to:

Send suggestions and report system problems to the System administrator.