Mercurial > vim
diff src/misc2.c @ 13750:3ab6198c1f9a v8.0.1747
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
commit https://github.com/vim/vim/commit/ebe74b73677b06db7d483987a863b41cee051cc0
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Apr 21 23:34:43 2018 +0200
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Problem: MS-Windows: term_start() does not set job_info() cmd.
Solution: Share the code from job_start() to set jv_argv.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 21 Apr 2018 23:45:06 +0200 |
parents | 260256caac38 |
children | 96e4c6b26998 |
line wrap: on
line diff
--- a/src/misc2.c +++ b/src/misc2.c @@ -6513,4 +6513,66 @@ mch_parse_cmd(char_u *cmd, int use_shcf, } return OK; } -#endif + +# if defined(FEAT_JOB_CHANNEL) || defined(PROTO) +/* + * Build "argv[argc]" from the string "cmd". + * "argv[argc]" is set to NULL; + * Return FAIL when out of memory. + */ + int +build_argv_from_string(char_u *cmd, char ***argv, int *argc) +{ + char_u *cmd_copy; + int i; + + /* Make a copy, parsing will modify "cmd". */ + cmd_copy = vim_strsave(cmd); + if (cmd_copy == NULL + || mch_parse_cmd(cmd_copy, FALSE, argv, argc) == FAIL) + { + vim_free(cmd_copy); + return FAIL; + } + for (i = 0; i < *argc; i++) + (*argv)[i] = (char *)vim_strsave((char_u *)(*argv)[i]); + (*argv)[*argc] = NULL; + vim_free(cmd_copy); + return OK; +} + +/* + * Build "argv[argc]" from the list "l". + * "argv[argc]" is set to NULL; + * Return FAIL when out of memory. + */ + int +build_argv_from_list(list_T *l, char ***argv, int *argc) +{ + listitem_T *li; + char_u *s; + + /* Pass argv[] to mch_call_shell(). */ + *argv = (char **)alloc(sizeof(char *) * (l->lv_len + 1)); + if (*argv == NULL) + return FAIL; + *argc = 0; + for (li = l->lv_first; li != NULL; li = li->li_next) + { + s = get_tv_string_chk(&li->li_tv); + if (s == NULL) + { + int i; + + for (i = 0; i < *argc; ++i) + vim_free((*argv)[i]); + return FAIL; + } + (*argv)[*argc] = (char *)vim_strsave(s); + *argc += 1; + } + (*argv)[*argc] = NULL; + return OK; +} +# endif +#endif