diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 57 | ||||
-rw-r--r-- | src/nvim/ex_getln.c | 102 | ||||
-rw-r--r-- | src/nvim/garray.c | 1 | ||||
-rw-r--r-- | src/nvim/path.c | 25 | ||||
-rw-r--r-- | src/nvim/testdir/test97.in | 11 | ||||
-rw-r--r-- | src/nvim/testdir/test97.ok | 3 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
7 files changed, 92 insertions, 109 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 7234afc0ce..5bda9fcd3f 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -6408,7 +6408,7 @@ static struct fst { {"getwinposy", 0, 0, f_getwinposy}, {"getwinvar", 2, 3, f_getwinvar}, {"glob", 1, 3, f_glob}, - {"globpath", 2, 3, f_globpath}, + {"globpath", 2, 4, f_globpath}, {"has", 1, 1, f_has}, {"has_key", 2, 2, f_has_key}, {"haslocaldir", 0, 0, f_haslocaldir}, @@ -9605,27 +9605,50 @@ static void f_glob(typval_T *argvars, typval_T *rettv) rettv->vval.v_string = NULL; } -/* - * "globpath()" function - */ +/// "globpath()" function static void f_globpath(typval_T *argvars, typval_T *rettv) { - int flags = 0; - char_u buf1[NUMBUFLEN]; - char_u *file = get_tv_string_buf_chk(&argvars[1], buf1); - int error = FALSE; + int flags = 0; // Flags for globpath. + int error = false; - /* When the optional second argument is non-zero, don't remove matches - * for 'wildignore' and don't put matches for 'suffixes' at the end. */ - if (argvars[2].v_type != VAR_UNKNOWN - && get_tv_number_chk(&argvars[2], &error)) - flags |= WILD_KEEP_ALL; + // Return a string, or a list if the optional third argument is non-zero. rettv->v_type = VAR_STRING; - if (file == NULL || error) + + if (argvars[2].v_type != VAR_UNKNOWN) { + // When the optional second argument is non-zero, don't remove matches + // for 'wildignore' and don't put matches for 'suffixes' at the end. + if (get_tv_number_chk(&argvars[2], &error)) { + flags |= WILD_KEEP_ALL; + } + + if (argvars[3].v_type != VAR_UNKNOWN + && get_tv_number_chk(&argvars[3], &error)) { + rettv->v_type = VAR_LIST; + rettv->vval.v_list = NULL; + } + } + + char_u buf1[NUMBUFLEN]; + char_u *file = get_tv_string_buf_chk(&argvars[1], buf1); + if (file != NULL && !error) { + garray_T ga; + ga_init(&ga, (int)sizeof(char_u *), 10); + globpath(get_tv_string(&argvars[0]), file, &ga, flags); + + if (rettv->v_type == VAR_STRING) { + rettv->vval.v_string = ga_concat_strings_sep(&ga, "\n"); + } else { + rettv_list_alloc(rettv); + for (int i = 0; i < ga.ga_len; i++) { + list_append_string(rettv->vval.v_list, + ((char_u **)(ga.ga_data))[i], -1); + } + } + + ga_clear_strings(&ga); + } else { rettv->vval.v_string = NULL; - else - rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file, - flags); + } } /* diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index bf5076bdc3..28048c933c 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -4051,45 +4051,38 @@ static int ExpandUserList(expand_T *xp, int *num_file, char_u ***file) */ static int ExpandRTDir(char_u *pat, int *num_file, char_u ***file, char *dirnames[]) { - char_u *matches; - char_u *s; - char_u *e; - garray_T ga; - int i; - int pat_len; - *num_file = 0; *file = NULL; - pat_len = (int)STRLEN(pat); + size_t pat_len = STRLEN(pat); + + garray_T ga; ga_init(&ga, (int)sizeof(char *), 10); - for (i = 0; dirnames[i] != NULL; ++i) { - s = xmalloc(STRLEN(dirnames[i]) + pat_len + 7); - sprintf((char *)s, "%s/%s*.vim", dirnames[i], pat); - matches = globpath(p_rtp, s, 0); + for (int i = 0; dirnames[i] != NULL; i++) { + size_t size = STRLEN(dirnames[i]) + pat_len + 7; + char_u *s = xmalloc(size); + snprintf((char *)s, size, "%s/%s*.vim", dirnames[i], pat); + globpath(p_rtp, s, &ga, 0); free(s); - if (matches == NULL) - continue; + } - for (s = matches; *s != NUL; s = e) { - e = vim_strchr(s, '\n'); - if (e == NULL) - e = s + STRLEN(s); - ga_grow(&ga, 1); - 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; + for (int i = 0; i < ga.ga_len; i++) { + char_u *match = ((char_u **)ga.ga_data)[i]; + char_u *s = match; + char_u *e = s + STRLEN(s); + if (e - s > 4 && STRNICMP(e - 4, ".vim", 4) == 0) { + e -= 4; + for (s = e; s > match; mb_ptr_back(match, s)) { + if (vim_ispathsep(*s)) { + break; + } } - if (*e != NUL) - ++e; + s++; + *e = NUL; + memmove(match, s, e - s + 1); } - free(matches); } + if (GA_EMPTY(&ga)) return FAIL; @@ -4103,60 +4096,43 @@ static int ExpandRTDir(char_u *pat, int *num_file, char_u ***file, char *dirname } -/* - * 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. - */ -char_u *globpath(char_u *path, char_u *file, int expand_options) +/// Expand `file` for all comma-separated directories in `path`. +/// Adds matches to `ga`. +void globpath(char_u *path, char_u *file, garray_T *ga, int expand_options) { expand_T xpc; - garray_T ga; - int i; - int len; - int num_p; - char_u **p; - char_u *cur = NULL; - - char_u *buf = xmalloc(MAXPATHL); - ExpandInit(&xpc); xpc.xp_context = EXPAND_FILES; - ga_init(&ga, 1, 100); + char_u *buf = xmalloc(MAXPATHL); - /* Loop over all entries in {path}. */ + // Loop over all entries in {path}. while (*path != NUL) { - /* Copy one item of the path to buf[] and concatenate the file name. */ + // Copy one item of the path to buf[] and concatenate the file name. copy_option_part(&path, buf, MAXPATHL, ","); if (STRLEN(buf) + STRLEN(file) + 2 < MAXPATHL) { add_pathsep(buf); - STRCAT(buf, file); + STRCAT(buf, file); // NOLINT + + char_u **p; + int num_p; if (ExpandFromContext(&xpc, buf, &num_p, &p, 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. */ - ga_grow(&ga, len); - 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'; + + // Concatenate new results to previous ones. + ga_grow(ga, num_p); + for (int i = 0; i < num_p; i++) { + ((char_u **)ga->ga_data)[ga->ga_len] = vim_strsave(p[i]); + ga->ga_len++; } - ga.ga_len += len; FreeWild(num_p, p); } } } - if (cur != NULL) - *--cur = 0; /* Replace trailing newline with NUL */ free(buf); - return (char_u *)ga.ga_data; } diff --git a/src/nvim/garray.c b/src/nvim/garray.c index fb76d11f3f..08a38493bf 100644 --- a/src/nvim/garray.c +++ b/src/nvim/garray.c @@ -133,6 +133,7 @@ void ga_remove_duplicate_strings(garray_T *gap) /// strings with sep as separator. /// /// @param gap +/// @param sep /// /// @returns the concatenated strings char_u *ga_concat_strings_sep(const garray_T *gap, const char *sep) diff --git a/src/nvim/path.c b/src/nvim/path.c index 2d819b39a4..0c18ab7bd4 100644 --- a/src/nvim/path.c +++ b/src/nvim/path.c @@ -926,9 +926,6 @@ expand_in_path ( { char_u *curdir; garray_T path_ga; - char_u *files = NULL; - char_u *s; /* start */ - char_u *e; /* end */ char_u *paths = NULL; curdir = xmalloc(MAXPATHL); @@ -943,28 +940,8 @@ expand_in_path ( paths = ga_concat_strings(&path_ga); ga_clear_strings(&path_ga); - files = globpath(paths, pattern, (flags & EW_ICASE) ? WILD_ICASE : 0); + globpath(paths, pattern, gap, (flags & EW_ICASE) ? WILD_ICASE : 0); free(paths); - if (files == NULL) - return 0; - - /* Copy each path in files into gap */ - s = e = files; - while (*s != NUL) { - while (*e != '\n' && *e != NUL) - e++; - if (*e == NUL) { - addfile(gap, s, flags); - break; - } else { - /* *e is '\n' */ - *e = NUL; - addfile(gap, s, flags); - e++; - s = e; - } - } - free(files); return gap->ga_len; } diff --git a/src/nvim/testdir/test97.in b/src/nvim/testdir/test97.in index 59bb62d15c..d4ff6d9295 100644 --- a/src/nvim/testdir/test97.in +++ b/src/nvim/testdir/test97.in @@ -8,12 +8,15 @@ STARTTEST :" consistent sorting of file names :set nofileignorecase :e test.out -:put =glob('Xxx\{') -:put =glob('Xxx\$') +:$put =glob('Xxx\{') +:$put =glob('Xxx\$') :w! Xxx{ :w! Xxx\$ -:put =glob('Xxx\{') -:put =glob('Xxx\$') +:$put =glob('Xxx\{') +:$put =glob('Xxx\$') +:" +:$put =string(globpath('sautest/autoload', '*.vim')) +:$put =string(globpath('sautest/autoload', '*.vim', 0, 1)) :w :qa! ENDTEST diff --git a/src/nvim/testdir/test97.ok b/src/nvim/testdir/test97.ok index afa96a4de4..32cdcbf1be 100644 --- a/src/nvim/testdir/test97.ok +++ b/src/nvim/testdir/test97.ok @@ -3,3 +3,6 @@ Xxx{ Xxx$ +'sautest/autoload/Test104.vim +sautest/autoload/footest.vim' +['sautest/autoload/Test104.vim', 'sautest/autoload/footest.vim'] diff --git a/src/nvim/version.c b/src/nvim/version.c index 052248a719..cbfffc93ad 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -316,7 +316,7 @@ static int included_patches[] = { 282, 281, 280, - //279, + 279, //278, 277, 276, |