argv-array: add pop function
authorJeff King <peff@peff.net>
Sat, 1 Sep 2012 11:25:27 +0000 (07:25 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 3 Sep 2012 04:10:01 +0000 (21:10 -0700)
Sometimes we build a set of similar command lines, differing
only in the final arguments (e.g., "fetch --multiple"). To
use argv_array for this, you have to either push the same
set of elements repeatedly, or break the abstraction by
manually manipulating the array's internal members.

Instead, let's provide a sanctioned "pop" function to remove
elements from the end.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/technical/api-argv-array.txt
argv-array.c
argv-array.h

index 1b7d8f140c27d76cfa460c0839c44c6742110df7..1a797812fb426189b03a814498dd7019c96607b4 100644 (file)
@@ -46,6 +46,10 @@ Functions
        Format a string and push it onto the end of the array. This is a
        convenience wrapper combining `strbuf_addf` and `argv_array_push`.
 
+`argv_array_pop`::
+       Remove the final element from the array. If there are no
+       elements in the array, do nothing.
+
 `argv_array_clear`::
        Free all memory associated with the array and return it to the
        initial, empty state.
index 0b5f8898a10f16df8a6273f8960f05b670ba94bc..55e8443ff9f0d3876608047a9205ec8d38cf4033 100644 (file)
@@ -49,6 +49,15 @@ void argv_array_pushl(struct argv_array *array, ...)
        va_end(ap);
 }
 
+void argv_array_pop(struct argv_array *array)
+{
+       if (!array->argc)
+               return;
+       free((char *)array->argv[array->argc - 1]);
+       array->argv[array->argc - 1] = NULL;
+       array->argc--;
+}
+
 void argv_array_clear(struct argv_array *array)
 {
        if (array->argv != empty_argv) {
index b93a69c36cb8d391c1d7de93f75b3d54c00e60ca..f4b98660f8a98e2cecdf70285d1d76205b3f4be7 100644 (file)
@@ -16,6 +16,7 @@ void argv_array_push(struct argv_array *, const char *);
 __attribute__((format (printf,2,3)))
 void argv_array_pushf(struct argv_array *, const char *fmt, ...);
 void argv_array_pushl(struct argv_array *, ...);
+void argv_array_pop(struct argv_array *);
 void argv_array_clear(struct argv_array *);
 
 #endif /* ARGV_ARRAY_H */