static int wordsplit_process_list (struct wordsplit *wsp, size_t start) { struct exptab *p; if (wsp->ws_flags & WRDSF_NOSPLIT) { /* Treat entire input as a quoted argument */ if (wordsplit_add_segm (wsp, start, wsp->ws_len, _WSNF_QUOTE)) return wsp->ws_errno; } else { int rc; while ((rc = scan_word (wsp, start)) == _WRDS_OK) start = skip_delim (wsp); /* Make sure tail element is not joinable */ if (wsp->ws_tail) wsp->ws_tail->flags &= ~_WSNF_JOIN; if (rc == _WRDS_ERR) return wsp->ws_errno; } if (wsp->ws_flags & WRDSF_SHOWDBG) { wsp->ws_debug ("(%02d) %s", wsp->ws_lvl, _("Initial list:")); wordsplit_dump_nodes (wsp); } for (p = exptab; p->descr; p++) { if ((p->opt & EXPOPT_NEG) ? !(wsp->ws_flags & p->flag) : (wsp->ws_flags & p->flag)) { if (p->opt & EXPOPT_COALESCE) { if (wsnode_coalesce (wsp)) break; if (wsp->ws_flags & WRDSF_SHOWDBG) { wsp->ws_debug ("(%02d) %s", wsp->ws_lvl, _("Coalesced list:")); wordsplit_dump_nodes (wsp); } } if (p->expansion) { if (p->expansion (wsp)) break; if (wsp->ws_flags & WRDSF_SHOWDBG) { wsp->ws_debug ("(%02d) %s", wsp->ws_lvl, _(p->descr)); wordsplit_dump_nodes (wsp); } } } } return wsp->ws_errno; }
static int wordsplit_process_list (struct wordsplit *wsp, size_t start) { if (wsp->ws_flags & WRDSF_NOSPLIT) { /* Treat entire input as a quoted argument */ if (wordsplit_add_segm (wsp, start, wsp->ws_len, _WSNF_QUOTE)) return wsp->ws_errno; } else { int rc; while ((rc = scan_word (wsp, start)) == _WRDS_OK) start = skip_delim (wsp); /* Make sure tail element is not joinable */ if (wsp->ws_tail) wsp->ws_tail->flags &= ~_WSNF_JOIN; if (rc == _WRDS_ERR) return wsp->ws_errno; } if (wsp->ws_flags & WRDSF_SHOWDBG) { wsp->ws_debug ("Initial list:"); wordsplit_dump_nodes (wsp); } if (wsp->ws_flags & WRDSF_WS) { /* Trim leading and trailing whitespace */ wordsplit_trimws (wsp); if (wsp->ws_flags & WRDSF_SHOWDBG) { wsp->ws_debug ("After WS trimming:"); wordsplit_dump_nodes (wsp); } } /* Expand variables (FIXME: & commands) */ if (!(wsp->ws_flags & WRDSF_NOVAR)) { if (wordsplit_varexp (wsp)) { wordsplit_free_nodes (wsp); return wsp->ws_errno; } if (wsp->ws_flags & WRDSF_SHOWDBG) { wsp->ws_debug ("Expanded list:"); wordsplit_dump_nodes (wsp); } } do { if (wsnode_quoteremoval (wsp)) break; if (wsp->ws_flags & WRDSF_SHOWDBG) { wsp->ws_debug ("After quote removal:"); wordsplit_dump_nodes (wsp); } if (wsnode_coalesce (wsp)) break; if (wsp->ws_flags & WRDSF_SHOWDBG) { wsp->ws_debug ("Coalesced list:"); wordsplit_dump_nodes (wsp); } } while (0); return wsp->ws_errno; }