d70a9eb611
The "argc" and "argv" names made sense when the struct was argv_array, but now they're just confusing. Let's rename them to "nr" (which we use for counts elsewhere) and "v" (which is rather terse, but reads well when combined with typical variable names like "args.v"). Note that we have to update all of the callers immediately. Playing tricks with the preprocessor is hard here, because we wouldn't want to rewrite unrelated tokens. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
110 lines
2.0 KiB
C
110 lines
2.0 KiB
C
#include "cache.h"
|
|
#include "strvec.h"
|
|
#include "strbuf.h"
|
|
|
|
const char *empty_strvec[] = { NULL };
|
|
|
|
void strvec_init(struct strvec *array)
|
|
{
|
|
array->v = empty_strvec;
|
|
array->nr = 0;
|
|
array->alloc = 0;
|
|
}
|
|
|
|
static void strvec_push_nodup(struct strvec *array, const char *value)
|
|
{
|
|
if (array->v == empty_strvec)
|
|
array->v = NULL;
|
|
|
|
ALLOC_GROW(array->v, array->nr + 2, array->alloc);
|
|
array->v[array->nr++] = value;
|
|
array->v[array->nr] = NULL;
|
|
}
|
|
|
|
const char *strvec_push(struct strvec *array, const char *value)
|
|
{
|
|
strvec_push_nodup(array, xstrdup(value));
|
|
return array->v[array->nr - 1];
|
|
}
|
|
|
|
const char *strvec_pushf(struct strvec *array, const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
struct strbuf v = STRBUF_INIT;
|
|
|
|
va_start(ap, fmt);
|
|
strbuf_vaddf(&v, fmt, ap);
|
|
va_end(ap);
|
|
|
|
strvec_push_nodup(array, strbuf_detach(&v, NULL));
|
|
return array->v[array->nr - 1];
|
|
}
|
|
|
|
void strvec_pushl(struct strvec *array, ...)
|
|
{
|
|
va_list ap;
|
|
const char *arg;
|
|
|
|
va_start(ap, array);
|
|
while ((arg = va_arg(ap, const char *)))
|
|
strvec_push(array, arg);
|
|
va_end(ap);
|
|
}
|
|
|
|
void strvec_pushv(struct strvec *array, const char **items)
|
|
{
|
|
for (; *items; items++)
|
|
strvec_push(array, *items);
|
|
}
|
|
|
|
void strvec_pop(struct strvec *array)
|
|
{
|
|
if (!array->nr)
|
|
return;
|
|
free((char *)array->v[array->nr - 1]);
|
|
array->v[array->nr - 1] = NULL;
|
|
array->nr--;
|
|
}
|
|
|
|
void strvec_split(struct strvec *array, const char *to_split)
|
|
{
|
|
while (isspace(*to_split))
|
|
to_split++;
|
|
for (;;) {
|
|
const char *p = to_split;
|
|
|
|
if (!*p)
|
|
break;
|
|
|
|
while (*p && !isspace(*p))
|
|
p++;
|
|
strvec_push_nodup(array, xstrndup(to_split, p - to_split));
|
|
|
|
while (isspace(*p))
|
|
p++;
|
|
to_split = p;
|
|
}
|
|
}
|
|
|
|
void strvec_clear(struct strvec *array)
|
|
{
|
|
if (array->v != empty_strvec) {
|
|
int i;
|
|
for (i = 0; i < array->nr; i++)
|
|
free((char *)array->v[i]);
|
|
free(array->v);
|
|
}
|
|
strvec_init(array);
|
|
}
|
|
|
|
const char **strvec_detach(struct strvec *array)
|
|
{
|
|
if (array->v == empty_strvec)
|
|
return xcalloc(1, sizeof(const char *));
|
|
else {
|
|
const char **ret = array->v;
|
|
strvec_init(array);
|
|
return ret;
|
|
}
|
|
}
|