All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Provide a dirname() function when NO_LIBGEN_H=YesPlease
@ 2015-09-30 14:50 Johannes Schindelin
  2015-09-30 18:24 ` Junio C Hamano
                   ` (2 more replies)
  0 siblings, 3 replies; 63+ messages in thread
From: Johannes Schindelin @ 2015-09-30 14:50 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

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@gmx.de>
---

	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

^ permalink raw reply related	[flat|nested] 63+ messages in thread

end of thread, other threads:[~2016-01-25 22:04 UTC | newest]

Thread overview: 63+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-30 14:50 [PATCH] Provide a dirname() function when NO_LIBGEN_H=YesPlease Johannes Schindelin
2015-09-30 18:24 ` Junio C Hamano
2016-01-08 16:17   ` Johannes Schindelin
2015-09-30 18:57 ` Ramsay Jones
2016-01-08 16:18   ` Johannes Schindelin
2016-01-08 16:21 ` [PATCH v2 0/4] Ensure that we can build without libgen.h Johannes Schindelin
2016-01-08 16:21   ` [PATCH v2 1/4] Refactor skipping DOS drive prefixes Johannes Schindelin
2016-01-08 21:51     ` Eric Sunshine
2016-01-08 22:07       ` Junio C Hamano
2016-01-11  9:32         ` Johannes Schindelin
2016-01-11 15:58           ` Junio C Hamano
2016-01-08 16:21   ` [PATCH v2 2/4] compat/basename: make basename() conform to POSIX Johannes Schindelin
2016-01-08 18:45     ` Junio C Hamano
2016-01-09 14:53       ` Johannes Schindelin
2016-01-11 16:01         ` Junio C Hamano
2016-01-08 16:21   ` [PATCH v2 3/4] Provide a dirname() function when NO_LIBGEN_H=YesPlease Johannes Schindelin
2016-01-08 18:53     ` Junio C Hamano
2016-01-08 16:21   ` [PATCH v2 4/4] t0060: verify that basename() and dirname() work as expected Johannes Schindelin
2016-01-10  4:17     ` Eric Sunshine
2016-01-11 10:50       ` Johannes Schindelin
2016-01-13 18:52     ` Michael Blume
2016-01-13 19:43       ` Junio C Hamano
2016-01-14  6:09         ` Johannes Schindelin
2016-01-11 18:29   ` [PATCH v3 0/4] Ensure that we can build without libgen.h Johannes Schindelin
2016-01-11 18:29     ` [PATCH v3 1/4] Refactor skipping DOS drive prefixes Johannes Schindelin
2016-01-11 18:29     ` [PATCH v3 2/4] compat/basename: make basename() conform to POSIX Johannes Schindelin
2016-01-11 18:30     ` [PATCH v3 3/4] Provide a dirname() function when NO_LIBGEN_H=YesPlease Johannes Schindelin
2016-01-11 20:33       ` Eric Sunshine
2016-01-11 22:56         ` Junio C Hamano
2016-01-12  7:57           ` Johannes Schindelin
2016-01-11 18:30     ` [PATCH v3 4/4] t0060: verify that basename() and dirname() work as expected Johannes Schindelin
2016-01-11 22:59     ` [PATCH v3 0/4] Ensure that we can build without libgen.h Junio C Hamano
2016-01-12  7:57     ` [PATCH v4 " Johannes Schindelin
2016-01-12  7:57       ` [PATCH v4 1/4] Refactor skipping DOS drive prefixes Johannes Schindelin
2016-01-22 18:50         ` Johannes Sixt
2016-01-22 19:09           ` Junio C Hamano
2016-01-23  8:25             ` Johannes Schindelin
2016-01-23 19:02               ` Johannes Sixt
2016-01-24 10:56                 ` Johannes Schindelin
2016-01-24 12:36                   ` Johannes Sixt
2016-01-24 22:12                     ` Junio C Hamano
2016-01-25 21:47                       ` [PATCH] mingw: avoid linking to the C library's isalpha() Johannes Sixt
2016-01-25 22:04                         ` Junio C Hamano
2016-01-12  7:57       ` [PATCH v4 2/4] compat/basename: make basename() conform to POSIX Johannes Schindelin
2016-01-13  0:49         ` Ramsay Jones
2016-01-13  7:14           ` Johannes Schindelin
2016-01-12  7:57       ` [PATCH v4 3/4] Provide a dirname() function when NO_LIBGEN_H=YesPlease Johannes Schindelin
2016-01-13  0:55         ` Ramsay Jones
2016-01-13  7:40           ` Johannes Schindelin
2016-01-13 16:44             ` Ramsay Jones
2016-01-12  7:57       ` [PATCH v4 4/4] t0060: verify that basename() and dirname() work as expected Johannes Schindelin
2016-01-13  0:58         ` Ramsay Jones
2016-01-13  7:17           ` Johannes Schindelin
     [not found]         ` <5695E4FB.2060705@web.de>
2016-01-13  9:27           ` Johannes Schindelin
2016-01-13 16:46             ` Ramsay Jones
2016-01-13 16:34           ` Ramsay Jones
2016-01-13 17:20             ` Junio C Hamano
2016-01-13 18:53               ` Johannes Schindelin
2016-01-13  0:44       ` [PATCH v4 0/4] Ensure that we can build without libgen.h Ramsay Jones
2016-01-13  2:56         ` Junio C Hamano
2016-01-13  6:15           ` Torsten Bögershausen
2016-01-13  7:38             ` Johannes Schindelin
2016-01-13  7:02         ` Johannes Schindelin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.