refactor(option): further align set_string_option with do_set_option_string (2)

This commit is contained in:
Lewis Russell 2023-07-13 12:21:54 +01:00
parent ec0ca51886
commit 3a45a0db4d
2 changed files with 45 additions and 8 deletions

View File

@ -1175,6 +1175,7 @@ static void do_set_option_string(int opt_idx, int opt_flags, char **argp, int ne
secure = secure_saved; secure = secure_saved;
// call autocommand after handling side effects
if (*errmsg == NULL) { if (*errmsg == NULL) {
if (!starting) { if (!starting) {
trigger_optionset_string(opt_idx, opt_flags, saved_origval, saved_origval_l, trigger_optionset_string(opt_idx, opt_flags, saved_origval, saved_origval_l,
@ -4485,7 +4486,7 @@ void *get_option_varp_scope_from(int opt_idx, int scope, buf_T *buf, win_T *win)
return get_varp_scope_from(&(options[opt_idx]), scope, buf, win); return get_varp_scope_from(&(options[opt_idx]), scope, buf, win);
} }
static void *get_varp_from(vimoption_T *p, buf_T *buf, win_T *win) void *get_varp_from(vimoption_T *p, buf_T *buf, win_T *win)
{ {
// hidden option, always return NULL // hidden option, always return NULL
if (p->var == NULL) { if (p->var == NULL) {

View File

@ -435,24 +435,46 @@ const char *set_string_option(const int opt_idx, const char *const value, const
{ {
vimoption_T *opt = get_option(opt_idx); vimoption_T *opt = get_option(opt_idx);
char **const varp char **varp = (char **)get_varp_scope(opt, ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0
= (char **)get_varp_scope(opt, ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0 ? ((opt->indir & PV_BOTH) ? OPT_GLOBAL : OPT_LOCAL)
? ((opt->indir & PV_BOTH) ? OPT_GLOBAL : OPT_LOCAL) : opt_flags));
: opt_flags));
char *origval_l = NULL; char *origval_l = NULL;
char *origval_g = NULL; char *origval_g = NULL;
// When using ":set opt=val" for a global option
// with a local value the local value will be
// reset, use the global value here.
if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0
&& ((int)opt->indir & PV_BOTH)) {
varp = (char **)opt->var;
}
// The old value is kept until we are sure that the new value is valid. // The old value is kept until we are sure that the new value is valid.
char *const oldval = *varp; char *const oldval = *varp;
if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0) { if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0) {
origval_l = *(char **)get_varp_scope(opt, OPT_LOCAL); origval_l = *(char **)get_varp_scope(opt, OPT_LOCAL);
origval_g = *(char **)get_varp_scope(opt, OPT_GLOBAL); origval_g = *(char **)get_varp_scope(opt, OPT_GLOBAL);
// A global-local string option might have an empty option as value to
// indicate that the global value should be used.
if (((int)opt->indir & PV_BOTH) && origval_l == empty_option) {
origval_l = origval_g;
}
}
char *origval;
// When setting the local value of a global option, the old value may be
// the global value.
if (((int)opt->indir & PV_BOTH) && (opt_flags & OPT_LOCAL)) {
origval = *(char **)get_varp_from(opt, curbuf, curwin);
} else {
origval = oldval;
} }
*varp = xstrdup(value); *varp = xstrdup(value);
char *const saved_oldval = xstrdup(oldval); char *const saved_origval = (origval != NULL) ? xstrdup(origval) : NULL;
char *const saved_oldval_l = (origval_l != NULL) ? xstrdup(origval_l) : 0; char *const saved_oldval_l = (origval_l != NULL) ? xstrdup(origval_l) : 0;
char *const saved_oldval_g = (origval_g != NULL) ? xstrdup(origval_g) : 0; char *const saved_oldval_g = (origval_g != NULL) ? xstrdup(origval_g) : 0;
@ -460,12 +482,26 @@ const char *set_string_option(const int opt_idx, const char *const value, const
// autocommands. // autocommands.
char *const saved_newval = xstrdup(*varp); char *const saved_newval = xstrdup(*varp);
const int secure_saved = secure;
// When an option is set in the sandbox, from a modeline or in secure
// mode, then deal with side effects in secure mode. Also when the
// value was set with the P_INSECURE flag and is not completely
// replaced.
if ((opt_flags & OPT_MODELINE)
|| sandbox != 0) {
secure = 1;
}
const char *const errmsg = did_set_string_option(curbuf, curwin, opt_idx, varp, oldval, errbuf, const char *const errmsg = did_set_string_option(curbuf, curwin, opt_idx, varp, oldval, errbuf,
errbuflen, opt_flags, value_checked); errbuflen, opt_flags, value_checked);
secure = secure_saved;
// call autocommand after handling side effects // call autocommand after handling side effects
if (errmsg == NULL) { if (errmsg == NULL) {
if (!starting) { if (!starting) {
trigger_optionset_string(opt_idx, opt_flags, saved_oldval, saved_oldval_l, trigger_optionset_string(opt_idx, opt_flags, saved_origval, saved_oldval_l,
saved_oldval_g, saved_newval); saved_oldval_g, saved_newval);
} }
if (opt->flags & P_UI_OPTION) { if (opt->flags & P_UI_OPTION) {
@ -473,7 +509,7 @@ const char *set_string_option(const int opt_idx, const char *const value, const
CSTR_AS_OBJ(saved_newval)); CSTR_AS_OBJ(saved_newval));
} }
} }
xfree(saved_oldval); xfree(saved_origval);
xfree(saved_oldval_l); xfree(saved_oldval_l);
xfree(saved_oldval_g); xfree(saved_oldval_g);
xfree(saved_newval); xfree(saved_newval);