2 #include "argv-array.h"
5 const char *empty_argv
[] = { NULL
};
7 void argv_array_init(struct argv_array
*array
)
9 array
->argv
= empty_argv
;
14 static void argv_array_push_nodup(struct argv_array
*array
, const char *value
)
16 if (array
->argv
== empty_argv
)
19 ALLOC_GROW(array
->argv
, array
->argc
+ 2, array
->alloc
);
20 array
->argv
[array
->argc
++] = value
;
21 array
->argv
[array
->argc
] = NULL
;
24 void argv_array_push(struct argv_array
*array
, const char *value
)
26 argv_array_push_nodup(array
, xstrdup(value
));
29 void argv_array_pushf(struct argv_array
*array
, const char *fmt
, ...)
32 struct strbuf v
= STRBUF_INIT
;
35 strbuf_vaddf(&v
, fmt
, ap
);
38 argv_array_push_nodup(array
, strbuf_detach(&v
, NULL
));
41 void argv_array_pushl(struct argv_array
*array
, ...)
47 while((arg
= va_arg(ap
, const char *)))
48 argv_array_push(array
, arg
);
52 void argv_array_pushv(struct argv_array
*array
, const char **argv
)
55 argv_array_push(array
, *argv
);
58 void argv_array_pop(struct argv_array
*array
)
62 free((char *)array
->argv
[array
->argc
- 1]);
63 array
->argv
[array
->argc
- 1] = NULL
;
67 void argv_array_split(struct argv_array
*array
, const char *to_split
)
69 while (isspace(*to_split
))
72 const char *p
= to_split
;
77 while (*p
&& !isspace(*p
))
79 argv_array_push_nodup(array
, xstrndup(to_split
, p
- to_split
));
87 void argv_array_clear(struct argv_array
*array
)
89 if (array
->argv
!= empty_argv
) {
91 for (i
= 0; i
< array
->argc
; i
++)
92 free((char *)array
->argv
[i
]);
95 argv_array_init(array
);
98 const char **argv_array_detach(struct argv_array
*array
)
100 if (array
->argv
== empty_argv
)
101 return xcalloc(1, sizeof(const char *));
103 const char **ret
= array
->argv
;
104 argv_array_init(array
);