diff options
author | Jeff King <peff@peff.net> | 2011-09-13 17:57:57 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-09-14 11:56:36 -0700 |
commit | c1189caeaf726e6c16c8bca7da8bf0b243da478d (patch) | |
tree | 8d8feeeef2e8584c11875da8dde2d04f334cb56b /argv-array.h | |
parent | 7878b07c0d86d05fa505f2464557c69addcc2c05 (diff) | |
download | git-c1189caeaf726e6c16c8bca7da8bf0b243da478d.tar.gz git-c1189caeaf726e6c16c8bca7da8bf0b243da478d.tar.xz |
refactor argv_array into generic code
The submodule code recently grew generic code to build a
dynamic argv array. Many other parts of the code can reuse
this, too, so let's make it generically available.
There are two enhancements not found in the original code:
1. We now handle the NULL-termination invariant properly,
even when no strings have been pushed (before, you
could have an empty, NULL argv). This was not a problem
for the submodule code, which always pushed at least
one argument, but was not sufficiently safe for
generic code.
2. There is a formatted variant of the "push" function.
This is a convenience function which was not needed by
the submodule code, but will make it easier to port
other users to the new code.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'argv-array.h')
-rw-r--r-- | argv-array.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/argv-array.h b/argv-array.h new file mode 100644 index 000000000..74dd2b1bc --- /dev/null +++ b/argv-array.h @@ -0,0 +1,20 @@ +#ifndef ARGV_ARRAY_H +#define ARGV_ARRAY_H + +extern const char **empty_argv; + +struct argv_array { + const char **argv; + int argc; + int alloc; +}; + +#define ARGV_ARRAY_INIT { empty_argv, 0, 0 } + +void argv_array_init(struct argv_array *); +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_clear(struct argv_array *); + +#endif /* ARGV_ARRAY_H */ |