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 /*