static int wordsplit_init (struct wordsplit *wsp, const char *input, size_t len, int flags) { wsp->ws_flags = flags; if (!(wsp->ws_flags & WRDSF_ALLOC_DIE)) wsp->ws_alloc_die = _wsplt_alloc_die; if (!(wsp->ws_flags & WRDSF_ERROR)) wsp->ws_error = _wsplt_error; if (!(wsp->ws_flags & WRDSF_NOVAR) && !(wsp->ws_flags & (WRDSF_ENV | WRDSF_GETVAR))) { errno = EINVAL; wsp->ws_errno = WRDSE_USAGE; if (wsp->ws_flags & WRDSF_SHOWERR) wordsplit_perror (wsp); return wsp->ws_errno; } if (!(wsp->ws_flags & WRDSF_NOCMD)) { errno = EINVAL; wsp->ws_errno = WRDSE_NOSUPP; if (wsp->ws_flags & WRDSF_SHOWERR) wordsplit_perror (wsp); return wsp->ws_errno; } if (wsp->ws_flags & WRDSF_SHOWDBG) { if (!(wsp->ws_flags & WRDSF_DEBUG)) { if (wsp->ws_flags & WRDSF_ERROR) wsp->ws_debug = wsp->ws_error; else if (wsp->ws_flags & WRDSF_SHOWERR) wsp->ws_debug = _wsplt_error; else wsp->ws_flags &= ~WRDSF_SHOWDBG; } } wsp->ws_input = input; wsp->ws_len = len; if (!(wsp->ws_flags & WRDSF_DOOFFS)) wsp->ws_offs = 0; if (!(wsp->ws_flags & WRDSF_DELIM)) wsp->ws_delim = " \t\n"; if (!(wsp->ws_flags & WRDSF_COMMENT)) wsp->ws_comment = NULL; if (!(wsp->ws_flags & WRDSF_CLOSURE)) wsp->ws_closure = NULL; wsp->ws_endp = 0; wordsplit_init0 (wsp); return 0; }
int wordsplit_len (const char *command, size_t length, struct wordsplit *wsp, int flags) { int rc; size_t start; const char *cmdptr; size_t cmdlen; if (!command) { if (!(flags & WRDSF_INCREMENTAL)) return EINVAL; start = skip_delim (wsp); if (wsp->ws_endp == wsp->ws_len) { wsp->ws_errno = WRDSE_NOINPUT; if (wsp->ws_flags & WRDSF_SHOWERR) wordsplit_perror (wsp); return wsp->ws_errno; } cmdptr = wsp->ws_input + wsp->ws_endp; cmdlen = wsp->ws_len - wsp->ws_endp; wsp->ws_flags |= WRDSF_REUSE; wordsplit_init0 (wsp); } else { cmdptr = command; cmdlen = length; start = 0; rc = wordsplit_init (wsp, cmdptr, cmdlen, flags); if (rc) return rc; } if (wsp->ws_flags & WRDSF_SHOWDBG) wsp->ws_debug ("Input:%.*s;", (int) cmdlen, cmdptr); rc = wordsplit_process_list (wsp, start); if (rc == 0 && (flags & WRDSF_INCREMENTAL)) { while (!wsp->ws_head && wsp->ws_endp < wsp->ws_len) { start = skip_delim (wsp); if (wsp->ws_flags & WRDSF_SHOWDBG) { cmdptr = wsp->ws_input + wsp->ws_endp; cmdlen = wsp->ws_len - wsp->ws_endp; wsp->ws_debug ("Restart:%.*s;", (int) cmdlen, cmdptr); } rc = wordsplit_process_list (wsp, start); if (rc) break; } } if (rc) { wordsplit_free_nodes (wsp); return rc; } wordsplit_finish (wsp); wordsplit_free_nodes (wsp); return wsp->ws_errno; }
static int wordsplit_init (struct wordsplit *wsp, const char *input, size_t len, int flags) { wsp->ws_flags = flags; if (!(wsp->ws_flags & WRDSF_ALLOC_DIE)) wsp->ws_alloc_die = _wsplt_alloc_die; if (!(wsp->ws_flags & WRDSF_ERROR)) wsp->ws_error = _wsplt_error; if (!(wsp->ws_flags & WRDSF_NOVAR)) { /* These will be initialized on first variable assignment */ wsp->ws_envidx = wsp->ws_envsiz = 0; wsp->ws_envbuf = NULL; } if (!(wsp->ws_flags & WRDSF_NOCMD)) { if (!wsp->ws_command) { _wsplt_seterr (wsp, WRDSE_USAGE); errno = EINVAL; return wsp->ws_errno; } } if (wsp->ws_flags & WRDSF_SHOWDBG) { if (!(wsp->ws_flags & WRDSF_DEBUG)) { if (wsp->ws_flags & WRDSF_ERROR) wsp->ws_debug = wsp->ws_error; else if (wsp->ws_flags & WRDSF_SHOWERR) wsp->ws_debug = _wsplt_error; else wsp->ws_flags &= ~WRDSF_SHOWDBG; } } wsp->ws_input = input; wsp->ws_len = len; if (!(wsp->ws_flags & WRDSF_DOOFFS)) wsp->ws_offs = 0; if (!(wsp->ws_flags & WRDSF_DELIM)) wsp->ws_delim = " \t\n"; if (!(wsp->ws_flags & WRDSF_COMMENT)) wsp->ws_comment = NULL; if (!(wsp->ws_flags & WRDSF_CLOSURE)) wsp->ws_closure = NULL; if (!(wsp->ws_flags & WRDSF_OPTIONS)) wsp->ws_options = 0; if (wsp->ws_flags & WRDSF_ESCAPE) { if (!wsp->ws_escape[WRDSX_WORD]) wsp->ws_escape[WRDSX_WORD] = ""; if (!wsp->ws_escape[WRDSX_QUOTE]) wsp->ws_escape[WRDSX_QUOTE] = ""; } else { if (wsp->ws_flags & WRDSF_CESCAPES) { wsp->ws_escape[WRDSX_WORD] = wordsplit_c_escape_tab; wsp->ws_escape[WRDSX_QUOTE] = wordsplit_c_escape_tab; wsp->ws_options |= WRDSO_OESC_QUOTE | WRDSO_OESC_WORD | WRDSO_XESC_QUOTE | WRDSO_XESC_WORD; } else { wsp->ws_escape[WRDSX_WORD] = ""; wsp->ws_escape[WRDSX_QUOTE] = "\\\\\"\""; wsp->ws_options |= WRDSO_BSKEEP_QUOTE; } } wsp->ws_endp = 0; wordsplit_init0 (wsp); return 0; }