Add argv_array_detach and argv_array_free_detached
authorFlorian Achleitner <florian.achleitner.2.6.31@gmail.com>
Wed, 19 Sep 2012 15:21:18 +0000 (17:21 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sun, 7 Oct 2012 21:10:16 +0000 (14:10 -0700)
Allow detaching of ownership of the argv_array's contents and add a
function to free those detached argv_arrays later.

This makes it possible to use argv_array efficiently with the exiting
struct child_process which only contains a member char **argv.

Add to documentation.

Signed-off-by: Florian Achleitner <florian.achleitner.2.6.31@gmail.com>
Acked-by: David Michael Barr <b@rr-dav.id.au>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/technical/api-argv-array.txt
argv-array.c
argv-array.h

index 1b7d8f140c27d76cfa460c0839c44c6742110df7..6b97d6db7477fad9f2eda67e418f32e54797055a 100644 (file)
@@ -49,3 +49,11 @@ Functions
 `argv_array_clear`::
        Free all memory associated with the array and return it to the
        initial, empty state.
+
+`argv_array_detach`::
+       Detach the argv array from the `struct argv_array`, transfering
+       ownership of the allocated array and strings.
+
+`argv_array_free_detached`::
+       Free the memory allocated by a `struct argv_array` that was later
+       detached and is now no longer needed.
index 0b5f8898a10f16df8a6273f8960f05b670ba94bc..aab50d6a97c7ca76e38601c3e2438e760322f478 100644 (file)
@@ -59,3 +59,23 @@ void argv_array_clear(struct argv_array *array)
        }
        argv_array_init(array);
 }
+
+const char **argv_array_detach(struct argv_array *array, int *argc)
+{
+       const char **argv =
+               array->argv == empty_argv || array->argc == 0 ? NULL : array->argv;
+       if (argc)
+               *argc = array->argc;
+       argv_array_init(array);
+       return argv;
+}
+
+void argv_array_free_detached(const char **argv)
+{
+       if (argv) {
+               int i;
+               for (i = 0; argv[i]; i++)
+                       free((char **)argv[i]);
+               free(argv);
+       }
+}
index b93a69c36cb8d391c1d7de93f75b3d54c00e60ca..b3ef351b4456cf4212e6afa141af65f03386e796 100644 (file)
@@ -17,5 +17,7 @@ __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_clear(struct argv_array *);
+const char **argv_array_detach(struct argv_array *array, int *argc);
+void argv_array_free_detached(const char **argv);
 
 #endif /* ARGV_ARRAY_H */