git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 1/2] Introduce the function strip_path_suffix()

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Feb 19, 2009, 19:10 UTC
Message-ID
<f6344cbba22e049806796f4920e229fb2e539d5c.1235070304u.git.johannes.schindelin@gmx.de>
In-Reply-To
<499C63E7.5040306@kdbg.org>

The function strip_path_suffix() will try to strip a given suffix from a given path. The suffix must start at a directory boundary (i.e. "core" is not a path suffix of "libexec/git-core", but "git-core" is).

Arbitrary runs of directory separators ("slashes") are assumed identical.
Example:
	strip_path_suffix("C:\\msysgit/\\libexec\\git-core",
		"libexec///git-core", &prefix)
will set prefix to "C:\\msysgit" and return 0.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 cache.h               |    1 +
 path.c                |   32 ++++++++++++++++++++++++++++++++
 t/t0060-path-utils.sh |    4 ++++
 test-path-utils.c     |    6 ++++++
 4 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/cache.h b/cache.h
index c926bc7..1fa184d 100644
--- a/cache.h
+++ b/cache.h
@@ -630,6 +630,7 @@ const char *make_nonrelative_path(const char *path);
 const char *make_relative_path(const char *abs, const char *base);
 int normalize_path_copy(char *dst, const char *src);
 int longest_ancestor_length(const char *path, const char *prefix_list);
+char *strip_path_suffix(const char *path, const char *suffix);
 
 /* Read and unpack a sha1 file into memory, write memory to a sha1 file */
 extern int sha1_object_info(const unsigned char *, unsigned long *);
diff --git a/path.c b/path.c
index 4b9107f..2030bf1 100644
--- a/path.c
+++ b/path.c
@@ -499,3 +499,35 @@ int longest_ancestor_length(const char *path, const char *prefix_list)
 
 	return max_len;
 }
+
+/* strip arbitrary amount of directory separators at end of path */
+static inline int chomp_trailing_dir_sep(const char *path, int len)
+{
+	while (len && is_dir_sep(path[len - 1]))
+		len--;
+	return len;
+}
+
+/* sets prefix if the suffix matches */
+char *strip_path_suffix(const char *path, const char *suffix)
+{
+	int path_len = strlen(path), suffix_len = strlen(suffix);
+
+	while (suffix_len) {
+		if (!path_len)
+			return NULL;
+
+		if (is_dir_sep(path[path_len - 1])) {
+			if (!is_dir_sep(suffix[suffix_len - 1]))
+				return NULL;
+			path_len = chomp_trailing_dir_sep(path, path_len);
+			suffix_len = chomp_trailing_dir_sep(suffix, suffix_len);
+		}
+		else if (path[--path_len] != suffix[--suffix_len])
+			return NULL;
+	}
+
+	if (path_len && !is_dir_sep(path[path_len - 1]))
+		return NULL;
+	return xstrndup(path, chomp_trailing_dir_sep(path, path_len));
+}
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 4ed1f0b..8336114 100755
--- a/t/t0060-path-utils.sh
+++ b/t/t0060-path-utils.sh
@@ -85,4 +85,8 @@ ancestor /foo/bar :://foo/.:: 4
 ancestor /foo/bar //foo/./::/bar 4
 ancestor /foo/bar ::/bar -1
 
+test_expect_success 'strip_path_suffix' '
+	test c:/msysgit = $(test-path-utils strip_path_suffix \
+		c:/msysgit/libexec//git-core libexec/git-core)
+'
 test_done
diff --git a/test-path-utils.c b/test-path-utils.c
index 5168a8e..d261398 100644
--- a/test-path-utils.c
+++ b/test-path-utils.c
@@ -26,6 +26,12 @@ int main(int argc, char **argv)
 		return 0;
 	}
 
+	if (argc == 4 && !strcmp(argv[1], "strip_path_suffix")) {
+		char *prefix = strip_path_suffix(argv[2], argv[3]);
+		printf("%s\n", prefix ? prefix : "(null)");
+		return 0;
+	}
+
 	fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
 		argv[1] ? argv[1] : "(there was none)");
 	return 1;
-- 
1.6.2.rc1.380.g0299c
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 8 of 20 in “RUNTIME_PREFIX enhancements”
  1. 0/2 RUNTIME_PREFIX enhancementsJohannes Schindelin, Feb 18, 2009
  2. 1/2 Introduce the function strip_path_suffix()Johannes Schindelin, Feb 18, 2009
  3. Johannes SixtFeb 18, 2009
  4. Johannes SchindelinFeb 18, 2009
  5. Johannes SixtFeb 18, 2009
  6. Johannes SchindelinFeb 18, 2009
  7. 0/2 RUNTIME_PREFIX enhancementsJohannes Schindelin, Feb 19, 2009
  8. 1/2 Introduce the function strip_path_suffix()Johannes Schindelin, Feb 19, 2009
  9. Johannes SchindelinFeb 19, 2009
  10. Johannes SixtFeb 19, 2009
  11. Johannes SchindelinFeb 19, 2009
  12. 2/2 system_path(): simplify using strip_path_suffix(), and add suffix "git"Johannes Schindelin, Feb 19, 2009
  13. Johannes SixtFeb 19, 2009
  14. Johannes SchindelinFeb 19, 2009
  15. Junio C HamanoFeb 20, 2009
  16. 2/2 system_path(): simplify using strip_path_suffix(), and add suffix "git"Johannes Schindelin, Feb 18, 2009
  17. Johannes SixtFeb 18, 2009
  18. Johannes SchindelinFeb 18, 2009
  19. Johannes SixtFeb 18, 2009
  20. Johannes SchindelinFeb 18, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.