From: Yegappan Lakshmanan Date: Fri, 10 Feb 2023 14:50:31 +0000 (+0000) Subject: patch 9.0.1295: the option initialization function is too long X-Git-Tag: v9.0.1295 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c41bedeed2a1f98fb9c55ff85634138782ad92a;p=vim patch 9.0.1295: the option initialization function is too long Problem: The option initialization function is too long. Solution: Move code to separate functions. (Yegappan Lakshmanan, closes #11966) --- diff --git a/src/option.c b/src/option.c index c95082d4e..ee9c9e33b 100644 --- a/src/option.c +++ b/src/option.c @@ -70,36 +70,15 @@ static void paste_option_changed(void); static void compatible_set(void); /* - * Initialize the options, first part. - * - * Called only once from main(), just after creating the first buffer. - * If "clean_arg" is TRUE Vim was started with --clean. + * Initialize the 'shell' option to a default value. */ - void -set_init_1(int clean_arg) + static void +set_init_default_shell(void) { char_u *p; - int opt_idx; - long_u n; - -#ifdef FEAT_LANGMAP - langmap_init(); -#endif - - // Be Vi compatible by default - p_cp = TRUE; - // Use POSIX compatibility when $VIM_POSIX is set. - if (mch_getenv((char_u *)"VIM_POSIX") != NULL) - { - set_string_default("cpo", (char_u *)CPO_ALL); - set_string_default("shm", (char_u *)SHM_POSIX); - } - - /* - * Find default value for 'shell' option. - * Don't use it if it is empty. - */ + // Find default value for 'shell' option. + // Don't use it if it is empty. if (((p = mch_getenv((char_u *)"SHELL")) != NULL && *p != NUL) #if defined(MSWIN) || ((p = mch_getenv((char_u *)"COMSPEC")) != NULL && *p != NUL) @@ -129,70 +108,83 @@ set_init_1(int clean_arg) #else set_string_default_esc("sh", p, TRUE); #endif +} - /* - * Set the default for 'backupskip' to include environment variables for - * temp files. - */ - { +/* + * Set the default for 'backupskip' to include environment variables for + * temp files. + */ + static void +set_init_default_backupskip(void) +{ + int opt_idx; + long_u n; + char_u *p; #ifdef UNIX - static char *(names[4]) = {"", "TMPDIR", "TEMP", "TMP"}; + static char *(names[4]) = {"", "TMPDIR", "TEMP", "TMP"}; #else - static char *(names[3]) = {"TMPDIR", "TEMP", "TMP"}; + static char *(names[3]) = {"TMPDIR", "TEMP", "TMP"}; #endif - int len; - garray_T ga; - int mustfree; - char_u *item; + int len; + garray_T ga; + int mustfree; + char_u *item; - opt_idx = findoption((char_u *)"backupskip"); + opt_idx = findoption((char_u *)"backupskip"); - ga_init2(&ga, 1, 100); - for (n = 0; n < (long)ARRAY_LENGTH(names); ++n) - { - mustfree = FALSE; + ga_init2(&ga, 1, 100); + for (n = 0; n < (long)ARRAY_LENGTH(names); ++n) + { + mustfree = FALSE; #ifdef UNIX - if (*names[n] == NUL) + if (*names[n] == NUL) # ifdef MACOS_X - p = (char_u *)"/private/tmp"; + p = (char_u *)"/private/tmp"; # else - p = (char_u *)"/tmp"; + p = (char_u *)"/tmp"; # endif - else + else #endif - p = vim_getenv((char_u *)names[n], &mustfree); - if (p != NULL && *p != NUL) + p = vim_getenv((char_u *)names[n], &mustfree); + if (p != NULL && *p != NUL) + { + // First time count the NUL, otherwise count the ','. + len = (int)STRLEN(p) + 3; + item = alloc(len); + STRCPY(item, p); + add_pathsep(item); + STRCAT(item, "*"); + if (find_dup_item(ga.ga_data, item, options[opt_idx].flags) + == NULL + && ga_grow(&ga, len) == OK) { - // First time count the NUL, otherwise count the ','. - len = (int)STRLEN(p) + 3; - item = alloc(len); - STRCPY(item, p); - add_pathsep(item); - STRCAT(item, "*"); - if (find_dup_item(ga.ga_data, item, options[opt_idx].flags) - == NULL - && ga_grow(&ga, len) == OK) - { - if (ga.ga_len > 0) - STRCAT(ga.ga_data, ","); - STRCAT(ga.ga_data, item); - ga.ga_len += len; - } - vim_free(item); + if (ga.ga_len > 0) + STRCAT(ga.ga_data, ","); + STRCAT(ga.ga_data, item); + ga.ga_len += len; } - if (mustfree) - vim_free(p); - } - if (ga.ga_data != NULL) - { - set_string_default("bsk", ga.ga_data); - vim_free(ga.ga_data); + vim_free(item); } + if (mustfree) + vim_free(p); } + if (ga.ga_data != NULL) + { + set_string_default("bsk", ga.ga_data); + vim_free(ga.ga_data); + } +} + +/* + * Initialize the 'maxmemtot' and 'maxmem' options to a default value. + * 'maxmemtot' and 'maxmem' may have to be adjusted for available memory. + */ + static void +set_init_default_maxmemtot(void) +{ + int opt_idx; + long_u n; - /* - * 'maxmemtot' and 'maxmem' may have to be adjusted for available memory - */ opt_idx = findoption((char_u *)"maxmemtot"); if (opt_idx >= 0) { @@ -221,66 +213,85 @@ set_init_1(int clean_arg) } } } +} - { - char_u *cdpath; - char_u *buf; - int i; - int j; - int mustfree = FALSE; +/* + * Initialize the 'cdpath' option to a default value. + */ + static void +set_init_default_cdpath(void) +{ + int opt_idx; + char_u *cdpath; + char_u *buf; + int i; + int j; + int mustfree = FALSE; + + cdpath = vim_getenv((char_u *)"CDPATH", &mustfree); + if (cdpath == NULL) + return; - // Initialize the 'cdpath' option's default value. - cdpath = vim_getenv((char_u *)"CDPATH", &mustfree); - if (cdpath != NULL) + buf = alloc((STRLEN(cdpath) << 1) + 2); + if (buf != NULL) + { + buf[0] = ','; // start with ",", current dir first + j = 1; + for (i = 0; cdpath[i] != NUL; ++i) { - buf = alloc((STRLEN(cdpath) << 1) + 2); - if (buf != NULL) + if (vim_ispathlistsep(cdpath[i])) + buf[j++] = ','; + else { - buf[0] = ','; // start with ",", current dir first - j = 1; - for (i = 0; cdpath[i] != NUL; ++i) - { - if (vim_ispathlistsep(cdpath[i])) - buf[j++] = ','; - else - { - if (cdpath[i] == ' ' || cdpath[i] == ',') - buf[j++] = '\\'; - buf[j++] = cdpath[i]; - } - } - buf[j] = NUL; - opt_idx = findoption((char_u *)"cdpath"); - if (opt_idx >= 0) - { - options[opt_idx].def_val[VI_DEFAULT] = buf; - options[opt_idx].flags |= P_DEF_ALLOCED; - } - else - vim_free(buf); // cannot happen + if (cdpath[i] == ' ' || cdpath[i] == ',') + buf[j++] = '\\'; + buf[j++] = cdpath[i]; } - if (mustfree) - vim_free(cdpath); } + buf[j] = NUL; + opt_idx = findoption((char_u *)"cdpath"); + if (opt_idx >= 0) + { + options[opt_idx].def_val[VI_DEFAULT] = buf; + options[opt_idx].flags |= P_DEF_ALLOCED; + } + else + vim_free(buf); // cannot happen } + if (mustfree) + vim_free(cdpath); +} +/* + * Initialize the 'printencoding' option to a default value. + */ + static void +set_init_default_printencoding(void) +{ #if defined(FEAT_POSTSCRIPT) && \ - (defined(MSWIN) || defined(VMS) || defined(MAC) || defined(hpux)) + (defined(MSWIN) || defined(VMS) || defined(MAC) || defined(hpux)) // Set print encoding on platforms that don't default to latin1 set_string_default("penc", # if defined(MSWIN) - (char_u *)"cp1252" + (char_u *)"cp1252" # elif defined(VMS) - (char_u *)"dec-mcs" + (char_u *)"dec-mcs" # elif defined(MAC) - (char_u *)"mac-roman" + (char_u *)"mac-roman" # else // HPUX - (char_u *)"hp-roman8" + (char_u *)"hp-roman8" # endif - ); + ); #endif +} #ifdef FEAT_POSTSCRIPT +/* + * Initialize the 'printexpr' option to a default value. + */ + static void +set_init_default_printexpr(void) +{ // 'printexpr' must be allocated to be able to evaluate it. set_string_default("pexpr", # if defined(MSWIN) @@ -292,16 +303,18 @@ set_init_1(int clean_arg) (char_u *)"system('lpr' . (&printdevice == '' ? '' : ' -P' . &printdevice) . ' ' . v:fname_in) . delete(v:fname_in) + v:shell_error" # endif ); +} #endif - /* - * Set all the options (except the terminal options) to their default - * value. Also set the global value for local options. - */ - set_options_default(0); - #ifdef UNIX - // Force restricted-mode on for "nologin" or "false" $SHELL +/* + * Force restricted-mode on for "nologin" or "false" $SHELL + */ + static void +set_init_restricted_mode(void) +{ + char_u *p; + p = get_isolated_shell_name(); if (p != NULL) { @@ -309,60 +322,53 @@ set_init_1(int clean_arg) restricted = TRUE; vim_free(p); } +} #endif #ifdef CLEAN_RUNTIMEPATH - if (clean_arg) +/* + * When Vim is started with the "--clean" argument, set the default value + * for the 'runtimepath' and 'packpath' options. + */ + static void +set_init_clean_rtp(void) +{ + int opt_idx; + + opt_idx = findoption((char_u *)"runtimepath"); + if (opt_idx >= 0) { - opt_idx = findoption((char_u *)"runtimepath"); - if (opt_idx >= 0) - { - options[opt_idx].def_val[VI_DEFAULT] = (char_u *)CLEAN_RUNTIMEPATH; - p_rtp = (char_u *)CLEAN_RUNTIMEPATH; - } - opt_idx = findoption((char_u *)"packpath"); - if (opt_idx >= 0) - { - options[opt_idx].def_val[VI_DEFAULT] = (char_u *)CLEAN_RUNTIMEPATH; - p_pp = (char_u *)CLEAN_RUNTIMEPATH; - } + options[opt_idx].def_val[VI_DEFAULT] = (char_u *)CLEAN_RUNTIMEPATH; + p_rtp = (char_u *)CLEAN_RUNTIMEPATH; } + opt_idx = findoption((char_u *)"packpath"); + if (opt_idx >= 0) + { + options[opt_idx].def_val[VI_DEFAULT] = (char_u *)CLEAN_RUNTIMEPATH; + p_pp = (char_u *)CLEAN_RUNTIMEPATH; + } +} #endif -#ifdef FEAT_GUI - if (found_reverse_arg) - set_option_value_give_err((char_u *)"bg", 0L, (char_u *)"dark", 0); -#endif - - curbuf->b_p_initialized = TRUE; - curbuf->b_p_ar = -1; // no local 'autoread' value - curbuf->b_p_ul = NO_LOCAL_UNDOLEVEL; - check_buf_options(curbuf); - check_win_options(curwin); - check_options(); - - // Must be before option_expand(), because that one needs vim_isIDc() - didset_options(); - -#ifdef FEAT_SPELL - // Use the current chartab for the generic chartab. This is not in - // didset_options() because it only depends on 'encoding'. - init_spell_chartab(); -#endif +/* + * Expand environment variables and things like "~" for the defaults. + * If option_expand() returns non-NULL the variable is expanded. This can + * only happen for non-indirect options. + * Also set the default to the expanded value, so ":set" does not list + * them. + * Don't set the P_ALLOCED flag, because we don't want to free the + * default. + */ + static void +set_init_expand_env(void) +{ + int opt_idx; + char_u *p; - /* - * Expand environment variables and things like "~" for the defaults. - * If option_expand() returns non-NULL the variable is expanded. This can - * only happen for non-indirect options. - * Also set the default to the expanded value, so ":set" does not list - * them. - * Don't set the P_ALLOCED flag, because we don't want to free the - * default. - */ for (opt_idx = 0; !istermoption_idx(opt_idx); opt_idx++) { if ((options[opt_idx].flags & P_GETTEXT) - && options[opt_idx].var != NULL) + && options[opt_idx].var != NULL) p = (char_u *)_(*(char **)options[opt_idx].var); else p = option_expand(opt_idx, NULL); @@ -379,29 +385,21 @@ set_init_1(int clean_arg) options[opt_idx].flags |= P_DEF_ALLOCED; } } +} - save_file_ff(curbuf); // Buffer is unchanged - -#if defined(FEAT_ARABIC) - // Detect use of mlterm. - // Mlterm is a terminal emulator akin to xterm that has some special - // abilities (bidi namely). - // NOTE: mlterm's author is being asked to 'set' a variable - // instead of an environment variable due to inheritance. - if (mch_getenv((char_u *)"MLTERM") != NULL) - set_option_value_give_err((char_u *)"tbidi", 1L, NULL, 0); -#endif - - didset_options2(); - -# if defined(MSWIN) && defined(FEAT_GETTEXT) - /* - * If $LANG isn't set, try to get a good value for it. This makes the - * right language be used automatically. Don't do this for English. - */ +/* + * Initialize the 'LANG' environment variable to a default value. + */ + static void +set_init_lang_env(void) +{ +#if defined(MSWIN) && defined(FEAT_GETTEXT) + // If $LANG isn't set, try to get a good value for it. This makes the + // right language be used automatically. Don't do this for English. if (mch_getenv((char_u *)"LANG") == NULL) { char buf[20]; + long_u n; // Could use LOCALE_SISO639LANGNAME, but it's not in Win95. // LOCALE_SABBREVLANGNAME gives us three letters, like "enu", we use @@ -423,10 +421,20 @@ set_init_1(int clean_arg) vim_setenv((char_u *)"LANG", (char_u *)buf); } } -# elif defined(MACOS_CONVERT) +#elif defined(MACOS_CONVERT) // Moved to os_mac_conv.c to avoid dependency problems. mac_lang_init(); -# endif +#endif +} + +/* + * Initialize the 'encoding' option to a default value. + */ + static void +set_init_default_encoding(void) +{ + char_u *p; + int opt_idx; # ifdef MSWIN // MS-Windows has builtin support for conversion to and from Unicode, using @@ -437,95 +445,183 @@ set_init_1(int clean_arg) // This works best for properly configured systems, old and new. p = enc_locale(); # endif - if (p != NULL) - { - char_u *save_enc; + if (p == NULL) + return; - // Try setting 'encoding' and check if the value is valid. - // If not, go back to the default encoding. - save_enc = p_enc; - p_enc = p; - if (STRCMP(p_enc, "gb18030") == 0) + // Try setting 'encoding' and check if the value is valid. + // If not, go back to the default encoding. + char_u *save_enc = p_enc; + p_enc = p; + if (STRCMP(p_enc, "gb18030") == 0) + { + // We don't support "gb18030", but "cp936" is a good substitute + // for practical purposes, thus use that. It's not an alias to + // still support conversion between gb18030 and utf-8. + p_enc = vim_strsave((char_u *)"cp936"); + vim_free(p); + } + if (mb_init() == NULL) + { + opt_idx = findoption((char_u *)"encoding"); + if (opt_idx >= 0) { - // We don't support "gb18030", but "cp936" is a good substitute - // for practical purposes, thus use that. It's not an alias to - // still support conversion between gb18030 and utf-8. - p_enc = vim_strsave((char_u *)"cp936"); - vim_free(p); + options[opt_idx].def_val[VI_DEFAULT] = p_enc; + options[opt_idx].flags |= P_DEF_ALLOCED; } - if (mb_init() == NULL) - { - opt_idx = findoption((char_u *)"encoding"); - if (opt_idx >= 0) - { - options[opt_idx].def_val[VI_DEFAULT] = p_enc; - options[opt_idx].flags |= P_DEF_ALLOCED; - } #if defined(MSWIN) || defined(MACOS_X) || defined(VMS) - if (STRCMP(p_enc, "latin1") == 0 || enc_utf8) - { - // Adjust the default for 'isprint' and 'iskeyword' to match - // latin1. Also set the defaults for when 'nocompatible' is - // set. - set_string_option_direct((char_u *)"isp", -1, - ISP_LATIN1, OPT_FREE, SID_NONE); - set_string_option_direct((char_u *)"isk", -1, - ISK_LATIN1, OPT_FREE, SID_NONE); - opt_idx = findoption((char_u *)"isp"); - if (opt_idx >= 0) - options[opt_idx].def_val[VIM_DEFAULT] = ISP_LATIN1; - opt_idx = findoption((char_u *)"isk"); - if (opt_idx >= 0) - options[opt_idx].def_val[VIM_DEFAULT] = ISK_LATIN1; - (void)init_chartab(); - } + if (STRCMP(p_enc, "latin1") == 0 || enc_utf8) + { + // Adjust the default for 'isprint' and 'iskeyword' to match + // latin1. Also set the defaults for when 'nocompatible' is + // set. + set_string_option_direct((char_u *)"isp", -1, + ISP_LATIN1, OPT_FREE, SID_NONE); + set_string_option_direct((char_u *)"isk", -1, + ISK_LATIN1, OPT_FREE, SID_NONE); + opt_idx = findoption((char_u *)"isp"); + if (opt_idx >= 0) + options[opt_idx].def_val[VIM_DEFAULT] = ISP_LATIN1; + opt_idx = findoption((char_u *)"isk"); + if (opt_idx >= 0) + options[opt_idx].def_val[VIM_DEFAULT] = ISK_LATIN1; + (void)init_chartab(); + } #endif #if defined(MSWIN) && (!defined(FEAT_GUI) || defined(VIMDLL)) - // Win32 console: When GetACP() returns a different value from - // GetConsoleCP() set 'termencoding'. - if ( + // Win32 console: When GetACP() returns a different value from + // GetConsoleCP() set 'termencoding'. + if ( # ifdef VIMDLL - (!gui.in_use && !gui.starting) && + (!gui.in_use && !gui.starting) && # endif - GetACP() != GetConsoleCP()) - { - char buf[50]; + GetACP() != GetConsoleCP()) + { + char buf[50]; - // Win32 console: In ConPTY, GetConsoleCP() returns zero. - // Use an alternative value. - if (GetConsoleCP() == 0) - sprintf(buf, "cp%ld", (long)GetACP()); - else - sprintf(buf, "cp%ld", (long)GetConsoleCP()); - p_tenc = vim_strsave((char_u *)buf); - if (p_tenc != NULL) + // Win32 console: In ConPTY, GetConsoleCP() returns zero. + // Use an alternative value. + if (GetConsoleCP() == 0) + sprintf(buf, "cp%ld", (long)GetACP()); + else + sprintf(buf, "cp%ld", (long)GetConsoleCP()); + p_tenc = vim_strsave((char_u *)buf); + if (p_tenc != NULL) + { + opt_idx = findoption((char_u *)"termencoding"); + if (opt_idx >= 0) { - opt_idx = findoption((char_u *)"termencoding"); - if (opt_idx >= 0) - { - options[opt_idx].def_val[VI_DEFAULT] = p_tenc; - options[opt_idx].flags |= P_DEF_ALLOCED; - } - convert_setup(&input_conv, p_tenc, p_enc); - convert_setup(&output_conv, p_enc, p_tenc); + options[opt_idx].def_val[VI_DEFAULT] = p_tenc; + options[opt_idx].flags |= P_DEF_ALLOCED; } - else - p_tenc = empty_option; + convert_setup(&input_conv, p_tenc, p_enc); + convert_setup(&output_conv, p_enc, p_tenc); } + else + p_tenc = empty_option; + } #endif #if defined(MSWIN) - // $HOME may have characters in active code page. - init_homedir(); + // $HOME may have characters in active code page. + init_homedir(); #endif - } - else - { - vim_free(p_enc); - p_enc = save_enc; - } } + else + { + vim_free(p_enc); + p_enc = save_enc; + } + +} + +/* + * Initialize the options, first part. + * + * Called only once from main(), just after creating the first buffer. + * If "clean_arg" is TRUE Vim was started with --clean. + */ + void +set_init_1(int clean_arg) +{ +#ifdef FEAT_LANGMAP + langmap_init(); +#endif + + // Be Vi compatible by default + p_cp = TRUE; + + // Use POSIX compatibility when $VIM_POSIX is set. + if (mch_getenv((char_u *)"VIM_POSIX") != NULL) + { + set_string_default("cpo", (char_u *)CPO_ALL); + set_string_default("shm", (char_u *)SHM_POSIX); + } + + set_init_default_shell(); + set_init_default_backupskip(); + set_init_default_maxmemtot(); + set_init_default_cdpath(); + set_init_default_printencoding(); +#ifdef FEAT_POSTSCRIPT + set_init_default_printexpr(); +#endif + + /* + * Set all the options (except the terminal options) to their default + * value. Also set the global value for local options. + */ + set_options_default(0); + +#ifdef UNIX + set_init_restricted_mode(); +#endif + +#ifdef CLEAN_RUNTIMEPATH + if (clean_arg) + set_init_clean_rtp(); +#endif + +#ifdef FEAT_GUI + if (found_reverse_arg) + set_option_value_give_err((char_u *)"bg", 0L, (char_u *)"dark", 0); +#endif + + curbuf->b_p_initialized = TRUE; + curbuf->b_p_ar = -1; // no local 'autoread' value + curbuf->b_p_ul = NO_LOCAL_UNDOLEVEL; + check_buf_options(curbuf); + check_win_options(curwin); + check_options(); + + // Must be before option_expand(), because that one needs vim_isIDc() + didset_options(); + +#ifdef FEAT_SPELL + // Use the current chartab for the generic chartab. This is not in + // didset_options() because it only depends on 'encoding'. + init_spell_chartab(); +#endif + + // Expand environment variables and things like "~" for the defaults. + set_init_expand_env(); + + save_file_ff(curbuf); // Buffer is unchanged + +#if defined(FEAT_ARABIC) + // Detect use of mlterm. + // Mlterm is a terminal emulator akin to xterm that has some special + // abilities (bidi namely). + // NOTE: mlterm's author is being asked to 'set' a variable + // instead of an environment variable due to inheritance. + if (mch_getenv((char_u *)"MLTERM") != NULL) + set_option_value_give_err((char_u *)"tbidi", 1L, NULL, 0); +#endif + + didset_options2(); + + set_init_lang_env(); + set_init_default_encoding(); #ifdef FEAT_MULTI_LANG // Set the default for 'helplang'. diff --git a/src/version.c b/src/version.c index e3563c62a..0f259bcb7 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1295, /**/ 1294, /**/