trim_last_path_component(): replace last_path_elm()
authorMichael Haggerty <mhagger@alum.mit.edu>
Wed, 1 Oct 2014 10:28:35 +0000 (12:28 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 1 Oct 2014 20:51:30 +0000 (13:51 -0700)
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>
lockfile.c
index 5f5bcfffbe25b6145f1683a989399f44880b3d5d..56ad7e8a6e072e9083516ce04fce5932a38660d8 100644 (file)
@@ -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);
        }