Mercurial > vim
comparison src/evalfunc.c @ 28307:425700af491b v8.2.4679
patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Commit: https://github.com/vim/vim/commit/2b74b6805b5c8c4836b66df5d949f5ff6a77f8c7
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Sun Apr 3 21:30:32 2022 +0100
patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Problem: Cannot have expandcmd() give an error message for mistakes.
Solution: Add an optional argument to give errors. Fix memory leak when
expanding files fails. (Yegappan Lakshmanan, closes #10071)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 03 Apr 2022 22:45:04 +0200 |
parents | 9849df834f1d |
children | 1170b35651a5 |
comparison
equal
deleted
inserted
replaced
28306:371e6bb623ad | 28307:425700af491b |
---|---|
1759 ret_number_bool, f_exists_compiled}, | 1759 ret_number_bool, f_exists_compiled}, |
1760 {"exp", 1, 1, FEARG_1, arg1_float_or_nr, | 1760 {"exp", 1, 1, FEARG_1, arg1_float_or_nr, |
1761 ret_float, FLOAT_FUNC(f_exp)}, | 1761 ret_float, FLOAT_FUNC(f_exp)}, |
1762 {"expand", 1, 3, FEARG_1, arg3_string_bool_bool, | 1762 {"expand", 1, 3, FEARG_1, arg3_string_bool_bool, |
1763 ret_any, f_expand}, | 1763 ret_any, f_expand}, |
1764 {"expandcmd", 1, 1, FEARG_1, arg1_string, | 1764 {"expandcmd", 1, 2, FEARG_1, arg2_string_dict, |
1765 ret_string, f_expandcmd}, | 1765 ret_string, f_expandcmd}, |
1766 {"extend", 2, 3, FEARG_1, arg23_extend, | 1766 {"extend", 2, 3, FEARG_1, arg23_extend, |
1767 ret_extend, f_extend}, | 1767 ret_extend, f_extend}, |
1768 {"extendnew", 2, 3, FEARG_1, arg23_extendnew, | 1768 {"extendnew", 2, 3, FEARG_1, arg23_extendnew, |
1769 ret_first_cont, f_extendnew}, | 1769 ret_first_cont, f_extendnew}, |
4150 f_expandcmd(typval_T *argvars, typval_T *rettv) | 4150 f_expandcmd(typval_T *argvars, typval_T *rettv) |
4151 { | 4151 { |
4152 exarg_T eap; | 4152 exarg_T eap; |
4153 char_u *cmdstr; | 4153 char_u *cmdstr; |
4154 char *errormsg = NULL; | 4154 char *errormsg = NULL; |
4155 | 4155 int emsgoff = TRUE; |
4156 if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL) | 4156 |
4157 return; | 4157 if (in_vim9script() |
4158 && (check_for_string_arg(argvars, 0) == FAIL | |
4159 || check_for_opt_dict_arg(argvars, 1) == FAIL)) | |
4160 return; | |
4161 | |
4162 if (argvars[1].v_type == VAR_DICT | |
4163 && dict_get_bool(argvars[1].vval.v_dict, (char_u *)"errmsg", | |
4164 VVAL_FALSE)) | |
4165 emsgoff = FALSE; | |
4158 | 4166 |
4159 rettv->v_type = VAR_STRING; | 4167 rettv->v_type = VAR_STRING; |
4160 cmdstr = vim_strsave(tv_get_string(&argvars[0])); | 4168 cmdstr = vim_strsave(tv_get_string(&argvars[0])); |
4161 | 4169 |
4162 memset(&eap, 0, sizeof(eap)); | 4170 memset(&eap, 0, sizeof(eap)); |
4165 eap.argt |= EX_NOSPC; | 4173 eap.argt |= EX_NOSPC; |
4166 eap.usefilter = FALSE; | 4174 eap.usefilter = FALSE; |
4167 eap.nextcmd = NULL; | 4175 eap.nextcmd = NULL; |
4168 eap.cmdidx = CMD_USER; | 4176 eap.cmdidx = CMD_USER; |
4169 | 4177 |
4170 ++emsg_off; | 4178 if (emsgoff) |
4171 expand_filename(&eap, &cmdstr, &errormsg); | 4179 ++emsg_off; |
4172 --emsg_off; | 4180 if (expand_filename(&eap, &cmdstr, &errormsg) == FAIL) |
4181 if (!emsgoff && errormsg != NULL && *errormsg != NUL) | |
4182 emsg(errormsg); | |
4183 if (emsgoff) | |
4184 --emsg_off; | |
4173 | 4185 |
4174 rettv->vval.v_string = cmdstr; | 4186 rettv->vval.v_string = cmdstr; |
4175 } | 4187 } |
4176 | 4188 |
4177 /* | 4189 /* |