To: vim_dev@googlegroups.com Subject: Patch 8.0.1747 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1747 Problem: MS-Windows: term_start() does not set job_info() cmd. Solution: Share the code from job_start() to set jv_argv. Files: src/testdir/test_terminal.vim, src/channel.c, src/misc2.c, src/proto/misc2.pro, src/terminal.c *** ../vim-8.0.1746/src/testdir/test_terminal.vim 2018-04-21 20:02:32.738539943 +0200 --- src/testdir/test_terminal.vim 2018-04-21 22:35:59.997972267 +0200 *************** *** 786,791 **** --- 786,797 ---- let g:job = term_getjob(buf) call term_wait(buf, 50) + if has('win32') + call assert_equal('cmd', job_info(g:job).cmd[0]) + else + call assert_equal(&shell, job_info(g:job).cmd[0]) + endif + " ascii + composing let txt = "a\u0308bc" call term_sendkeys(buf, "echo " . txt . "\r") *** ../vim-8.0.1746/src/channel.c 2018-04-21 23:00:22.913439572 +0200 --- src/channel.c 2018-04-21 23:29:49.036123757 +0200 *************** *** 5563,5570 **** #endif if (argvars[0].v_type == VAR_STRING) { - char_u *cmd_copy; - /* Command is a string. */ cmd = argvars[0].vval.v_string; if (cmd == NULL || *cmd == NUL) --- 5563,5568 ---- *************** *** 5572,5589 **** EMSG(_(e_invarg)); goto theend; } ! /* 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); goto theend; - } - for (i = 0; i < argc; i++) - argv[i] = (char *)vim_strsave((char_u *)argv[i]); - argv[argc] = NULL; - vim_free(cmd_copy); } else if (argvars[0].v_type != VAR_LIST || argvars[0].vval.v_list == NULL --- 5570,5578 ---- EMSG(_(e_invarg)); goto theend; } ! ! if (build_argv_from_string(cmd, &argv, &argc) == FAIL) goto theend; } else if (argvars[0].v_type != VAR_LIST || argvars[0].vval.v_list == NULL *************** *** 5594,5620 **** } else { ! list_T *l = argvars[0].vval.v_list; ! listitem_T *li; ! char_u *s; ! /* Pass argv[] to mch_call_shell(). */ ! argv = (char **)alloc(sizeof(char *) * (l->lv_len + 1)); ! if (argv == NULL) goto theend; - for (li = l->lv_first; li != NULL; li = li->li_next) - { - s = get_tv_string_chk(&li->li_tv); - if (s == NULL) - { - for (i = 0; i < argc; ++i) - vim_free(argv[i]); - goto theend; - } - argv[argc++] = (char *)vim_strsave(s); - } - argv[argc] = NULL; - #ifndef USE_ARGV if (win32_build_cmd(l, &ga) == FAIL) goto theend; --- 5583,5592 ---- } else { ! list_T *l = argvars[0].vval.v_list; ! if (build_argv_from_list(l, &argv, &argc) == FAIL) goto theend; #ifndef USE_ARGV if (win32_build_cmd(l, &ga) == FAIL) goto theend; *** ../vim-8.0.1746/src/misc2.c 2018-04-21 22:30:04.712058412 +0200 --- src/misc2.c 2018-04-21 23:24:12.929917296 +0200 *************** *** 6513,6516 **** --- 6513,6578 ---- } return OK; } + + # 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 *** ../vim-8.0.1746/src/proto/misc2.pro 2018-04-21 22:30:04.712058412 +0200 --- src/proto/misc2.pro 2018-04-21 23:15:54.720239795 +0200 *************** *** 111,114 **** --- 111,116 ---- int has_non_ascii(char_u *s); void parse_queued_messages(void); int mch_parse_cmd(char_u *cmd, int use_shcf, char ***argv, int *argc); + int build_argv_from_string(char_u *cmd, char ***argv, int *argc); + int build_argv_from_list(list_T *l, char ***argv, int *argc); /* vim: set ft=c : */ *** ../vim-8.0.1746/src/terminal.c 2018-04-21 22:30:04.712058412 +0200 --- src/terminal.c 2018-04-21 23:16:40.644044898 +0200 *************** *** 5342,5347 **** --- 5342,5359 ---- job = job_alloc(); if (job == NULL) goto failed; + if (argvar->v_type == VAR_STRING) + { + int argc; + + build_argv_from_string(cmd, &job->jv_argv, &argc); + } + else + { + int argc; + + build_argv_from_list(argvar->vval.v_list, &job->jv_argv, &argc); + } if (opt->jo_set & JO_IN_BUF) job->jv_in_buf = buflist_findnr(opt->jo_io_buf[PART_IN]); *** ../vim-8.0.1746/src/version.c 2018-04-21 23:00:22.917439549 +0200 --- src/version.c 2018-04-21 23:33:33.683000794 +0200 *************** *** 763,764 **** --- 763,766 ---- { /* Add new patch number below this line */ + /**/ + 1747, /**/ -- hundred-and-one symptoms of being an internet addict: 244. You use more than 20 passwords. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///