1 #include "git-compat-util.h"
5 const char *empty_strvec
[] = { NULL
};
7 void strvec_init(struct strvec
*array
)
9 struct strvec blank
= STRVEC_INIT
;
10 memcpy(array
, &blank
, sizeof(*array
));
13 void strvec_push_nodup(struct strvec
*array
, char *value
)
15 if (array
->v
== empty_strvec
)
18 ALLOC_GROW(array
->v
, array
->nr
+ 2, array
->alloc
);
19 array
->v
[array
->nr
++] = value
;
20 array
->v
[array
->nr
] = NULL
;
23 const char *strvec_push(struct strvec
*array
, const char *value
)
25 strvec_push_nodup(array
, xstrdup(value
));
26 return array
->v
[array
->nr
- 1];
29 const char *strvec_pushf(struct strvec
*array
, const char *fmt
, ...)
32 struct strbuf v
= STRBUF_INIT
;
35 strbuf_vaddf(&v
, fmt
, ap
);
38 strvec_push_nodup(array
, strbuf_detach(&v
, NULL
));
39 return array
->v
[array
->nr
- 1];
42 void strvec_pushl(struct strvec
*array
, ...)
48 while ((arg
= va_arg(ap
, const char *)))
49 strvec_push(array
, arg
);
53 void strvec_pushv(struct strvec
*array
, const char **items
)
55 for (; *items
; items
++)
56 strvec_push(array
, *items
);
59 void strvec_splice(struct strvec
*array
, size_t idx
, size_t len
,
60 const char **replacement
, size_t replacement_len
)
62 if (idx
+ len
> array
->nr
)
63 BUG("range outside of array boundary");
64 if (replacement_len
> len
) {
65 if (array
->v
== empty_strvec
)
67 ALLOC_GROW(array
->v
, array
->nr
+ (replacement_len
- len
) + 1,
69 array
->v
[array
->nr
+ (replacement_len
- len
)] = NULL
;
71 for (size_t i
= 0; i
< len
; i
++)
72 free((char *)array
->v
[idx
+ i
]);
73 if ((replacement_len
!= len
) && array
->nr
)
74 memmove(array
->v
+ idx
+ replacement_len
, array
->v
+ idx
+ len
,
75 (array
->nr
- idx
- len
+ 1) * sizeof(char *));
76 array
->nr
+= replacement_len
- len
;
77 for (size_t i
= 0; i
< replacement_len
; i
++)
78 array
->v
[idx
+ i
] = xstrdup(replacement
[i
]);
81 const char *strvec_replace(struct strvec
*array
, size_t idx
, const char *replacement
)
85 BUG("index outside of array boundary");
86 to_free
= (char *) array
->v
[idx
];
87 array
->v
[idx
] = xstrdup(replacement
);
92 void strvec_remove(struct strvec
*array
, size_t idx
)
95 BUG("index outside of array boundary");
96 free((char *)array
->v
[idx
]);
97 memmove(array
->v
+ idx
, array
->v
+ idx
+ 1, (array
->nr
- idx
) * sizeof(char *));
101 void strvec_pop(struct strvec
*array
)
105 free((char *)array
->v
[array
->nr
- 1]);
106 array
->v
[array
->nr
- 1] = NULL
;
110 void strvec_split(struct strvec
*array
, const char *to_split
)
112 while (isspace(*to_split
))
115 const char *p
= to_split
;
120 while (*p
&& !isspace(*p
))
122 strvec_push_nodup(array
, xstrndup(to_split
, p
- to_split
));
130 void strvec_clear(struct strvec
*array
)
132 if (array
->v
!= empty_strvec
) {
133 for (size_t i
= 0; i
< array
->nr
; i
++)
134 free((char *)array
->v
[i
]);
140 const char **strvec_detach(struct strvec
*array
)
142 if (array
->v
== empty_strvec
)
143 return xcalloc(1, sizeof(const char *));
145 const char **ret
= array
->v
;