# HG changeset patch # User Bram Moolenaar # Date 1668379503 -3600 # Node ID 20390549ce2fa64409768bd4adeeb03e56f33f47 # Parent f4347129179df621714fae082c5b262289fb9627 patch 9.0.0876: code is indented more than needed Commit: https://github.com/vim/vim/commit/68353e5270fca45daffee5b5f882853cdfa40f76 Author: Yegappan Lakshmanan Date: Sun Nov 13 22:38:10 2022 +0000 patch 9.0.0876: code is indented more than needed Problem: Code is indented more than needed. Solution: Split ExpandEscape() in two. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/11539) diff --git a/src/cmdexpand.c b/src/cmdexpand.c --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -92,6 +92,88 @@ sort_func_compare(const void *s1, const * Escape special characters in the cmdline completion matches. */ static void +wildescape( + expand_T *xp, + char_u *str, + int numfiles, + char_u **files) +{ + char_u *p; + int vse_what = xp->xp_context == EXPAND_BUFFERS + ? VSE_BUFFER : VSE_NONE; + + if (xp->xp_context == EXPAND_FILES + || xp->xp_context == EXPAND_FILES_IN_PATH + || xp->xp_context == EXPAND_SHELLCMD + || xp->xp_context == EXPAND_BUFFERS + || xp->xp_context == EXPAND_DIRECTORIES) + { + // Insert a backslash into a file name before a space, \, %, # + // and wildmatch characters, except '~'. + for (int i = 0; i < numfiles; ++i) + { + // for ":set path=" we need to escape spaces twice + if (xp->xp_backslash == XP_BS_THREE) + { + p = vim_strsave_escaped(files[i], (char_u *)" "); + if (p != NULL) + { + vim_free(files[i]); + files[i] = p; +#if defined(BACKSLASH_IN_FILENAME) + p = vim_strsave_escaped(files[i], (char_u *)" "); + if (p != NULL) + { + vim_free(files[i]); + files[i] = p; + } +#endif + } + } +#ifdef BACKSLASH_IN_FILENAME + p = vim_strsave_fnameescape(files[i], vse_what); +#else + p = vim_strsave_fnameescape(files[i], + xp->xp_shell ? VSE_SHELL : vse_what); +#endif + if (p != NULL) + { + vim_free(files[i]); + files[i] = p; + } + + // If 'str' starts with "\~", replace "~" at start of + // files[i] with "\~". + if (str[0] == '\\' && str[1] == '~' && files[i][0] == '~') + escape_fname(&files[i]); + } + xp->xp_backslash = XP_BS_NONE; + + // If the first file starts with a '+' escape it. Otherwise it + // could be seen as "+cmd". + if (*files[0] == '+') + escape_fname(&files[0]); + } + else if (xp->xp_context == EXPAND_TAGS) + { + // Insert a backslash before characters in a tag name that + // would terminate the ":tag" command. + for (int i = 0; i < numfiles; ++i) + { + p = vim_strsave_escaped(files[i], (char_u *)"\\|\""); + if (p != NULL) + { + vim_free(files[i]); + files[i] = p; + } + } + } +} + +/* + * Escape special characters in the cmdline completion matches. + */ + static void ExpandEscape( expand_T *xp, char_u *str, @@ -99,84 +181,12 @@ ExpandEscape( char_u **files, int options) { - int i; - char_u *p; - int vse_what = xp->xp_context == EXPAND_BUFFERS - ? VSE_BUFFER : VSE_NONE; - // May change home directory back to "~" if (options & WILD_HOME_REPLACE) tilde_replace(str, numfiles, files); if (options & WILD_ESCAPE) - { - if (xp->xp_context == EXPAND_FILES - || xp->xp_context == EXPAND_FILES_IN_PATH - || xp->xp_context == EXPAND_SHELLCMD - || xp->xp_context == EXPAND_BUFFERS - || xp->xp_context == EXPAND_DIRECTORIES) - { - // Insert a backslash into a file name before a space, \, %, # - // and wildmatch characters, except '~'. - for (i = 0; i < numfiles; ++i) - { - // for ":set path=" we need to escape spaces twice - if (xp->xp_backslash == XP_BS_THREE) - { - p = vim_strsave_escaped(files[i], (char_u *)" "); - if (p != NULL) - { - vim_free(files[i]); - files[i] = p; -#if defined(BACKSLASH_IN_FILENAME) - p = vim_strsave_escaped(files[i], (char_u *)" "); - if (p != NULL) - { - vim_free(files[i]); - files[i] = p; - } -#endif - } - } -#ifdef BACKSLASH_IN_FILENAME - p = vim_strsave_fnameescape(files[i], vse_what); -#else - p = vim_strsave_fnameescape(files[i], - xp->xp_shell ? VSE_SHELL : vse_what); -#endif - if (p != NULL) - { - vim_free(files[i]); - files[i] = p; - } - - // If 'str' starts with "\~", replace "~" at start of - // files[i] with "\~". - if (str[0] == '\\' && str[1] == '~' && files[i][0] == '~') - escape_fname(&files[i]); - } - xp->xp_backslash = XP_BS_NONE; - - // If the first file starts with a '+' escape it. Otherwise it - // could be seen as "+cmd". - if (*files[0] == '+') - escape_fname(&files[0]); - } - else if (xp->xp_context == EXPAND_TAGS) - { - // Insert a backslash before characters in a tag name that - // would terminate the ":tag" command. - for (i = 0; i < numfiles; ++i) - { - p = vim_strsave_escaped(files[i], (char_u *)"\\|\""); - if (p != NULL) - { - vim_free(files[i]); - files[i] = p; - } - } - } - } + wildescape(xp, str, numfiles, files); } /* @@ -3238,7 +3248,6 @@ expand_shellcmd_onedir( garray_T *gap) { int ret; - int i; hash_T hash; hashitem_T *hi; @@ -3249,35 +3258,36 @@ expand_shellcmd_onedir( // Expand matches in one directory of $PATH. ret = expand_wildcards(1, &buf, numMatches, matches, flags); - if (ret == OK) + if (ret != OK) + return; + + if (ga_grow(gap, *numMatches) == FAIL) { - if (ga_grow(gap, *numMatches) == FAIL) - FreeWild(*numMatches, *matches); - else + FreeWild(*numMatches, *matches); + return; + } + + for (int i = 0; i < *numMatches; ++i) + { + char_u *name = (*matches)[i]; + + if (STRLEN(name) > l) { - for (i = 0; i < *numMatches; ++i) + // Check if this name was already found. + hash = hash_hash(name + l); + hi = hash_lookup(ht, name + l, hash); + if (HASHITEM_EMPTY(hi)) { - char_u *name = (*matches)[i]; - - if (STRLEN(name) > l) - { - // Check if this name was already found. - hash = hash_hash(name + l); - hi = hash_lookup(ht, name + l, hash); - if (HASHITEM_EMPTY(hi)) - { - // Remove the path that was prepended. - STRMOVE(name, name + l); - ((char_u **)gap->ga_data)[gap->ga_len++] = name; - hash_add_item(ht, hi, name, hash); - name = NULL; - } - } - vim_free(name); + // Remove the path that was prepended. + STRMOVE(name, name + l); + ((char_u **)gap->ga_data)[gap->ga_len++] = name; + hash_add_item(ht, hi, name, hash); + name = NULL; } - vim_free(*matches); } + vim_free(name); } + vim_free(*matches); } /* diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 876, +/**/ 875, /**/ 874,