Code

compat: add a basename() compatibility function
authorDavid Aguilar <davvid@gmail.com>
Sun, 31 May 2009 08:35:51 +0000 (01:35 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 1 Jun 2009 00:57:59 +0000 (17:57 -0700)
Some systems such as Windows lack libgen.h so provide a
basename() implementation for cross-platform use.

This introduces the NO_LIBGEN_H construct to the Makefile
and autoconf scripts.

Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Makefile
compat/basename.c [new file with mode: 0644]
config.mak.in
configure.ac
git-compat-util.h

index a70b5f0dde655c3bb4efbcecf0ffd4831d83906d..a59f10687bd158757422809ad20022d84ead9b9a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -54,6 +54,8 @@ all::
 #
 # Define NO_MKSTEMPS if you don't have mkstemps in the C library.
 #
+# Define NO_LIBGEN_H if you don't have libgen.h.
+#
 # Define NO_SYS_SELECT_H if you don't have sys/select.h.
 #
 # Define NO_SYMLINK_HEAD if you never want .git/HEAD to be a symbolic link.
@@ -834,6 +836,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
        NO_PREAD = YesPlease
        NO_OPENSSL = YesPlease
        NO_CURL = YesPlease
+       NO_LIBGEN_H = YesPlease
        NO_SYMLINK_HEAD = YesPlease
        NO_IPV6 = YesPlease
        NO_SETENV = YesPlease
@@ -899,6 +902,11 @@ ifndef CC_LD_DYNPATH
        endif
 endif
 
+ifdef NO_LIBGEN_H
+       COMPAT_CFLAGS += -DNO_LIBGEN_H
+       COMPAT_OBJS += compat/basename.o
+endif
+
 ifdef NO_CURL
        BASIC_CFLAGS += -DNO_CURL
 else
diff --git a/compat/basename.c b/compat/basename.c
new file mode 100644 (file)
index 0000000..d8f8a3c
--- /dev/null
@@ -0,0 +1,15 @@
+#include "../git-compat-util.h"
+
+/* Adapted from libiberty's basename.c.  */
+char *gitbasename (char *path)
+{
+       const char *base;
+       /* Skip over the disk name in MSDOS pathnames. */
+       if (has_dos_drive_prefix(path))
+               path += 2;
+       for (base = path; *path; path++) {
+               if (is_dir_sep(*path))
+                       base = path + 1;
+       }
+       return (char *)base;
+}
index b6619af1b92c55b004721b531672680579bdb128..e8d96e88b92a2305e50eb1adcff7f9d0f3310996 100644 (file)
@@ -30,6 +30,7 @@ NEEDS_SSL_WITH_CRYPTO=@NEEDS_SSL_WITH_CRYPTO@
 NO_OPENSSL=@NO_OPENSSL@
 NO_CURL=@NO_CURL@
 NO_EXPAT=@NO_EXPAT@
+NO_LIBGEN_H=@NO_LIBGEN_H@
 NEEDS_LIBICONV=@NEEDS_LIBICONV@
 NEEDS_SOCKET=@NEEDS_SOCKET@
 NO_SYS_SELECT_H=@NO_SYS_SELECT_H@
index 953da071314a371e245f50c292c27ff3bf2377ae..108a97fa8bdca8b6d685f2c5b1057df3d7af40a2 100644 (file)
@@ -627,6 +627,12 @@ AC_SUBST(SNPRINTF_RETURNS_BOGUS)
 ## (in default C library and libraries checked by AC_CHECK_LIB)
 AC_MSG_NOTICE([CHECKS for library functions])
 #
+# Define NO_LIBGEN_H if you don't have libgen.h.
+AC_CHECK_HEADER([libgen.h],
+[NO_LIBGEN_H=],
+[NO_LIBGEN_H=YesPlease])
+AC_SUBST(NO_LIBGEN_H)
+#
 # Define NO_STRCASESTR if you don't have strcasestr.
 GIT_CHECK_FUNC(strcasestr,
 [NO_STRCASESTR=],
index f7217ad4309b42f65c3f4beae4f8d0c5b501e59d..71445c6aac392c2ca43edc4e6b16780f0bf75e2b 100644 (file)
 #include "compat/mingw.h"
 #endif /* __MINGW32__ */
 
+#ifndef NO_LIBGEN_H
+#include <libgen.h>
+#else
+#define basename gitbasename
+extern char *gitbasename(char *);
+#endif
+
 #ifndef NO_ICONV
 #include <iconv.h>
 #endif