When there is no `libgen.h` to our disposal, we miss the `dirname()` function. So far, we only had one user of that function: credential-cache--daemon (which was only compiled when Unix sockets are available, anyway). But now we also have `builtin/am.c` as user, so we need it. Since `dirname()` is a sibling of `basename()`, we simply put our very own `gitdirname()` implementation next to `gitbasename()` and use it if `NO_LIBGEN_H` has been set. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- I stumbled over the compile warning when upgrading Git for Windows to 2.6.0. There was a left-over NO_LIBGEN_H=YesPlease (which we no longer need in Git for Windows 2.x), but it did point to the fact that we use `dirname()` in builtin/am.c now, so we better have a fall-back implementation for platforms without libgen.h. I tested this implementation a bit, but I still would appreciate a few eye-balls to go over it. compat/basename.c | 26 ++++++++++++++++++++++++++ git-compat-util.h | 2 ++ 2 files changed, 28 insertions(+) diff --git a/compat/basename.c b/compat/basename.c index d8f8a3c..10dba38 100644 --- a/compat/basename.c +++ b/compat/basename.c @@ -13,3 +13,29 @@ char *gitbasename (char *path) } return (char *)base; } + +char *gitdirname(char *path) +{ + char *p = path, *slash, c; + + /* Skip over the disk name in MSDOS pathnames. */ + if (has_dos_drive_prefix(p)) + p += 2; + /* POSIX.1-2001 says dirname("/") should return "/" */ + slash = is_dir_sep(*p) ? ++p : NULL; + while ((c = *(p++))) + if (is_dir_sep(c)) { + char *tentative = p - 1; + + /* POSIX.1-2001 says to ignore trailing slashes */ + while (is_dir_sep(*p)) + p++; + if (*p) + slash = tentative; + } + + if (!slash) + return "."; + *slash = '\0'; + return path; +} diff --git a/git-compat-util.h b/git-compat-util.h index f649e81..8b01aa5 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -253,6 +253,8 @@ struct itimerval { #else #define basename gitbasename extern char *gitbasename(char *); +#define dirname gitdirname +extern char *gitdirname(char *); #endif #ifndef NO_ICONV -- 2.5.3.windows.1.3.gc322723 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html