blob: 61a76ce6cb920f33744e82111c800da8439ed975 [file] [log] [blame]
Jeff Kingc1189ca2011-09-13 17:57:57 -04001#include "cache.h"
Jeff Kingdbbcd442020-07-28 16:23:39 -04002#include "strvec.h"
Jeff Kingc1189ca2011-09-13 17:57:57 -04003#include "strbuf.h"
4
Jeff King873cd282020-07-28 16:23:25 -04005const char *empty_strvec[] = { NULL };
Jeff Kingc1189ca2011-09-13 17:57:57 -04006
Jeff King873cd282020-07-28 16:23:25 -04007void strvec_init(struct strvec *array)
Jeff Kingc1189ca2011-09-13 17:57:57 -04008{
Ævar Arnfjörð Bjarmason5726a6b2021-07-01 12:51:26 +02009 struct strvec blank = STRVEC_INIT;
10 memcpy(array, &blank, sizeof(*array));
Jeff Kingc1189ca2011-09-13 17:57:57 -040011}
12
Jeff King873cd282020-07-28 16:23:25 -040013static void strvec_push_nodup(struct strvec *array, const char *value)
Jeff Kingc1189ca2011-09-13 17:57:57 -040014{
Jeff Kingd70a9eb2020-07-28 20:37:20 -040015 if (array->v == empty_strvec)
16 array->v = NULL;
Jeff Kingc1189ca2011-09-13 17:57:57 -040017
Jeff Kingd70a9eb2020-07-28 20:37:20 -040018 ALLOC_GROW(array->v, array->nr + 2, array->alloc);
19 array->v[array->nr++] = value;
20 array->v[array->nr] = NULL;
Jeff Kingc1189ca2011-09-13 17:57:57 -040021}
22
Jeff King873cd282020-07-28 16:23:25 -040023const char *strvec_push(struct strvec *array, const char *value)
Jeff Kingc1189ca2011-09-13 17:57:57 -040024{
Jeff King873cd282020-07-28 16:23:25 -040025 strvec_push_nodup(array, xstrdup(value));
Jeff Kingd70a9eb2020-07-28 20:37:20 -040026 return array->v[array->nr - 1];
Jeff Kingc1189ca2011-09-13 17:57:57 -040027}
28
Jeff King873cd282020-07-28 16:23:25 -040029const char *strvec_pushf(struct strvec *array, const char *fmt, ...)
Jeff Kingc1189ca2011-09-13 17:57:57 -040030{
31 va_list ap;
32 struct strbuf v = STRBUF_INIT;
33
34 va_start(ap, fmt);
35 strbuf_vaddf(&v, fmt, ap);
36 va_end(ap);
37
Jeff King873cd282020-07-28 16:23:25 -040038 strvec_push_nodup(array, strbuf_detach(&v, NULL));
Jeff Kingd70a9eb2020-07-28 20:37:20 -040039 return array->v[array->nr - 1];
Jeff Kingc1189ca2011-09-13 17:57:57 -040040}
41
Jeff King873cd282020-07-28 16:23:25 -040042void strvec_pushl(struct strvec *array, ...)
Jeff Kingd15bbe12012-04-18 14:10:05 -070043{
44 va_list ap;
45 const char *arg;
46
47 va_start(ap, array);
Denton Liu828e8292019-11-19 15:55:29 -080048 while ((arg = va_arg(ap, const char *)))
Jeff King873cd282020-07-28 16:23:25 -040049 strvec_push(array, arg);
Jeff Kingd15bbe12012-04-18 14:10:05 -070050 va_end(ap);
51}
52
Jeff Kingd70a9eb2020-07-28 20:37:20 -040053void strvec_pushv(struct strvec *array, const char **items)
Paul Tan85b34322015-06-14 16:41:50 +080054{
Jeff Kingd70a9eb2020-07-28 20:37:20 -040055 for (; *items; items++)
56 strvec_push(array, *items);
Paul Tan85b34322015-06-14 16:41:50 +080057}
58
Jeff King873cd282020-07-28 16:23:25 -040059void strvec_pop(struct strvec *array)
Jeff Kingfe4a0a22012-09-01 07:25:27 -040060{
Jeff Kingd70a9eb2020-07-28 20:37:20 -040061 if (!array->nr)
Jeff Kingfe4a0a22012-09-01 07:25:27 -040062 return;
Jeff Kingd70a9eb2020-07-28 20:37:20 -040063 free((char *)array->v[array->nr - 1]);
64 array->v[array->nr - 1] = NULL;
65 array->nr--;
Jeff Kingfe4a0a22012-09-01 07:25:27 -040066}
67
Jeff King873cd282020-07-28 16:23:25 -040068void strvec_split(struct strvec *array, const char *to_split)
Johannes Schindelinc5aa6db2018-04-25 11:53:57 +020069{
70 while (isspace(*to_split))
71 to_split++;
72 for (;;) {
73 const char *p = to_split;
74
75 if (!*p)
76 break;
77
78 while (*p && !isspace(*p))
79 p++;
Jeff King873cd282020-07-28 16:23:25 -040080 strvec_push_nodup(array, xstrndup(to_split, p - to_split));
Johannes Schindelinc5aa6db2018-04-25 11:53:57 +020081
82 while (isspace(*p))
83 p++;
84 to_split = p;
85 }
86}
87
Jeff King873cd282020-07-28 16:23:25 -040088void strvec_clear(struct strvec *array)
Jeff Kingc1189ca2011-09-13 17:57:57 -040089{
Jeff Kingd70a9eb2020-07-28 20:37:20 -040090 if (array->v != empty_strvec) {
Jeff Kingc1189ca2011-09-13 17:57:57 -040091 int i;
Jeff Kingd70a9eb2020-07-28 20:37:20 -040092 for (i = 0; i < array->nr; i++)
93 free((char *)array->v[i]);
94 free(array->v);
Jeff Kingc1189ca2011-09-13 17:57:57 -040095 }
Jeff King873cd282020-07-28 16:23:25 -040096 strvec_init(array);
Jeff Kingc1189ca2011-09-13 17:57:57 -040097}
Jeff Kingb9926572016-02-22 17:44:15 -050098
Jeff King873cd282020-07-28 16:23:25 -040099const char **strvec_detach(struct strvec *array)
Jeff Kingb9926572016-02-22 17:44:15 -0500100{
Jeff Kingd70a9eb2020-07-28 20:37:20 -0400101 if (array->v == empty_strvec)
Jeff Kingb9926572016-02-22 17:44:15 -0500102 return xcalloc(1, sizeof(const char *));
103 else {
Jeff Kingd70a9eb2020-07-28 20:37:20 -0400104 const char **ret = array->v;
Jeff King873cd282020-07-28 16:23:25 -0400105 strvec_init(array);
Jeff Kingb9926572016-02-22 17:44:15 -0500106 return ret;
107 }
108}