🌐 AI搜索 & 代理 主页
blob: 61a76ce6cb920f33744e82111c800da8439ed975 [file] [log] [blame]
Jeff Kingc1189ca2011-09-13 21:57:571#include "cache.h"
Jeff Kingdbbcd442020-07-28 20:23:392#include "strvec.h"
Jeff Kingc1189ca2011-09-13 21:57:573#include "strbuf.h"
4
Jeff King873cd282020-07-28 20:23:255const char *empty_strvec[] = { NULL };
Jeff Kingc1189ca2011-09-13 21:57:576
Jeff King873cd282020-07-28 20:23:257void strvec_init(struct strvec *array)
Jeff Kingc1189ca2011-09-13 21:57:578{
Ævar Arnfjörð Bjarmason5726a6b2021-07-01 10:51:269 struct strvec blank = STRVEC_INIT;
10 memcpy(array, &blank, sizeof(*array));
Jeff Kingc1189ca2011-09-13 21:57:5711}
12
Jeff King873cd282020-07-28 20:23:2513static void strvec_push_nodup(struct strvec *array, const char *value)
Jeff Kingc1189ca2011-09-13 21:57:5714{
Jeff Kingd70a9eb2020-07-29 00:37:2015 if (array->v == empty_strvec)
16 array->v = NULL;
Jeff Kingc1189ca2011-09-13 21:57:5717
Jeff Kingd70a9eb2020-07-29 00:37:2018 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 21:57:5721}
22
Jeff King873cd282020-07-28 20:23:2523const char *strvec_push(struct strvec *array, const char *value)
Jeff Kingc1189ca2011-09-13 21:57:5724{
Jeff King873cd282020-07-28 20:23:2525 strvec_push_nodup(array, xstrdup(value));
Jeff Kingd70a9eb2020-07-29 00:37:2026 return array->v[array->nr - 1];
Jeff Kingc1189ca2011-09-13 21:57:5727}
28
Jeff King873cd282020-07-28 20:23:2529const char *strvec_pushf(struct strvec *array, const char *fmt, ...)
Jeff Kingc1189ca2011-09-13 21:57:5730{
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 20:23:2538 strvec_push_nodup(array, strbuf_detach(&v, NULL));
Jeff Kingd70a9eb2020-07-29 00:37:2039 return array->v[array->nr - 1];
Jeff Kingc1189ca2011-09-13 21:57:5740}
41
Jeff King873cd282020-07-28 20:23:2542void strvec_pushl(struct strvec *array, ...)
Jeff Kingd15bbe12012-04-18 21:10:0543{
44 va_list ap;
45 const char *arg;
46
47 va_start(ap, array);
Denton Liu828e8292019-11-19 23:55:2948 while ((arg = va_arg(ap, const char *)))
Jeff King873cd282020-07-28 20:23:2549 strvec_push(array, arg);
Jeff Kingd15bbe12012-04-18 21:10:0550 va_end(ap);
51}
52
Jeff Kingd70a9eb2020-07-29 00:37:2053void strvec_pushv(struct strvec *array, const char **items)
Paul Tan85b34322015-06-14 08:41:5054{
Jeff Kingd70a9eb2020-07-29 00:37:2055 for (; *items; items++)
56 strvec_push(array, *items);
Paul Tan85b34322015-06-14 08:41:5057}
58
Jeff King873cd282020-07-28 20:23:2559void strvec_pop(struct strvec *array)
Jeff Kingfe4a0a22012-09-01 11:25:2760{
Jeff Kingd70a9eb2020-07-29 00:37:2061 if (!array->nr)
Jeff Kingfe4a0a22012-09-01 11:25:2762 return;
Jeff Kingd70a9eb2020-07-29 00:37:2063 free((char *)array->v[array->nr - 1]);
64 array->v[array->nr - 1] = NULL;
65 array->nr--;
Jeff Kingfe4a0a22012-09-01 11:25:2766}
67
Jeff King873cd282020-07-28 20:23:2568void strvec_split(struct strvec *array, const char *to_split)
Johannes Schindelinc5aa6db2018-04-25 09:53:5769{
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 20:23:2580 strvec_push_nodup(array, xstrndup(to_split, p - to_split));
Johannes Schindelinc5aa6db2018-04-25 09:53:5781
82 while (isspace(*p))
83 p++;
84 to_split = p;
85 }
86}
87
Jeff King873cd282020-07-28 20:23:2588void strvec_clear(struct strvec *array)
Jeff Kingc1189ca2011-09-13 21:57:5789{
Jeff Kingd70a9eb2020-07-29 00:37:2090 if (array->v != empty_strvec) {
Jeff Kingc1189ca2011-09-13 21:57:5791 int i;
Jeff Kingd70a9eb2020-07-29 00:37:2092 for (i = 0; i < array->nr; i++)
93 free((char *)array->v[i]);
94 free(array->v);
Jeff Kingc1189ca2011-09-13 21:57:5795 }
Jeff King873cd282020-07-28 20:23:2596 strvec_init(array);
Jeff Kingc1189ca2011-09-13 21:57:5797}
Jeff Kingb9926572016-02-22 22:44:1598
Jeff King873cd282020-07-28 20:23:2599const char **strvec_detach(struct strvec *array)
Jeff Kingb9926572016-02-22 22:44:15100{
Jeff Kingd70a9eb2020-07-29 00:37:20101 if (array->v == empty_strvec)
Jeff Kingb9926572016-02-22 22:44:15102 return xcalloc(1, sizeof(const char *));
103 else {
Jeff Kingd70a9eb2020-07-29 00:37:20104 const char **ret = array->v;
Jeff King873cd282020-07-28 20:23:25105 strvec_init(array);
Jeff Kingb9926572016-02-22 22:44:15106 return ret;
107 }
108}