summaryrefslogtreecommitdiff
path: root/argv-array.c
diff options
context:
space:
mode:
authorJonathan Maw <jonathan.maw@codethink.co.uk>2013-09-27 17:19:40 +0000
committerJonathan Maw <jonathan.maw@codethink.co.uk>2013-09-27 17:19:40 +0000
commit7bf8e474d15414eda8520ba5258511d845ca6061 (patch)
tree417d6cfc8946fce8e2f87fdf3ec964036abd495c /argv-array.c
parent45d74c4b0fe38218b4569a90da7102cf48d616c2 (diff)
parente230c568c4b9a991e3175e5f65171a566fd8e39c (diff)
downloadgit-7bf8e474d15414eda8520ba5258511d845ca6061.tar.gz
Merge tag 'v1.8.4' into baserock/morph
Git 1.8.4
Diffstat (limited to 'argv-array.c')
-rw-r--r--argv-array.c45
1 files changed, 42 insertions, 3 deletions
diff --git a/argv-array.c b/argv-array.c
index a4e04201e6..9e960d549c 100644
--- a/argv-array.c
+++ b/argv-array.c
@@ -2,8 +2,7 @@
#include "argv-array.h"
#include "strbuf.h"
-static const char *empty_argv_storage = NULL;
-const char **empty_argv = &empty_argv_storage;
+const char *empty_argv[] = { NULL };
void argv_array_init(struct argv_array *array)
{
@@ -39,13 +38,53 @@ void argv_array_pushf(struct argv_array *array, const char *fmt, ...)
argv_array_push_nodup(array, strbuf_detach(&v, NULL));
}
+void argv_array_pushl(struct argv_array *array, ...)
+{
+ va_list ap;
+ const char *arg;
+
+ va_start(ap, array);
+ while((arg = va_arg(ap, const char *)))
+ argv_array_push(array, arg);
+ 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) {
int i;
for (i = 0; i < array->argc; i++)
- free((char **)array->argv[i]);
+ free((char *)array->argv[i]);
free(array->argv);
}
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);
+ }
+}