Mercurial > vim
comparison src/channel.c @ 19245:5ed8297121fa v8.2.0181
patch 8.2.0181: problems parsing :term arguments
Commit: https://github.com/vim/vim/commit/21109272f5b0d32c408dc292561c0b1f2f8ebc53
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Jan 30 16:27:20 2020 +0100
patch 8.2.0181: problems parsing :term arguments
Problem: Problems parsing :term arguments.
Solution: Improve parsing, fix memory leak, add tests. (Ozaki Kiichi,
closes #5536)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 30 Jan 2020 16:30:04 +0100 |
parents | d776967d0f0d |
children | 473d7084a4a1 |
comparison
equal
deleted
inserted
replaced
19244:bb09b0f937ad | 19245:5ed8297121fa |
---|---|
4785 part = part_from_char(*hi->hi_key); | 4785 part = part_from_char(*hi->hi_key); |
4786 | 4786 |
4787 if (!(supported & JO_OUT_IO)) | 4787 if (!(supported & JO_OUT_IO)) |
4788 break; | 4788 break; |
4789 opt->jo_set |= JO_OUT_NAME << (part - PART_OUT); | 4789 opt->jo_set |= JO_OUT_NAME << (part - PART_OUT); |
4790 opt->jo_io_name[part] = | 4790 opt->jo_io_name[part] = tv_get_string_buf_chk(item, |
4791 tv_get_string_buf_chk(item, opt->jo_io_name_buf[part]); | 4791 opt->jo_io_name_buf[part]); |
4792 } | 4792 } |
4793 else if (STRCMP(hi->hi_key, "pty") == 0) | 4793 else if (STRCMP(hi->hi_key, "pty") == 0) |
4794 { | 4794 { |
4795 if (!(supported & JO_MODE)) | 4795 if (!(supported & JO_MODE)) |
4796 break; | 4796 break; |
4951 else if (STRCMP(hi->hi_key, "term_name") == 0) | 4951 else if (STRCMP(hi->hi_key, "term_name") == 0) |
4952 { | 4952 { |
4953 if (!(supported2 & JO2_TERM_NAME)) | 4953 if (!(supported2 & JO2_TERM_NAME)) |
4954 break; | 4954 break; |
4955 opt->jo_set2 |= JO2_TERM_NAME; | 4955 opt->jo_set2 |= JO2_TERM_NAME; |
4956 opt->jo_term_name = tv_get_string_chk(item); | 4956 opt->jo_term_name = tv_get_string_buf_chk(item, |
4957 opt->jo_term_name_buf); | |
4957 if (opt->jo_term_name == NULL) | 4958 if (opt->jo_term_name == NULL) |
4958 { | 4959 { |
4959 semsg(_(e_invargval), "term_name"); | 4960 semsg(_(e_invargval), "term_name"); |
4960 return FAIL; | 4961 return FAIL; |
4961 } | 4962 } |
4978 char_u *p; | 4979 char_u *p; |
4979 | 4980 |
4980 if (!(supported2 & JO2_TERM_OPENCMD)) | 4981 if (!(supported2 & JO2_TERM_OPENCMD)) |
4981 break; | 4982 break; |
4982 opt->jo_set2 |= JO2_TERM_OPENCMD; | 4983 opt->jo_set2 |= JO2_TERM_OPENCMD; |
4983 p = opt->jo_term_opencmd = tv_get_string_chk(item); | 4984 p = opt->jo_term_opencmd = tv_get_string_buf_chk(item, |
4985 opt->jo_term_opencmd_buf); | |
4984 if (p != NULL) | 4986 if (p != NULL) |
4985 { | 4987 { |
4986 // Must have %d and no other %. | 4988 // Must have %d and no other %. |
4987 p = vim_strchr(p, '%'); | 4989 p = vim_strchr(p, '%'); |
4988 if (p != NULL && (p[1] != 'd' | 4990 if (p != NULL && (p[1] != 'd' |
4995 return FAIL; | 4997 return FAIL; |
4996 } | 4998 } |
4997 } | 4999 } |
4998 else if (STRCMP(hi->hi_key, "eof_chars") == 0) | 5000 else if (STRCMP(hi->hi_key, "eof_chars") == 0) |
4999 { | 5001 { |
5000 char_u *p; | |
5001 | |
5002 if (!(supported2 & JO2_EOF_CHARS)) | 5002 if (!(supported2 & JO2_EOF_CHARS)) |
5003 break; | 5003 break; |
5004 opt->jo_set2 |= JO2_EOF_CHARS; | 5004 opt->jo_set2 |= JO2_EOF_CHARS; |
5005 p = opt->jo_eof_chars = tv_get_string_chk(item); | 5005 opt->jo_eof_chars = tv_get_string_buf_chk(item, |
5006 if (p == NULL) | 5006 opt->jo_eof_chars_buf); |
5007 if (opt->jo_eof_chars == NULL) | |
5007 { | 5008 { |
5008 semsg(_(e_invargval), "eof_chars"); | 5009 semsg(_(e_invargval), "eof_chars"); |
5009 return FAIL; | 5010 return FAIL; |
5010 } | 5011 } |
5011 } | 5012 } |
5080 else if (STRCMP(hi->hi_key, "term_kill") == 0) | 5081 else if (STRCMP(hi->hi_key, "term_kill") == 0) |
5081 { | 5082 { |
5082 if (!(supported2 & JO2_TERM_KILL)) | 5083 if (!(supported2 & JO2_TERM_KILL)) |
5083 break; | 5084 break; |
5084 opt->jo_set2 |= JO2_TERM_KILL; | 5085 opt->jo_set2 |= JO2_TERM_KILL; |
5085 opt->jo_term_kill = tv_get_string_chk(item); | 5086 opt->jo_term_kill = tv_get_string_buf_chk(item, |
5087 opt->jo_term_kill_buf); | |
5088 if (opt->jo_term_kill == NULL) | |
5089 { | |
5090 semsg(_(e_invargval), "term_kill"); | |
5091 return FAIL; | |
5092 } | |
5086 } | 5093 } |
5087 else if (STRCMP(hi->hi_key, "tty_type") == 0) | 5094 else if (STRCMP(hi->hi_key, "tty_type") == 0) |
5088 { | 5095 { |
5089 char_u *p; | 5096 char_u *p; |
5090 | 5097 |
5155 { | 5162 { |
5156 if (!(supported2 & JO2_TERM_API)) | 5163 if (!(supported2 & JO2_TERM_API)) |
5157 break; | 5164 break; |
5158 opt->jo_set2 |= JO2_TERM_API; | 5165 opt->jo_set2 |= JO2_TERM_API; |
5159 opt->jo_term_api = tv_get_string_buf_chk(item, | 5166 opt->jo_term_api = tv_get_string_buf_chk(item, |
5160 opt->jo_term_api_buf); | 5167 opt->jo_term_api_buf); |
5168 if (opt->jo_term_api == NULL) | |
5169 { | |
5170 semsg(_(e_invargval), "term_api"); | |
5171 return FAIL; | |
5172 } | |
5161 } | 5173 } |
5162 #endif | 5174 #endif |
5163 else if (STRCMP(hi->hi_key, "env") == 0) | 5175 else if (STRCMP(hi->hi_key, "env") == 0) |
5164 { | 5176 { |
5165 if (!(supported2 & JO2_ENV)) | 5177 if (!(supported2 & JO2_ENV)) |
5245 { | 5257 { |
5246 if (!(supported & JO_STOPONEXIT)) | 5258 if (!(supported & JO_STOPONEXIT)) |
5247 break; | 5259 break; |
5248 opt->jo_set |= JO_STOPONEXIT; | 5260 opt->jo_set |= JO_STOPONEXIT; |
5249 opt->jo_stoponexit = tv_get_string_buf_chk(item, | 5261 opt->jo_stoponexit = tv_get_string_buf_chk(item, |
5250 opt->jo_soe_buf); | 5262 opt->jo_stoponexit_buf); |
5251 if (opt->jo_stoponexit == NULL) | 5263 if (opt->jo_stoponexit == NULL) |
5252 { | 5264 { |
5253 semsg(_(e_invargval), "stoponexit"); | 5265 semsg(_(e_invargval), "stoponexit"); |
5254 return FAIL; | 5266 return FAIL; |
5255 } | 5267 } |
5815 job_T * | 5827 job_T * |
5816 job_start( | 5828 job_start( |
5817 typval_T *argvars, | 5829 typval_T *argvars, |
5818 char **argv_arg UNUSED, | 5830 char **argv_arg UNUSED, |
5819 jobopt_T *opt_arg, | 5831 jobopt_T *opt_arg, |
5820 int is_terminal UNUSED) | 5832 job_T **term_job) |
5821 { | 5833 { |
5822 job_T *job; | 5834 job_T *job; |
5823 char_u *cmd = NULL; | 5835 char_u *cmd = NULL; |
5824 char **argv = NULL; | 5836 char **argv = NULL; |
5825 int argc = 0; | 5837 int argc = 0; |
5966 } | 5978 } |
5967 | 5979 |
5968 // Save the command used to start the job. | 5980 // Save the command used to start the job. |
5969 job->jv_argv = argv; | 5981 job->jv_argv = argv; |
5970 | 5982 |
5983 if (term_job != NULL) | |
5984 *term_job = job; | |
5985 | |
5971 #ifdef USE_ARGV | 5986 #ifdef USE_ARGV |
5972 if (ch_log_active()) | 5987 if (ch_log_active()) |
5973 { | 5988 { |
5974 garray_T ga; | 5989 garray_T ga; |
5975 | 5990 |
5982 } | 5997 } |
5983 ga_append(&ga, NUL); | 5998 ga_append(&ga, NUL); |
5984 ch_log(NULL, "Starting job: %s", (char *)ga.ga_data); | 5999 ch_log(NULL, "Starting job: %s", (char *)ga.ga_data); |
5985 ga_clear(&ga); | 6000 ga_clear(&ga); |
5986 } | 6001 } |
5987 mch_job_start(argv, job, &opt, is_terminal); | 6002 mch_job_start(argv, job, &opt, term_job != NULL); |
5988 #else | 6003 #else |
5989 ch_log(NULL, "Starting job: %s", (char *)cmd); | 6004 ch_log(NULL, "Starting job: %s", (char *)cmd); |
5990 mch_job_start((char *)cmd, job, &opt); | 6005 mch_job_start((char *)cmd, job, &opt); |
5991 #endif | 6006 #endif |
5992 | 6007 |
6598 f_job_start(typval_T *argvars, typval_T *rettv) | 6613 f_job_start(typval_T *argvars, typval_T *rettv) |
6599 { | 6614 { |
6600 rettv->v_type = VAR_JOB; | 6615 rettv->v_type = VAR_JOB; |
6601 if (check_restricted() || check_secure()) | 6616 if (check_restricted() || check_secure()) |
6602 return; | 6617 return; |
6603 rettv->vval.v_job = job_start(argvars, NULL, NULL, FALSE); | 6618 rettv->vval.v_job = job_start(argvars, NULL, NULL, NULL); |
6604 } | 6619 } |
6605 | 6620 |
6606 /* | 6621 /* |
6607 * "job_status()" function | 6622 * "job_status()" function |
6608 */ | 6623 */ |