Merge branch 'js/dirname-basename' into maint

dirname() emulation has been added, as Msys2 lacks it.

* js/dirname-basename:
  mingw: avoid linking to the C library's isalpha()
  t0060: loosen overly strict expectations
  t0060: verify that basename() and dirname() work as expected
  compat/basename.c: provide a dirname() compatibility function
  compat/basename: make basename() conform to POSIX
  Refactor skipping DOS drive prefixes
This commit is contained in:
Junio C Hamano
2016-02-05 14:54:17 -08:00
7 changed files with 225 additions and 24 deletions

View File

@ -1932,28 +1932,31 @@ pid_t waitpid(pid_t pid, int *status, int options)
return -1;
}
int mingw_skip_dos_drive_prefix(char **path)
{
int ret = has_dos_drive_prefix(*path);
*path += ret;
return ret;
}
int mingw_offset_1st_component(const char *path)
{
int offset = 0;
if (has_dos_drive_prefix(path))
offset = 2;
char *pos = (char *)path;
/* unc paths */
else if (is_dir_sep(path[0]) && is_dir_sep(path[1])) {
if (!skip_dos_drive_prefix(&pos) &&
is_dir_sep(pos[0]) && is_dir_sep(pos[1])) {
/* skip server name */
char *pos = strpbrk(path + 2, "\\/");
pos = strpbrk(pos + 2, "\\/");
if (!pos)
return 0; /* Error: malformed unc path */
do {
pos++;
} while (*pos && !is_dir_sep(*pos));
offset = pos - path;
}
return offset + is_dir_sep(path[offset]);
return pos + is_dir_sep(*pos) - path;
}
int xutftowcsn(wchar_t *wcs, const char *utfs, size_t wcslen, int utflen)