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 #11539)
diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index 2dbde4e..1f4791a 100644
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -92,6 +92,88 @@
* 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 @@
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 @@
garray_T *gap)
{
int ret;
- int i;
hash_T hash;
hashitem_T *hi;
@@ -3249,35 +3258,36 @@
// Expand matches in one directory of $PATH.
ret = expand_wildcards(1, &buf, numMatches, matches, flags);
- if (ret == OK)
- {
- if (ga_grow(gap, *numMatches) == FAIL)
- FreeWild(*numMatches, *matches);
- else
- {
- for (i = 0; i < *numMatches; ++i)
- {
- char_u *name = (*matches)[i];
+ if (ret != OK)
+ return;
- 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);
- }
- vim_free(*matches);
- }
+ if (ga_grow(gap, *numMatches) == FAIL)
+ {
+ FreeWild(*numMatches, *matches);
+ return;
}
+
+ for (int i = 0; i < *numMatches; ++i)
+ {
+ 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);
+ }
+ vim_free(*matches);
}
/*