summaryrefslogtreecommitdiff
path: root/lockfile.c
diff options
context:
space:
mode:
authorMichael Haggerty <mhagger@alum.mit.edu>2014-10-01 10:28:35 (GMT)
committerJunio C Hamano <gitster@pobox.com>2014-10-01 20:51:30 (GMT)
commit0c0d6e8601a1cfb8ebbdadb6a25a9f6fadc91359 (patch)
treeb2d942b9b59fa6eed5f6b7a1cba0c0f7b2e05596 /lockfile.c
parent6cad805332e3c3a60993f062afd8d896920689ab (diff)
downloadgit-0c0d6e8601a1cfb8ebbdadb6a25a9f6fadc91359.zip
git-0c0d6e8601a1cfb8ebbdadb6a25a9f6fadc91359.tar.gz
git-0c0d6e8601a1cfb8ebbdadb6a25a9f6fadc91359.tar.bz2
trim_last_path_component(): replace last_path_elm()
Rewrite last_path_elm() to take a strbuf parameter and to trim off the last path name element in place rather than returning a pointer to the beginning of the last path name element. This simplifies the function a bit and makes it integrate better with its caller, which is now also strbuf-based. Rename the function accordingly and a bit less tersely. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'lockfile.c')
-rw-r--r--lockfile.c38
1 files changed, 16 insertions, 22 deletions
diff --git a/lockfile.c b/lockfile.c
index 5f5bcff..56ad7e8 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -76,32 +76,28 @@ static void remove_lock_file_on_signal(int signo)
}
/*
- * p = absolute or relative path name
+ * path = absolute or relative path name
*
- * Return a pointer into p showing the beginning of the last path name
- * element. If p is empty or the root directory ("/"), just return p.
+ * Remove the last path name element from path (leaving the preceding
+ * "/", if any). If path is empty or the root directory ("/"), set
+ * path to the empty string.
*/
-static char *last_path_elm(char *p)
+static void trim_last_path_component(struct strbuf *path)
{
- /* r starts pointing to null at the end of the string */
- char *r = strchr(p, '\0');
-
- if (r == p)
- return p; /* just return empty string */
-
- r--; /* back up to last non-null character */
+ int i = path->len;
/* back up past trailing slashes, if any */
- while (r > p && *r == '/')
- r--;
+ while (i && path->buf[i - 1] == '/')
+ i--;
/*
- * then go backwards until I hit a slash, or the beginning of
- * the string
+ * then go backwards until a slash, or the beginning of the
+ * string
*/
- while (r > p && *(r-1) != '/')
- r--;
- return r;
+ while (i && path->buf[i - 1] != '/')
+ i--;
+
+ strbuf_setlen(path, i);
}
@@ -131,14 +127,12 @@ static void resolve_symlink(struct strbuf *path)
if (is_absolute_path(link.buf))
/* absolute path simply replaces p */
strbuf_reset(path);
- else {
+ else
/*
* link is a relative path, so replace the
* last element of p with it.
*/
- char *r = last_path_elm(path->buf);
- strbuf_setlen(path, r - path->buf);
- }
+ trim_last_path_component(path);
strbuf_addbuf(path, &link);
}