1
0
forked from aniani/vim

updated for version 7.0116

This commit is contained in:
Bram Moolenaar
2005-07-25 20:42:36 +00:00
parent c013cb66a6
commit 027436338b
24 changed files with 249 additions and 509 deletions

View File

@@ -174,8 +174,6 @@ static int have_dollars __ARGS((int, char_u **));
#endif
#ifndef NO_EXPANDPATH
static int pstrcmp __ARGS((const void *, const void *));
static int unix_expandpath __ARGS((garray_T *gap, char_u *path, int wildoff, int flags));
# if defined(MACOS_X) && defined(FEAT_MBYTE)
extern char_u *mac_precompose_path __ARGS((char_u *decompPath, size_t decompLen, size_t *precompLen));
# endif
@@ -4735,19 +4733,11 @@ RealWaitForChar(fd, msec, check_for_gpm)
#ifndef VMS
#ifndef NO_EXPANDPATH
static int
pstrcmp(a, b)
const void *a, *b;
{
return (pathcmp(*(char **)a, *(char **)b, -1));
}
/*
* Recursively expand one path component into all matching files and/or
* directories.
* "path" has backslashes before chars that are not to be expanded, starting
* at "path + wildoff".
* Return the number of matches found.
* Expand a path into all matching files and/or directories. Handles "*",
* "?", "[a-z]", "**", etc.
* "path" has backslashes before chars that are not to be expanded.
* Returns the number of matches found.
*/
int
mch_expandpath(gap, path, flags)
@@ -4755,167 +4745,7 @@ mch_expandpath(gap, path, flags)
char_u *path;
int flags; /* EW_* flags */
{
return unix_expandpath(gap, path, 0, flags);
}
static int
unix_expandpath(gap, path, wildoff, flags)
garray_T *gap;
char_u *path;
int wildoff;
int flags; /* EW_* flags */
{
char_u *buf;
char_u *path_end;
char_u *p, *s, *e;
int start_len, c;
char_u *pat;
DIR *dirp;
regmatch_T regmatch;
struct dirent *dp;
int starts_with_dot;
int matches;
int len;
start_len = gap->ga_len;
buf = alloc(STRLEN(path) + BASENAMELEN + 5);/* make room for file name */
if (buf == NULL)
return 0;
/*
* Find the first part in the path name that contains a wildcard.
* Copy it into buf, including the preceding characters.
*/
p = buf;
s = buf;
e = NULL;
path_end = path;
while (*path_end != NUL)
{
/* May ignore a wildcard that has a backslash before it; it will
* be removed by rem_backslash() or file_pat_to_reg_pat() below. */
if (path_end >= path + wildoff && rem_backslash(path_end))
*p++ = *path_end++;
else if (*path_end == '/')
{
if (e != NULL)
break;
s = p + 1;
}
else if (path_end >= path + wildoff
&& vim_strchr((char_u *)"*?[{~$", *path_end) != NULL)
e = p;
#ifdef FEAT_MBYTE
if (has_mbyte)
{
len = (*mb_ptr2len_check)(path_end);
STRNCPY(p, path_end, len);
p += len;
path_end += len;
}
else
#endif
*p++ = *path_end++;
}
e = p;
*e = NUL;
/* now we have one wildcard component between s and e */
/* Remove backslashes between "wildoff" and the start of the wildcard
* component. */
for (p = buf + wildoff; p < s; ++p)
if (rem_backslash(p))
{
STRCPY(p, p + 1);
--e;
--s;
}
/* convert the file pattern to a regexp pattern */
starts_with_dot = (*s == '.');
pat = file_pat_to_reg_pat(s, e, NULL, FALSE);
if (pat == NULL)
{
vim_free(buf);
return 0;
}
/* compile the regexp into a program */
#ifdef MACOS_X /* Can/Should we use CASE_INSENSITIVE_FILENAME instead ?*/
regmatch.rm_ic = TRUE; /* Behave like Terminal.app */
#else
regmatch.rm_ic = FALSE; /* Don't ever ignore case */
#endif
regmatch.regprog = vim_regcomp(pat, RE_MAGIC);
vim_free(pat);
if (regmatch.regprog == NULL)
{
vim_free(buf);
return 0;
}
/* open the directory for scanning */
c = *s;
*s = NUL;
dirp = opendir(*buf == NUL ? "." : (char *)buf);
*s = c;
/* Find all matching entries */
if (dirp != NULL)
{
for (;;)
{
dp = readdir(dirp);
if (dp == NULL)
break;
if ((dp->d_name[0] != '.' || starts_with_dot)
&& vim_regexec(&regmatch, (char_u *)dp->d_name, (colnr_T)0))
{
STRCPY(s, dp->d_name);
len = STRLEN(buf);
STRCPY(buf + len, path_end);
if (mch_has_exp_wildcard(path_end)) /* handle more wildcards */
{
/* need to expand another component of the path */
/* remove backslashes for the remaining components only */
(void)unix_expandpath(gap, buf, len + 1, flags);
}
else
{
/* no more wildcards, check if there is a match */
/* remove backslashes for the remaining components only */
if (*path_end != NUL)
backslash_halve(buf + len + 1);
if (mch_getperm(buf) >= 0) /* add existing file */
{
#if defined(MACOS_X) && defined(FEAT_MBYTE)
size_t precomp_len = STRLEN(buf)+1;
char_u *precomp_buf =
mac_precompose_path(buf, precomp_len, &precomp_len);
if (precomp_buf)
{
mch_memmove(buf, precomp_buf, precomp_len);
vim_free(precomp_buf);
}
#endif
addfile(gap, buf, flags);
}
}
}
}
closedir(dirp);
}
vim_free(buf);
vim_free(regmatch.regprog);
matches = gap->ga_len - start_len;
if (matches > 0)
qsort(((char_u **)gap->ga_data) + start_len, matches,
sizeof(char_u *), pstrcmp);
return matches;
return unix_expandpath(gap, path, 0, flags, FALSE);
}
#endif