diff options
Diffstat (limited to 'src/nvim/optionstr.c')
-rw-r--r-- | src/nvim/optionstr.c | 335 |
1 files changed, 172 insertions, 163 deletions
diff --git a/src/nvim/optionstr.c b/src/nvim/optionstr.c index 808a70c8cb..1da6fa15d7 100644 --- a/src/nvim/optionstr.c +++ b/src/nvim/optionstr.c @@ -75,6 +75,7 @@ static char *(p_ssop_values[]) = { "buffers", "winpos", "resize", "winsize", "lo // Keep in sync with SWB_ flags in option_defs.h static char *(p_swb_values[]) = { "useopen", "usetab", "split", "newtab", "vsplit", "uselast", NULL }; +static char *(p_spk_values[]) = { "cursor", "screen", "topline", NULL }; static char *(p_tc_values[]) = { "followic", "ignore", "match", "followscs", "smart", NULL }; static char *(p_ve_values[]) = { "block", "insert", "all", "onemore", "none", "NONE", NULL }; static char *(p_wop_values[]) = { "tagfile", "pum", NULL }; @@ -107,36 +108,37 @@ static char *(p_fdc_values[]) = { "auto", "auto:1", "auto:2", "auto:3", "auto:4" "auto:6", "auto:7", "auto:8", "auto:9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL }; static char *(p_cb_values[]) = { "unnamed", "unnamedplus", NULL }; +static char *(p_spo_values[]) = { "camel", "noplainbuffer", NULL }; static char *(p_icm_values[]) = { "nosplit", "split", NULL }; static char *(p_jop_values[]) = { "stack", "view", NULL }; static char *(p_tpf_values[]) = { "BS", "HT", "FF", "ESC", "DEL", "C0", "C1", NULL }; static char *(p_rdb_values[]) = { "compositor", "nothrottle", "invalid", "nodelta", NULL }; /// All possible flags for 'shm'. -static char_u SHM_ALL[] = { SHM_RO, SHM_MOD, SHM_FILE, SHM_LAST, SHM_TEXT, SHM_LINES, SHM_NEW, - SHM_WRI, SHM_ABBREVIATIONS, SHM_WRITE, SHM_TRUNC, SHM_TRUNCALL, - SHM_OVER, SHM_OVERALL, SHM_SEARCH, SHM_ATTENTION, SHM_INTRO, - SHM_COMPLETIONMENU, SHM_RECORDING, SHM_FILEINFO, SHM_SEARCHCOUNT, 0, }; +static char SHM_ALL[] = { SHM_RO, SHM_MOD, SHM_FILE, SHM_LAST, SHM_TEXT, SHM_LINES, SHM_NEW, + SHM_WRI, SHM_ABBREVIATIONS, SHM_WRITE, SHM_TRUNC, SHM_TRUNCALL, + SHM_OVER, SHM_OVERALL, SHM_SEARCH, SHM_ATTENTION, SHM_INTRO, + SHM_COMPLETIONMENU, SHM_RECORDING, SHM_FILEINFO, SHM_SEARCHCOUNT, 0, }; /// After setting various option values: recompute variables that depend on /// option values. void didset_string_options(void) { - (void)opt_strings_flags((char_u *)p_cmp, p_cmp_values, &cmp_flags, true); - (void)opt_strings_flags((char_u *)p_bkc, p_bkc_values, &bkc_flags, true); - (void)opt_strings_flags((char_u *)p_bo, p_bo_values, &bo_flags, true); - (void)opt_strings_flags((char_u *)p_ssop, p_ssop_values, &ssop_flags, true); - (void)opt_strings_flags((char_u *)p_vop, p_ssop_values, &vop_flags, true); - (void)opt_strings_flags((char_u *)p_fdo, p_fdo_values, &fdo_flags, true); - (void)opt_strings_flags((char_u *)p_dy, p_dy_values, &dy_flags, true); - (void)opt_strings_flags((char_u *)p_rdb, p_rdb_values, &rdb_flags, true); - (void)opt_strings_flags((char_u *)p_tc, p_tc_values, &tc_flags, false); - (void)opt_strings_flags((char_u *)p_tpf, p_tpf_values, &tpf_flags, true); + (void)opt_strings_flags(p_cmp, p_cmp_values, &cmp_flags, true); + (void)opt_strings_flags(p_bkc, p_bkc_values, &bkc_flags, true); + (void)opt_strings_flags(p_bo, p_bo_values, &bo_flags, true); + (void)opt_strings_flags(p_ssop, p_ssop_values, &ssop_flags, true); + (void)opt_strings_flags(p_vop, p_ssop_values, &vop_flags, true); + (void)opt_strings_flags(p_fdo, p_fdo_values, &fdo_flags, true); + (void)opt_strings_flags(p_dy, p_dy_values, &dy_flags, true); + (void)opt_strings_flags(p_rdb, p_rdb_values, &rdb_flags, true); + (void)opt_strings_flags(p_tc, p_tc_values, &tc_flags, false); + (void)opt_strings_flags(p_tpf, p_tpf_values, &tpf_flags, true); (void)opt_strings_flags(p_ve, p_ve_values, &ve_flags, true); - (void)opt_strings_flags((char_u *)p_swb, p_swb_values, &swb_flags, true); - (void)opt_strings_flags((char_u *)p_wop, p_wop_values, &wop_flags, true); - (void)opt_strings_flags((char_u *)p_jop, p_jop_values, &jop_flags, true); - (void)opt_strings_flags((char_u *)p_cb, p_cb_values, &cb_flags, true); + (void)opt_strings_flags(p_swb, p_swb_values, &swb_flags, true); + (void)opt_strings_flags(p_wop, p_wop_values, &wop_flags, true); + (void)opt_strings_flags(p_jop, p_jop_values, &jop_flags, true); + (void)opt_strings_flags(p_cb, p_cb_values, &cb_flags, true); } /// Trigger the OptionSet autocommand. @@ -177,7 +179,7 @@ void trigger_optionsset_string(int opt_idx, int opt_flags, char *oldval, char *o set_vim_var_string(VV_OPTION_COMMAND, "modeline", -1); set_vim_var_string(VV_OPTION_OLDLOCAL, oldval, -1); } - apply_autocmds(EVENT_OPTIONSET, get_option_fullname(opt_idx), NULL, false, NULL); + apply_autocmds(EVENT_OPTIONSET, get_option(opt_idx)->fullname, NULL, false, NULL); reset_v_option_vars(); } } @@ -252,7 +254,7 @@ void check_buf_options(buf_T *buf) /// Free the string allocated for an option. /// Checks for the string being empty_option. This may happen if we're out of -/// memory, vim_strsave() returned NULL, which was replaced by empty_option by +/// memory, xstrdup() returned NULL, which was replaced by empty_option by /// check_options(). /// Does NOT check for P_ALLOCED flag! void free_string_option(char *p) @@ -279,19 +281,19 @@ void check_string_option(char **pp) /// Set global value for string option when it's a local option. /// -/// @param opt_idx option index +/// @param opt option /// @param varp pointer to option variable -static void set_string_option_global(int opt_idx, char **varp) +static void set_string_option_global(vimoption_T *opt, char **varp) { char **p; // the global value is always allocated - if (is_window_local_option(opt_idx)) { + if (opt->var == VAR_WIN) { p = (char **)GLOBAL_WO(varp); } else { - p = (char **)get_option_var(opt_idx); + p = (char **)opt->var; } - if (!is_global_option(opt_idx) && p != varp) { + if (opt->indir != PV_NONE && p != varp) { char *s = xstrdup(*varp); free_string_option(*p); *p = s; @@ -323,30 +325,32 @@ void set_string_option_direct(const char *name, int opt_idx, const char *val, in } } - if (is_hidden_option(idx)) { // can't set hidden option + vimoption_T *opt = get_option(idx); + + if (opt->var == NULL) { // can't set hidden option return; } - assert((void *)get_option_var(idx) != (void *)&p_shada); + assert((void *)opt->var != (void *)&p_shada); s = xstrdup(val); { - varp = (char **)get_option_varp_scope(idx, both ? OPT_LOCAL : opt_flags); - if ((opt_flags & OPT_FREE) && (get_option_flags(idx) & P_ALLOCED)) { + varp = (char **)get_varp_scope(opt, both ? OPT_LOCAL : opt_flags); + if ((opt_flags & OPT_FREE) && (opt->flags & P_ALLOCED)) { free_string_option(*varp); } *varp = s; // For buffer/window local option may also set the global value. if (both) { - set_string_option_global(idx, varp); + set_string_option_global(opt, varp); } - set_option_flag(idx, P_ALLOCED); + opt->flags |= P_ALLOCED; // When setting both values of a global option with a local value, // make the local value empty, so that the global value is used. - if (is_global_local_option(idx) && both) { + if ((opt->indir & PV_BOTH) && both) { free_string_option(*varp); *varp = empty_option; } @@ -392,24 +396,24 @@ void set_string_option_direct_in_win(win_T *wp, const char *name, int opt_idx, c char *set_string_option(const int opt_idx, const char *const value, const int opt_flags) FUNC_ATTR_NONNULL_ARG(2) FUNC_ATTR_WARN_UNUSED_RESULT { - if (is_hidden_option(opt_idx)) { // don't set hidden option + vimoption_T *opt = get_option(opt_idx); + + if (opt->var == NULL) { // don't set hidden option return NULL; } char *const s = xstrdup(value); char **const varp - = (char **)get_option_varp_scope(opt_idx, - (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0 - ? (is_global_local_option(opt_idx) - ? OPT_GLOBAL : OPT_LOCAL) - : opt_flags); + = (char **)get_varp_scope(opt, ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0 + ? ((opt->indir & PV_BOTH) ? OPT_GLOBAL : OPT_LOCAL) + : opt_flags)); char *const oldval = *varp; char *oldval_l = NULL; char *oldval_g = NULL; if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0) { - oldval_l = *(char **)get_option_varp_scope(opt_idx, OPT_LOCAL); - oldval_g = *(char **)get_option_varp_scope(opt_idx, OPT_GLOBAL); + oldval_l = *(char **)get_varp_scope(opt, OPT_LOCAL); + oldval_g = *(char **)get_varp_scope(opt, OPT_GLOBAL); } *varp = s; @@ -433,8 +437,8 @@ char *set_string_option(const int opt_idx, const char *const value, const int op trigger_optionsset_string(opt_idx, opt_flags, saved_oldval, saved_oldval_l, saved_oldval_g, saved_newval); } - if (get_option_flags(opt_idx) & P_UI_OPTION) { - ui_call_option_set(cstr_as_string(get_option_fullname(opt_idx)), + if (opt->flags & P_UI_OPTION) { + ui_call_option_set(cstr_as_string(opt->fullname), STRING_OBJ(cstr_as_string(saved_newval))); } } @@ -448,7 +452,7 @@ char *set_string_option(const int opt_idx, const char *const value, const int op /// Return true if "val" is a valid 'filetype' name. /// Also used for 'syntax' and 'keymap'. -static bool valid_filetype(const char_u *val) +static bool valid_filetype(const char *val) FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT { return valid_name(val, ".-_"); @@ -463,7 +467,7 @@ static char *check_mousescroll(char *string) for (;;) { char *end = vim_strchr(string, ','); - size_t length = end ? (size_t)(end - string) : STRLEN(string); + size_t length = end ? (size_t)(end - string) : strlen(string); // Both "ver:" and "hor:" are 4 bytes long. // They should be followed by at least one digit. @@ -520,7 +524,7 @@ static char *check_mousescroll(char *string) /// Handle setting 'signcolumn' for value 'val' /// /// @return OK when the value is valid, FAIL otherwise -static int check_signcolumn(char_u *val) +static int check_signcolumn(char *val) { if (*val == NUL) { return FAIL; @@ -531,7 +535,7 @@ static int check_signcolumn(char_u *val) } // check for 'auto:<NUMBER>-<NUMBER>' - if (STRLEN(val) == 8 + if (strlen(val) == 8 && !STRNCMP(val, "auto:", 5) && ascii_isdigit(val[5]) && val[6] == '-' @@ -637,27 +641,27 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf char *errmsg = NULL; char *s, *p; int did_chartab = false; - char_u **gvarp; - bool free_oldval = (get_option_flags(opt_idx) & P_ALLOCED); + vimoption_T *opt = get_option(opt_idx); + bool free_oldval = (opt->flags & P_ALLOCED); bool value_changed = false; // Get the global option to compare with, otherwise we would have to check // two values for all local options. - gvarp = (char_u **)get_option_varp_scope(opt_idx, OPT_GLOBAL); + char **gvarp = (char **)get_varp_scope(opt, OPT_GLOBAL); // Disallow changing some options from secure mode if ((secure || sandbox != 0) - && (get_option_flags(opt_idx) & P_SECURE)) { + && (opt->flags & P_SECURE)) { errmsg = e_secure; - } else if (((get_option_flags(opt_idx) & P_NFNAME) + } else if (((opt->flags & P_NFNAME) && strpbrk(*varp, (secure ? "/\\*?[|;&<>\r\n" : "/\\*?[<>\r\n")) != NULL) - || ((get_option_flags(opt_idx) & P_NDNAME) + || ((opt->flags & P_NDNAME) && strpbrk(*varp, "*?[|;&<>\r\n") != NULL)) { // Check for a "normal" directory or file name in some options. Disallow a // path separator (slash and/or backslash), wildcards and characters that // are often illegal in a file name. Be more permissive if "secure" is off. errmsg = e_invarg; - } else if (gvarp == (char_u **)&p_bkc) { // 'backupcopy' + } else if (gvarp == &p_bkc) { // 'backupcopy' char *bkc = p_bkc; unsigned int *flags = &bkc_flags; @@ -670,7 +674,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf // make the local value empty: use the global value *flags = 0; } else { - if (opt_strings_flags((char_u *)bkc, p_bkc_values, flags, true) != OK) { + if (opt_strings_flags(bkc, p_bkc_values, flags, true) != OK) { errmsg = e_invarg; } @@ -678,12 +682,12 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf + ((*flags & BKC_YES) != 0) + ((*flags & BKC_NO) != 0) != 1) { // Must have exactly one of "auto", "yes" and "no". - (void)opt_strings_flags((char_u *)oldval, p_bkc_values, flags, true); + (void)opt_strings_flags(oldval, p_bkc_values, flags, true); errmsg = e_invarg; } } } else if (varp == &p_bex || varp == &p_pm) { // 'backupext' and 'patchmode' - if (STRCMP(*p_bex == '.' ? p_bex + 1 : p_bex, + if (strcmp(*p_bex == '.' ? p_bex + 1 : p_bex, *p_pm == '.' ? p_pm + 1 : p_pm) == 0) { errmsg = e_backupext_and_patchmode_are_equal; } @@ -713,8 +717,8 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } else if (varp == &p_rtp || varp == &p_pp) { // 'runtimepath' 'packpath' runtime_search_path_invalidate(); } else if (varp == &curwin->w_p_culopt - || gvarp == (char_u **)&curwin->w_allbuf_opt.wo_culopt) { // 'cursorlineopt' - if (**varp == NUL || fill_culopt_flags((char_u *)(*varp), curwin) != OK) { + || gvarp == &curwin->w_allbuf_opt.wo_culopt) { // 'cursorlineopt' + if (**varp == NUL || fill_culopt_flags(*varp, curwin) != OK) { errmsg = e_invarg; } } else if (varp == &curwin->w_p_cc) { // 'colorcolumn' @@ -731,46 +735,46 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } } } else if (varp == &p_hl) { // 'highlight' - if (STRCMP(*varp, HIGHLIGHT_INIT) != 0) { + if (strcmp(*varp, HIGHLIGHT_INIT) != 0) { errmsg = e_unsupportedoption; } } else if (varp == &p_jop) { // 'jumpoptions' - if (opt_strings_flags((char_u *)p_jop, p_jop_values, &jop_flags, true) != OK) { + if (opt_strings_flags(p_jop, p_jop_values, &jop_flags, true) != OK) { errmsg = e_invarg; } } else if (gvarp == &p_nf) { // 'nrformats' - if (check_opt_strings((char_u *)(*varp), p_nf_values, true) != OK) { + if (check_opt_strings(*varp, p_nf_values, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_ssop) { // 'sessionoptions' - if (opt_strings_flags((char_u *)p_ssop, p_ssop_values, &ssop_flags, true) != OK) { + if (opt_strings_flags(p_ssop, p_ssop_values, &ssop_flags, true) != OK) { errmsg = e_invarg; } if ((ssop_flags & SSOP_CURDIR) && (ssop_flags & SSOP_SESDIR)) { // Don't allow both "sesdir" and "curdir". - (void)opt_strings_flags((char_u *)oldval, p_ssop_values, &ssop_flags, true); + (void)opt_strings_flags(oldval, p_ssop_values, &ssop_flags, true); errmsg = e_invarg; } } else if (varp == &p_vop) { // 'viewoptions' - if (opt_strings_flags((char_u *)p_vop, p_ssop_values, &vop_flags, true) != OK) { + if (opt_strings_flags(p_vop, p_ssop_values, &vop_flags, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_rdb) { // 'redrawdebug' - if (opt_strings_flags((char_u *)p_rdb, p_rdb_values, &rdb_flags, true) != OK) { + if (opt_strings_flags(p_rdb, p_rdb_values, &rdb_flags, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_sbo) { // 'scrollopt' - if (check_opt_strings((char_u *)p_sbo, p_scbopt_values, true) != OK) { + if (check_opt_strings(p_sbo, p_scbopt_values, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_ambw || (int *)varp == &p_emoji) { // 'ambiwidth' - if (check_opt_strings((char_u *)p_ambw, p_ambw_values, false) != OK) { + if (check_opt_strings(p_ambw, p_ambw_values, false) != OK) { errmsg = e_invarg; } else { errmsg = check_chars_options(); } } else if (varp == &p_bg) { // 'background' - if (check_opt_strings((char_u *)p_bg, p_bg_values, false) == OK) { + if (check_opt_strings(p_bg, p_bg_values, false) == OK) { int dark = (*p_bg == 'd'); init_highlight(false, false); @@ -793,21 +797,21 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf errmsg = e_invarg; } } else if (varp == &p_wop) { // 'wildoptions' - if (opt_strings_flags((char_u *)p_wop, p_wop_values, &wop_flags, true) != OK) { + if (opt_strings_flags(p_wop, p_wop_values, &wop_flags, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_wak) { // 'winaltkeys' if (*p_wak == NUL - || check_opt_strings((char_u *)p_wak, p_wak_values, false) != OK) { + || check_opt_strings(p_wak, p_wak_values, false) != OK) { errmsg = e_invarg; } } else if (varp == &p_ei) { // 'eventignore' if (check_ei() == FAIL) { errmsg = e_invarg; } - } else if (varp == &p_enc || gvarp == (char_u **)&p_fenc || gvarp == &p_menc) { + } else if (varp == &p_enc || gvarp == &p_fenc || gvarp == &p_menc) { // 'encoding', 'fileencoding' and 'makeencoding' - if (gvarp == (char_u **)&p_fenc) { + if (gvarp == &p_fenc) { if (!MODIFIABLE(curbuf) && opt_flags != OPT_GLOBAL) { errmsg = e_modifiable; } else if (vim_strchr(*varp, ',') != NULL) { @@ -823,13 +827,13 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } if (errmsg == NULL) { - // canonize the value, so that STRCMP() can be used on it - p = (char *)enc_canonize((char_u *)(*varp)); + // canonize the value, so that strcmp() can be used on it + p = enc_canonize(*varp); xfree(*varp); *varp = p; if (varp == &p_enc) { // only encoding=utf-8 allowed - if (STRCMP(p_enc, "utf-8") != 0) { + if (strcmp(p_enc, "utf-8") != 0) { errmsg = e_unsupportedoption; } else { spell_reload(); @@ -838,11 +842,11 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } } else if (varp == &p_penc) { // Canonize printencoding if VIM standard one - p = (char *)enc_canonize((char_u *)p_penc); + p = enc_canonize(p_penc); xfree(p_penc); p_penc = p; } else if (varp == &curbuf->b_p_keymap) { - if (!valid_filetype((char_u *)(*varp))) { + if (!valid_filetype(*varp)) { errmsg = e_invarg; } else { int secure_save = secure; @@ -883,10 +887,10 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } status_redraw_curbuf(); } - } else if (gvarp == (char_u **)&p_ff) { // 'fileformat' + } else if (gvarp == &p_ff) { // 'fileformat' if (!MODIFIABLE(curbuf) && !(opt_flags & OPT_GLOBAL)) { errmsg = e_modifiable; - } else if (check_opt_strings((char_u *)(*varp), p_ff_values, false) != OK) { + } else if (check_opt_strings(*varp, p_ff_values, false) != OK) { errmsg = e_invarg; } else { redraw_titles(); @@ -899,7 +903,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } } } else if (varp == &p_ffs) { // 'fileformats' - if (check_opt_strings((char_u *)p_ffs, p_ff_values, true) != OK) { + if (check_opt_strings(p_ffs, p_ff_values, true) != OK) { errmsg = e_invarg; } } else if (gvarp == &p_mps) { // 'matchpairs' @@ -923,7 +927,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf break; } } - } else if (gvarp == (char_u **)&p_com) { // 'comments' + } else if (gvarp == &p_com) { // 'comments' for (s = *varp; *s;) { while (*s && *s != ':') { if (vim_strchr(COM_ALL, *s) == NULL @@ -947,13 +951,13 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } s++; } - s = (char *)skip_to_option_part((char_u *)s); + s = skip_to_option_part(s); } } else if (varp == &p_lcs || varp == &p_fcs) { // global 'listchars' or 'fillchars' char **local_ptr = varp == &p_lcs ? &curwin->w_p_lcs : &curwin->w_p_fcs; // only apply the global value to "curwin" when it does not have a local value errmsg = - set_chars_option(curwin, (char_u **)varp, **local_ptr == NUL || !(opt_flags & OPT_GLOBAL)); + set_chars_option(curwin, varp, **local_ptr == NUL || !(opt_flags & OPT_GLOBAL)); if (errmsg == NULL) { // If the current window is set to use the global // 'listchars'/'fillchars' value, clear the window-local value. @@ -967,18 +971,18 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf // here, so ignore the return value. local_ptr = varp == &p_lcs ? &wp->w_p_lcs : &wp->w_p_fcs; if (**local_ptr == NUL) { - (void)set_chars_option(wp, (char_u **)local_ptr, true); + (void)set_chars_option(wp, local_ptr, true); } } redraw_all_later(UPD_NOT_VALID); } } else if (varp == &curwin->w_p_lcs) { // local 'listchars' - errmsg = set_chars_option(curwin, (char_u **)varp, true); + errmsg = set_chars_option(curwin, varp, true); } else if (varp == &curwin->w_p_fcs) { // local 'fillchars' - errmsg = set_chars_option(curwin, (char_u **)varp, true); + errmsg = set_chars_option(curwin, varp, true); } else if (varp == &p_cedit) { // 'cedit' errmsg = check_cedit(); - } else if (varp == (char **)&p_vfile) { // 'verbosefile' + } else if (varp == &p_vfile) { // 'verbosefile' verbose_stop(); if (*p_vfile != NUL && verbose_open() == FAIL) { errmsg = e_invarg; @@ -986,13 +990,14 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } else if (varp == &p_shada) { // 'shada' // TODO(ZyX-I): Remove this code in the future, alongside with &viminfo // option. - opt_idx = ((get_option_fullname(opt_idx)[0] == 'v') + opt_idx = ((opt->fullname[0] == 'v') ? (shada_idx == -1 ? ((shada_idx = findoption("shada"))) : shada_idx) : opt_idx); + opt = get_option(opt_idx); // Update free_oldval now that we have the opt_idx for 'shada', otherwise // there would be a disconnect between the check for P_ALLOCED at the start // of the function and the set of P_ALLOCED at the end of the function. - free_oldval = (get_option_flags(opt_idx) & P_ALLOCED); + free_oldval = (opt->flags & P_ALLOCED); for (s = p_shada; *s;) { // Check it's a valid character if (vim_strchr("!\"%'/:<@cfhnrs", *s) == NULL) { @@ -1037,7 +1042,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf if (*p_shada && errmsg == NULL && get_shada_parameter('\'') < 0) { errmsg = N_("E528: Must specify a ' value"); } - } else if (gvarp == (char_u **)&p_sbr) { // 'showbreak' + } else if (gvarp == &p_sbr) { // 'showbreak' for (s = *varp; *s;) { if (ptr2cells(s) != 1) { errmsg = e_showbreak_contains_unprintable_or_wide_character; @@ -1052,7 +1057,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf errmsg = parse_printmbfont(); } else if (varp == &p_langmap) { // 'langmap' langmap_set(); - } else if (varp == (char **)&p_breakat) { // 'breakat' + } else if (varp == &p_breakat) { // 'breakat' fill_breakat_flags(); } else if (varp == &p_titlestring || varp == &p_iconstring) { // 'titlestring' and 'iconstring' @@ -1067,47 +1072,51 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf did_set_title(); } else if (varp == &p_sel) { // 'selection' if (*p_sel == NUL - || check_opt_strings((char_u *)p_sel, p_sel_values, false) != OK) { + || check_opt_strings(p_sel, p_sel_values, false) != OK) { errmsg = e_invarg; } } else if (varp == &p_slm) { // 'selectmode' - if (check_opt_strings((char_u *)p_slm, p_slm_values, true) != OK) { + if (check_opt_strings(p_slm, p_slm_values, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_km) { // 'keymodel' - if (check_opt_strings((char_u *)p_km, p_km_values, true) != OK) { + if (check_opt_strings(p_km, p_km_values, true) != OK) { errmsg = e_invarg; } else { km_stopsel = (vim_strchr(p_km, 'o') != NULL); km_startsel = (vim_strchr(p_km, 'a') != NULL); } } else if (varp == &p_mousem) { // 'mousemodel' - if (check_opt_strings((char_u *)p_mousem, p_mousem_values, false) != OK) { + if (check_opt_strings(p_mousem, p_mousem_values, false) != OK) { errmsg = e_invarg; } } else if (varp == &p_mousescroll) { // 'mousescroll' errmsg = check_mousescroll(p_mousescroll); } else if (varp == &p_swb) { // 'switchbuf' - if (opt_strings_flags((char_u *)p_swb, p_swb_values, &swb_flags, true) != OK) { + if (opt_strings_flags(p_swb, p_swb_values, &swb_flags, true) != OK) { + errmsg = e_invarg; + } + } else if (varp == &p_spk) { // 'splitkeep' + if (check_opt_strings(p_spk, p_spk_values, false) != OK) { errmsg = e_invarg; } } else if (varp == &p_debug) { // 'debug' - if (check_opt_strings((char_u *)p_debug, p_debug_values, true) != OK) { + if (check_opt_strings(p_debug, p_debug_values, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_dy) { // 'display' - if (opt_strings_flags((char_u *)p_dy, p_dy_values, &dy_flags, true) != OK) { + if (opt_strings_flags(p_dy, p_dy_values, &dy_flags, true) != OK) { errmsg = e_invarg; } else { (void)init_chartab(); msg_grid_validate(); } } else if (varp == &p_ead) { // 'eadirection' - if (check_opt_strings((char_u *)p_ead, p_ead_values, false) != OK) { + if (check_opt_strings(p_ead, p_ead_values, false) != OK) { errmsg = e_invarg; } } else if (varp == &p_cb) { // 'clipboard' - if (opt_strings_flags((char_u *)p_cb, p_cb_values, &cb_flags, true) != OK) { + if (opt_strings_flags(p_cb, p_cb_values, &cb_flags, true) != OK) { errmsg = e_invarg; } } else if (varp == &(curwin->w_s->b_p_spl) // 'spell' @@ -1116,8 +1125,8 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf // buffer in which 'spell' is set load the wordlists. const bool is_spellfile = varp == &(curwin->w_s->b_p_spf); - if ((is_spellfile && !valid_spellfile((char_u *)(*varp))) - || (!is_spellfile && !valid_spelllang((char_u *)(*varp)))) { + if ((is_spellfile && !valid_spellfile(*varp)) + || (!is_spellfile && !valid_spelllang(*varp))) { errmsg = e_invarg; } else { errmsg = did_set_spell_option(is_spellfile); @@ -1126,7 +1135,8 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf // When 'spellcapcheck' is set compile the regexp program. errmsg = compile_cap_prog(curwin->w_s); } else if (varp == &(curwin->w_s->b_p_spo)) { // 'spelloptions' - if (**varp != NUL && STRCMP("camel", *varp) != 0) { + if (opt_strings_flags(curwin->w_s->b_p_spo, p_spo_values, &(curwin->w_s->b_p_spo_flags), + true) != OK) { errmsg = e_invarg; } } else if (varp == &p_sps) { // 'spellsuggest' @@ -1139,14 +1149,14 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } } else if (gvarp == &p_bh) { // When 'bufhidden' is set, check for valid value. - if (check_opt_strings((char_u *)curbuf->b_p_bh, p_bufhidden_values, false) != OK) { + if (check_opt_strings(curbuf->b_p_bh, p_bufhidden_values, false) != OK) { errmsg = e_invarg; } } else if (gvarp == &p_bt) { // When 'buftype' is set, check for valid value. if ((curbuf->terminal && curbuf->b_p_bt[0] != 't') || (!curbuf->terminal && curbuf->b_p_bt[0] == 't') - || check_opt_strings((char_u *)curbuf->b_p_bt, p_buftype_values, false) != OK) { + || check_opt_strings(curbuf->b_p_bt, p_buftype_values, false) != OK) { errmsg = e_invarg; } else { if (curwin->w_status_height || global_stl_height()) { @@ -1156,7 +1166,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf curbuf->b_help = (curbuf->b_p_bt[0] == 'h'); redraw_titles(); } - } else if (gvarp == (char_u **)&p_stl || gvarp == (char_u **)&p_wbr || varp == &p_tal + } else if (gvarp == &p_stl || gvarp == &p_wbr || varp == &p_tal || varp == &p_ruf) { // 'statusline', 'winbar', 'tabline' or 'rulerformat' int wid; @@ -1184,7 +1194,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf comp_col(); } // add / remove window bars for 'winbar' - if (gvarp == (char_u **)&p_wbr) { + if (gvarp == &p_wbr) { set_winbar(true); } } else if (gvarp == &p_cpt) { @@ -1223,7 +1233,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } } } else if (varp == &p_cot) { // 'completeopt' - if (check_opt_strings((char_u *)p_cot, p_cot_values, true) != OK) { + if (check_opt_strings(p_cot, p_cot_values, true) != OK) { errmsg = e_invarg; } else { completeopt_was_set(); @@ -1236,7 +1246,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } #endif } else if (varp == &curwin->w_p_scl) { // 'signcolumn' - if (check_signcolumn((char_u *)(*varp)) != OK) { + if (check_signcolumn(*varp) != OK) { errmsg = e_invarg; } // When changing the 'signcolumn' to or from 'number', recompute the @@ -1249,20 +1259,20 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } else if (varp == &curwin->w_p_fdc || varp == &curwin->w_allbuf_opt.wo_fdc) { // 'foldcolumn' - if (**varp == NUL || check_opt_strings((char_u *)(*varp), p_fdc_values, false) != OK) { + if (**varp == NUL || check_opt_strings(*varp, p_fdc_values, false) != OK) { errmsg = e_invarg; } - } else if (varp == (char **)&p_pt) { + } else if (varp == &p_pt) { // 'pastetoggle': translate key codes like in a mapping if (*p_pt) { p = NULL; - (void)replace_termcodes((char *)p_pt, - STRLEN(p_pt), + (void)replace_termcodes(p_pt, + strlen(p_pt), &p, REPTERM_FROM_PART | REPTERM_DO_LT, NULL, CPO_TO_CPO_FLAGS); if (p != NULL) { - free_string_option((char *)p_pt); - p_pt = (char_u *)p; + free_string_option(p_pt); + p_pt = p; } } } else if (varp == &p_bs) { // 'backspace' @@ -1270,14 +1280,14 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf if (*p_bs > '3' || p_bs[1] != NUL) { errmsg = e_invarg; } - } else if (check_opt_strings((char_u *)p_bs, p_bs_values, true) != OK) { + } else if (check_opt_strings(p_bs, p_bs_values, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_bo) { - if (opt_strings_flags((char_u *)p_bo, p_bo_values, &bo_flags, true) != OK) { + if (opt_strings_flags(p_bo, p_bo_values, &bo_flags, true) != OK) { errmsg = e_invarg; } - } else if (gvarp == (char_u **)&p_tc) { // 'tagcase' + } else if (gvarp == &p_tc) { // 'tagcase' unsigned int *flags; if (opt_flags & OPT_LOCAL) { @@ -1292,19 +1302,19 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf // make the local value empty: use the global value *flags = 0; } else if (*p == NUL - || opt_strings_flags((char_u *)p, p_tc_values, flags, false) != OK) { + || opt_strings_flags(p, p_tc_values, flags, false) != OK) { errmsg = e_invarg; } } else if (varp == &p_cmp) { // 'casemap' - if (opt_strings_flags((char_u *)p_cmp, p_cmp_values, &cmp_flags, true) != OK) { + if (opt_strings_flags(p_cmp, p_cmp_values, &cmp_flags, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_dip) { // 'diffopt' if (diffopt_changed() == FAIL) { errmsg = e_invarg; } - } else if (gvarp == (char_u **)&curwin->w_allbuf_opt.wo_fdm) { // 'foldmethod' - if (check_opt_strings((char_u *)(*varp), p_fdm_values, false) != OK + } else if (gvarp == &curwin->w_allbuf_opt.wo_fdm) { // 'foldmethod' + if (check_opt_strings(*varp, p_fdm_values, false) != OK || *curwin->w_p_fdm == NUL) { errmsg = e_invarg; } else { @@ -1317,7 +1327,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf if (foldmethodIsExpr(curwin)) { foldUpdateAll(curwin); } - } else if (gvarp == (char_u **)&curwin->w_allbuf_opt.wo_fmr) { // 'foldmarker' + } else if (gvarp == &curwin->w_allbuf_opt.wo_fmr) { // 'foldmarker' p = vim_strchr(*varp, ','); if (p == NULL) { errmsg = N_("E536: comma required"); @@ -1331,23 +1341,23 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf errmsg = N_("E537: 'commentstring' must be empty or contain %s"); } } else if (varp == &p_fdo) { // 'foldopen' - if (opt_strings_flags((char_u *)p_fdo, p_fdo_values, &fdo_flags, true) != OK) { + if (opt_strings_flags(p_fdo, p_fdo_values, &fdo_flags, true) != OK) { errmsg = e_invarg; } } else if (varp == &p_fcl) { // 'foldclose' - if (check_opt_strings((char_u *)p_fcl, p_fcl_values, true) != OK) { + if (check_opt_strings(p_fcl, p_fcl_values, true) != OK) { errmsg = e_invarg; } - } else if (gvarp == (char_u **)&curwin->w_allbuf_opt.wo_fdi) { // 'foldignore' + } else if (gvarp == &curwin->w_allbuf_opt.wo_fdi) { // 'foldignore' if (foldmethodIsIndent(curwin)) { foldUpdateAll(curwin); } } else if (gvarp == &p_ve) { // 'virtualedit' - char_u *ve = p_ve; + char *ve = p_ve; unsigned int *flags = &ve_flags; if (opt_flags & OPT_LOCAL) { - ve = (char_u *)curwin->w_p_ve; + ve = curwin->w_p_ve; flags = &curwin->w_ve_flags; } @@ -1357,7 +1367,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } else { if (opt_strings_flags(ve, p_ve_values, flags, true) != OK) { errmsg = e_invarg; - } else if (STRCMP(p_ve, oldval) != 0) { + } else if (strcmp(p_ve, oldval) != 0) { // Recompute cursor position in case the new 've' setting // changes something. validate_virtcol(); @@ -1381,28 +1391,28 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } } } - } else if (gvarp == (char_u **)&p_cino) { // 'cinoptions' + } else if (gvarp == &p_cino) { // 'cinoptions' // TODO(vim): recognize errors parse_cino(curbuf); } else if (varp == &p_icm) { // 'inccommand' - if (check_opt_strings((char_u *)p_icm, p_icm_values, false) != OK) { + if (check_opt_strings(p_icm, p_icm_values, false) != OK) { errmsg = e_invarg; } - } else if (gvarp == (char_u **)&p_ft) { - if (!valid_filetype((char_u *)(*varp))) { + } else if (gvarp == &p_ft) { + if (!valid_filetype(*varp)) { errmsg = e_invarg; } else { - value_changed = STRCMP(oldval, *varp) != 0; + value_changed = strcmp(oldval, *varp) != 0; // Since we check the value, there is no need to set P_INSECURE, // even when the value comes from a modeline. *value_checked = true; } } else if (gvarp == &p_syn) { - if (!valid_filetype((char_u *)(*varp))) { + if (!valid_filetype(*varp)) { errmsg = e_invarg; } else { - value_changed = STRCMP(oldval, *varp) != 0; + value_changed = strcmp(oldval, *varp) != 0; // Since we check the value, there is no need to set P_INSECURE, // even when the value comes from a modeline. @@ -1413,20 +1423,20 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf errmsg = e_invarg; } } else if (varp == &p_tpf) { - if (opt_strings_flags((char_u *)p_tpf, p_tpf_values, &tpf_flags, true) != OK) { + if (opt_strings_flags(p_tpf, p_tpf_values, &tpf_flags, true) != OK) { errmsg = e_invarg; } } else if (varp == &(curbuf->b_p_vsts)) { // 'varsofttabstop' - char_u *cp; + char *cp; if (!(*varp)[0] || ((*varp)[0] == '0' && !(*varp)[1])) { XFREE_CLEAR(curbuf->b_p_vsts_array); } else { - for (cp = (char_u *)(*varp); *cp; cp++) { + for (cp = *varp; *cp; cp++) { if (ascii_isdigit(*cp)) { continue; } - if (*cp == ',' && cp > (char_u *)(*varp) && *(cp - 1) != ',') { + if (*cp == ',' && cp > *varp && *(cp - 1) != ',') { continue; } errmsg = e_invarg; @@ -1434,7 +1444,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } if (errmsg == NULL) { long *oldarray = curbuf->b_p_vsts_array; - if (tabstop_set((char_u *)(*varp), &(curbuf->b_p_vsts_array))) { + if (tabstop_set(*varp, &(curbuf->b_p_vsts_array))) { xfree(oldarray); } else { errmsg = e_invarg; @@ -1442,16 +1452,16 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } } } else if (varp == &(curbuf->b_p_vts)) { // 'vartabstop' - char_u *cp; + char *cp; if (!(*varp)[0] || ((*varp)[0] == '0' && !(*varp)[1])) { XFREE_CLEAR(curbuf->b_p_vts_array); } else { - for (cp = (char_u *)(*varp); *cp; cp++) { + for (cp = *varp; *cp; cp++) { if (ascii_isdigit(*cp)) { continue; } - if (*cp == ',' && cp > (char_u *)(*varp) && *(cp - 1) != ',') { + if (*cp == ',' && cp > *varp && *(cp - 1) != ',') { continue; } errmsg = e_invarg; @@ -1459,7 +1469,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } if (errmsg == NULL) { long *oldarray = curbuf->b_p_vts_array; - if (tabstop_set((char_u *)(*varp), &(curbuf->b_p_vts_array))) { + if (tabstop_set(*varp, &(curbuf->b_p_vts_array))) { xfree(oldarray); if (foldmethodIsIndent(curwin)) { foldUpdateAll(curwin); @@ -1484,7 +1494,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf p = WW_ALL; } if (varp == &p_shm) { // 'shortmess' - p = (char *)SHM_ALL; + p = SHM_ALL; } else if (varp == &(p_cpo)) { // 'cpoptions' p = CPO_VI; } else if (varp == &(curbuf->b_p_fo)) { // 'formatoptions' @@ -1521,18 +1531,18 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf if (free_oldval) { free_string_option(oldval); } - set_option_flag(opt_idx, P_ALLOCED); + opt->flags |= P_ALLOCED; if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0 - && is_global_local_option(opt_idx)) { + && (opt->indir & PV_BOTH)) { // global option with local value set to use global value; free // the local value and make it empty - p = (char *)get_option_varp_scope(opt_idx, OPT_LOCAL); + p = get_varp_scope(opt, OPT_LOCAL); free_string_option(*(char **)p); *(char **)p = empty_option; } else if (!(opt_flags & OPT_LOCAL) && opt_flags != OPT_GLOBAL) { // May set global value for local option. - set_string_option_global(opt_idx, varp); + set_string_option_global(opt, varp); } // Trigger the autocommand only after setting the flags. @@ -1574,8 +1584,8 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } } if (varp == &(curwin->w_s->b_p_spl)) { - char_u fname[200]; - char_u *q = (char_u *)curwin->w_s->b_p_spl; + char fname[200]; + char *q = curwin->w_s->b_p_spl; // Skip the first name if it is "cjk". if (STRNCMP(q, "cjk,", 4) == 0) { @@ -1586,15 +1596,14 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf // They could set 'spellcapcheck' depending on the language. // Use the first name in 'spelllang' up to '_region' or // '.encoding'. - for (p = (char *)q; *p != NUL; p++) { + for (p = q; *p != NUL; p++) { if (!ASCII_ISALNUM(*p) && *p != '-') { break; } } - if (p > (char *)q) { - vim_snprintf((char *)fname, sizeof(fname), "spell/%.*s.vim", - (int)(p - (char *)q), q); - source_runtime((char *)fname, DIP_ALL); + if (p > q) { + vim_snprintf(fname, sizeof(fname), "spell/%.*s.vim", (int)(p - q), q); + source_runtime(fname, DIP_ALL); } } } @@ -1604,11 +1613,11 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf } if (curwin->w_curswant != MAXCOL - && (get_option_flags(opt_idx) & (P_CURSWANT | P_RALL)) != 0) { + && (opt->flags & (P_CURSWANT | P_RALL)) != 0) { curwin->w_set_curswant = true; } - check_redraw(get_option_flags(opt_idx)); + check_redraw(opt->flags); return errmsg; } @@ -1618,7 +1627,7 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf /// @param list when true: accept a list of values /// /// @return OK for correct value, FAIL otherwise. Empty is always OK. -static int check_opt_strings(char_u *val, char **values, int list) +static int check_opt_strings(char *val, char **values, int list) { return opt_strings_flags(val, values, NULL, list); } @@ -1631,7 +1640,7 @@ static int check_opt_strings(char_u *val, char **values, int list) /// @param list when true: accept a list of values /// /// @return OK for correct value, FAIL otherwise. Empty is always OK. -static int opt_strings_flags(char_u *val, char **values, unsigned *flagp, bool list) +static int opt_strings_flags(char *val, char **values, unsigned *flagp, bool list) { unsigned int new_flags = 0; @@ -1641,7 +1650,7 @@ static int opt_strings_flags(char_u *val, char **values, unsigned *flagp, bool l return FAIL; } - size_t len = STRLEN(values[i]); + size_t len = strlen(values[i]); if (STRNCMP(values[i], val, len) == 0 && ((list && val[len] == ',') || val[len] == NUL)) { val += len + (val[len] == ','); @@ -1659,7 +1668,7 @@ static int opt_strings_flags(char_u *val, char **values, unsigned *flagp, bool l } /// @return OK if "p" is a valid fileformat name, FAIL otherwise. -int check_ff_value(char_u *p) +int check_ff_value(char *p) { return check_opt_strings(p, p_ff_values, false); } |