Re: [PATCH v2 2/4] compat/basename: make basename() conform to POSIX
Johannes Schindelin <johannes.schindelin@gmx.de> writes:
> According to POSIX, basename("/path/") should return "path", not
> "path/". Likewise, basename(NULL) and basename("abc") should both
> return ".".Did you mean basename("abc"), not basename(""), here? Show 37 quoted lines
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
> compat/basename.c | 20 +++++++++++++++++---
> 1 file changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/compat/basename.c b/compat/basename.c
> index 9f00421..0f1b0b0 100644
> --- a/compat/basename.c
> +++ b/compat/basename.c
> @@ -4,10 +4,24 @@
> char *gitbasename (char *path)
> {
> const char *base;
> - skip_dos_drive_prefix(&path);
> +
> + if (path)
> + skip_dos_drive_prefix(&path);
> +
> + if (!path || !*path)
> + return ".";
> +
> for (base = path; *path; path++) {
> - if (is_dir_sep(*path))
> - base = path + 1;
> + if (!is_dir_sep(*path))
> + continue;
> + do {
> + path++;
> + } while (is_dir_sep(*path));
> + if (*path)
> + base = path;
> + else
> + while (--path != base && is_dir_sep(*path))
> + *path = '\0';
> }
> return (char *)base;
> }