diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2014-10-23 17:29:01 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2015-12-17 15:25:24 +0200 |
commit | 82f402caf19c334f3975fd5a74c2a7fd3f21603d (patch) | |
tree | 07718190450cb5f892e56bd212a8258b79a7a9dc /src/wordsplit.c | |
parent | fc6012da9a3c264d168f47219630054747a553ac (diff) | |
download | grecs-82f402caf19c334f3975fd5a74c2a7fd3f21603d.tar.gz grecs-82f402caf19c334f3975fd5a74c2a7fd3f21603d.tar.bz2 |
cleanup in wordsplit
Diffstat (limited to 'src/wordsplit.c')
-rw-r--r-- | src/wordsplit.c | 83 |
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)); + } +} + |