summaryrefslogtreecommitdiff
path: root/src/util.c
diff options
context:
space:
mode:
authorRamsay Jones <ramsay@ramsay1.demon.co.uk>2009-01-12 19:42:13 +0000
committerShawn O. Pearce <spearce@spearce.org>2009-01-28 12:25:24 -0800
commitced645ea9ca4170bd75c17cb9c2c8f19f935491d (patch)
treef2e2e7e17751b629cc3c13b0a7d0cab059cd1df4 /src/util.c
parent66a4bfac99c07b79d75c015aed8f5972f0a4a336 (diff)
downloadlibgit2-ced645ea9ca4170bd75c17cb9c2c8f19f935491d.tar.gz
Add git__dirname and git__basename utility routines
These routines are intended to extract the directory and base name from a path string. Note that these routines do not interact with any filesystem and work only on the text of the path. Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'src/util.c')
-rw-r--r--src/util.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/util.c b/src/util.c
index 80829e69e..3184a3abd 100644
--- a/src/util.c
+++ b/src/util.c
@@ -59,3 +59,65 @@ int git__suffixcmp(const char *str, const char *suffix)
return -1;
return strcmp(str + (a - b), suffix);
}
+
+int git__dirname(char *dir, size_t n, char *path)
+{
+ char *s;
+ int len;
+
+ assert(dir && n > 1);
+
+ if (!path || !*path || !(s = strrchr(path, '/'))) {
+ strcpy(dir, ".");
+ return 1;
+ }
+
+ if (s == path) { /* "/[aaa]" */
+ strcpy(dir, "/");
+ return 1;
+ }
+
+ if ((len = s - path) >= n)
+ return GIT_ERROR;
+
+ memcpy(dir, path, len);
+ dir[len] = '\0';
+
+ return len;
+}
+
+int git__basename(char *base, size_t n, char *path)
+{
+ char *s;
+ int len;
+
+ assert(base && n > 1);
+
+ if (!path || !*path) {
+ strcpy(base, ".");
+ return 1;
+ }
+ len = strlen(path);
+
+ if (!(s = strrchr(path, '/'))) {
+ if (len >= n)
+ return GIT_ERROR;
+ strcpy(base, path);
+ return len;
+ }
+
+ if (s == path && len == 1) { /* "/" */
+ strcpy(base, "/");
+ return 1;
+ }
+
+ len -= s - path;
+ if (len >= n)
+ return GIT_ERROR;
+
+ memcpy(base, s+1, len);
+ base[len] = '\0';
+
+ return len;
+}
+