aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2015-01-16 16:15:41 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2015-12-17 15:26:28 +0200
commit4ed0f2645ccdb8ed478cacdc5703d948d8eb9082 (patch)
tree38961dd426e0c60be51a9ef6ec11dd3c789167fb /src
parent6b6494305818b209334c9da240717a66948467ae (diff)
downloadgrecs-4ed0f2645ccdb8ed478cacdc5703d948d8eb9082.tar.gz
grecs-4ed0f2645ccdb8ed478cacdc5703d948d8eb9082.tar.bz2
wordsplit: fix ws trimming and return_delim option
* src/wordsplit.c (_WSNF_DELIM): New node flag (wsnode_flagstr): Print 'd' for that flag. (expvar): Don't set WRDSF_WS when expanding variable value. This fixes, e.g., expansion of a$x if x begins with a whitespace. (wsnode_nullelim): A _WSNF_DELIM node breaks join chain. (wordsplit_trimws): Don't affect nodes within join chains. (scan_word): Set _WSNF_DELIM for returned delimiters. * tests/wordsplit.at (TESTWSP): 8th argument - prologue shell code. Use it to unset environment variables in env/getenv tests. Test ws elimination with return_delims set.
Diffstat (limited to 'src')
-rw-r--r--src/wordsplit.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/wordsplit.c b/src/wordsplit.c
index 29547f6..4715547 100644
--- a/src/wordsplit.c
+++ b/src/wordsplit.c
@@ -309,2 +309,3 @@ alloc_space (struct wordsplit *wsp, size_t count)
#define _WSNF_SEXP 0x20 /* is a sed expression */
+#define _WSNF_DELIM 0x40 /* node is a delimiter */
@@ -333,3 +334,3 @@ wsnode_flagstr (int flags)
{
- static char retbuf[6];
+ static char retbuf[7];
char *p = retbuf;
@@ -358,2 +359,6 @@ wsnode_flagstr (int flags)
*p++ = '-';
+ if (flags & _WSNF_DELIM)
+ *p++ = 'd';
+ else
+ *p++ = '-';
*p = 0;
@@ -1150,3 +1155,3 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
WRDSF_NOVAR | WRDSF_NOCMD |
- WRDSF_WS | WRDSF_QUOTE);
+ WRDSF_QUOTE);
free (value);
@@ -1270,2 +1275,4 @@ wsnode_nullelim (struct wordsplit *wsp)
struct wordsplit_node *next = p->next;
+ if (p->flags & _WSNF_DELIM && p->prev)
+ p->prev->flags &= ~_WSNF_JOIN;
if (p->flags & _WSNF_NULL)
@@ -1448,10 +1455,17 @@ wordsplit_trimws (struct wordsplit *wsp)
+ if (!(p->flags & _WSNF_QUOTE))
+ {
+ /* Skip leading whitespace: */
+ for (n = p->v.segm.beg; n < p->v.segm.end && ISWS (wsp->ws_input[n]);
+ n++)
+ ;
+ p->v.segm.beg = n;
+ }
+
+ while (p->next && (p->flags & _WSNF_JOIN))
+ p = p->next;
+
if (p->flags & _WSNF_QUOTE)
continue;
-
- /* Skip leading whitespace: */
- for (n = p->v.segm.beg; n < p->v.segm.end && ISWS (wsp->ws_input[n]);
- n++)
- ;
- p->v.segm.beg = n;
+
/* Trim trailing whitespace */
@@ -1837,2 +1851,3 @@ scan_word (struct wordsplit *wsp, size_t start)
i++;
+ flags |= _WSNF_DELIM;
}

Return to:

Send suggestions and report system problems to the System administrator.