vim-patch:9.0.0284: using static buffer for multiple completion functions

Problem:    Using static buffer for multiple completion functions.
Solution:   Use one buffer in expand_T.
5ff595d9db
This commit is contained in:
zeertzjq
2022-08-27 06:50:55 +08:00
parent 2676555b22
commit 608134794d
4 changed files with 12 additions and 16 deletions

View File

@@ -90,14 +90,14 @@ static char *(history_names[]) = {
/// arguments of the ":history command. /// arguments of the ":history command.
char *get_history_arg(expand_T *xp, int idx) char *get_history_arg(expand_T *xp, int idx)
{ {
static char_u compl[2] = { NUL, NUL }; const char *short_names = ":=@>?/";
char *short_names = ":=@>?/"; const int short_names_count = (int)STRLEN(short_names);
int short_names_count = (int)STRLEN(short_names); const int history_name_count = ARRAY_SIZE(history_names) - 1;
int history_name_count = ARRAY_SIZE(history_names) - 1;
if (idx < short_names_count) { if (idx < short_names_count) {
compl[0] = (char_u)short_names[idx]; xp->xp_buf[0] = short_names[idx];
return (char *)compl; xp->xp_buf[1] = NUL;
return xp->xp_buf;
} }
if (idx < short_names_count + history_name_count) { if (idx < short_names_count + history_name_count) {
return history_names[idx - short_names_count]; return history_names[idx - short_names_count];

View File

@@ -237,6 +237,8 @@ struct expand {
int xp_col; // cursor position in line int xp_col; // cursor position in line
char **xp_files; // list of files char **xp_files; // list of files
char *xp_line; // text being completed char *xp_line; // text being completed
#define EXPAND_BUF_LEN 256
char xp_buf[EXPAND_BUF_LEN]; // buffer for returned match
}; };
// values for xp_backslash // values for xp_backslash

View File

@@ -1156,15 +1156,12 @@ char *home_replace_save(buf_T *buf, const char *src)
/// Function given to ExpandGeneric() to obtain an environment variable name. /// Function given to ExpandGeneric() to obtain an environment variable name.
char *get_env_name(expand_T *xp, int idx) char *get_env_name(expand_T *xp, int idx)
{ {
#define ENVNAMELEN 100
// this static buffer is needed to avoid a memory leak in ExpandGeneric
static char_u name[ENVNAMELEN];
assert(idx >= 0); assert(idx >= 0);
char *envname = os_getenvname_at_index((size_t)idx); char *envname = os_getenvname_at_index((size_t)idx);
if (envname) { if (envname) {
STRLCPY(name, envname, ENVNAMELEN); STRLCPY(xp->xp_buf, envname, EXPAND_BUF_LEN);
xfree(envname); xfree(envname);
return (char *)name; return xp->xp_buf;
} }
return NULL; return NULL;
} }

View File

@@ -5737,9 +5737,6 @@ void set_context_in_syntax_cmd(expand_T *xp, const char *arg)
*/ */
char *get_syntax_name(expand_T *xp, int idx) char *get_syntax_name(expand_T *xp, int idx)
{ {
#define CBUFFER_LEN 256
static char cbuffer[CBUFFER_LEN]; // TODO: better solution
switch (expand_what) { switch (expand_what) {
case EXP_SUBCMD: case EXP_SUBCMD:
return subcommands[idx].name; return subcommands[idx].name;
@@ -5761,9 +5758,9 @@ char *get_syntax_name(expand_T *xp, int idx)
} }
case EXP_CLUSTER: case EXP_CLUSTER:
if (idx < curwin->w_s->b_syn_clusters.ga_len) { if (idx < curwin->w_s->b_syn_clusters.ga_len) {
vim_snprintf(cbuffer, CBUFFER_LEN, "@%s", vim_snprintf(xp->xp_buf, EXPAND_BUF_LEN, "@%s",
SYN_CLSTR(curwin->w_s)[idx].scl_name); SYN_CLSTR(curwin->w_s)[idx].scl_name);
return cbuffer; return xp->xp_buf;
} else { } else {
return NULL; return NULL;
} }