diff options
Diffstat (limited to 'src/wordsplit.c')
-rw-r--r-- | src/wordsplit.c | 31 |
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; } |