summaryrefslogtreecommitdiff
path: root/src/ex_getln.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2014-05-07 18:35:30 +0200
committerBram Moolenaar <Bram@vim.org>2014-05-07 18:35:30 +0200
commit1b1063af58b015b7827168f8fa2631efb60c252b (patch)
treeecebaed1979aee36aa61e9a7ea1bebdb597be0d6 /src/ex_getln.c
parent3ec7f4e4025c5a78ccd312f8516ac0740aa65dfe (diff)
downloadvim-1b1063af58b015b7827168f8fa2631efb60c252b.zip
updated for version 7.4.279
Problem: globpath() returns a string, making it difficult to get a list of matches. (Greg Novack) Solution: Add an optional argument like with glob(). (Adnan Zafar)
Diffstat (limited to 'src/ex_getln.c')
-rw-r--r--src/ex_getln.c72
1 files changed, 27 insertions, 45 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index f1f39d2dc..741173244 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -5095,9 +5095,9 @@ ExpandRTDir(pat, num_file, file, dirnames)
char_u ***file;
char *dirnames[];
{
- char_u *matches;
char_u *s;
char_u *e;
+ char_u *match;
garray_T ga;
int i;
int pat_len;
@@ -5116,33 +5116,27 @@ ExpandRTDir(pat, num_file, file, dirnames)
return FAIL;
}
sprintf((char *)s, "%s/%s*.vim", dirnames[i], pat);
- matches = globpath(p_rtp, s, 0);
+ globpath(p_rtp, s, &ga, 0);
vim_free(s);
- if (matches == NULL)
- continue;
+ }
- for (s = matches; *s != NUL; s = e)
+ for (i = 0; i < ga.ga_len; ++i)
+ {
+ match = ((char_u **)ga.ga_data)[i];
+ s = match;
+ e = s + STRLEN(s);
+ if (e - 4 > s && STRNICMP(e - 4, ".vim", 4) == 0)
{
- e = vim_strchr(s, '\n');
- if (e == NULL)
- e = s + STRLEN(s);
- if (ga_grow(&ga, 1) == FAIL)
- break;
- if (e - 4 > s && STRNICMP(e - 4, ".vim", 4) == 0)
- {
- for (s = e - 4; s > matches; mb_ptr_back(matches, s))
- if (*s == '\n' || vim_ispathsep(*s))
- break;
- ++s;
- ((char_u **)ga.ga_data)[ga.ga_len] =
- vim_strnsave(s, (int)(e - s - 4));
- ++ga.ga_len;
- }
- if (*e != NUL)
- ++e;
+ e -= 4;
+ for (s = e; s > match; mb_ptr_back(match, s))
+ if (s < match || vim_ispathsep(*s))
+ break;
+ ++s;
+ *e = NUL;
+ mch_memmove(match, s, e - s + 1);
}
- vim_free(matches);
}
+
if (ga.ga_len == 0)
return FAIL;
@@ -5160,33 +5154,28 @@ ExpandRTDir(pat, num_file, file, dirnames)
#if defined(FEAT_CMDL_COMPL) || defined(FEAT_EVAL) || defined(PROTO)
/*
* Expand "file" for all comma-separated directories in "path".
- * Returns an allocated string with all matches concatenated, separated by
- * newlines. Returns NULL for an error or no matches.
+ * Adds the matches to "ga". Caller must init "ga".
*/
- char_u *
-globpath(path, file, expand_options)
+ void
+globpath(path, file, ga, expand_options)
char_u *path;
char_u *file;
+ garray_T *ga;
int expand_options;
{
expand_T xpc;
char_u *buf;
- garray_T ga;
int i;
- int len;
int num_p;
char_u **p;
- char_u *cur = NULL;
buf = alloc(MAXPATHL);
if (buf == NULL)
- return NULL;
+ return;
ExpandInit(&xpc);
xpc.xp_context = EXPAND_FILES;
- ga_init2(&ga, 1, 100);
-
/* Loop over all entries in {path}. */
while (*path != NUL)
{
@@ -5207,30 +5196,23 @@ globpath(path, file, expand_options)
WILD_SILENT|expand_options) != FAIL && num_p > 0)
{
ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options);
- for (len = 0, i = 0; i < num_p; ++i)
- len += (int)STRLEN(p[i]) + 1;
- /* Concatenate new results to previous ones. */
- if (ga_grow(&ga, len) == OK)
+ if (ga_grow(ga, num_p) == OK)
{
- cur = (char_u *)ga.ga_data + ga.ga_len;
for (i = 0; i < num_p; ++i)
{
- STRCPY(cur, p[i]);
- cur += STRLEN(p[i]);
- *cur++ = '\n';
+ ((char_u **)ga->ga_data)[ga->ga_len] =
+ vim_strnsave(p[i], STRLEN(p[i]));
+ ++ga->ga_len;
}
- ga.ga_len += len;
}
+
FreeWild(num_p, p);
}
}
}
- if (cur != NULL)
- *--cur = 0; /* Replace trailing newline with NUL */
vim_free(buf);
- return (char_u *)ga.ga_data;
}
#endif