strv: add calls to add two entries to an strv at once
This commit is contained in:
parent
8433e33955
commit
98940a3cd9
|
@ -388,7 +388,7 @@ int strv_push(char ***l, char *value) {
|
|||
|
||||
n = strv_length(*l);
|
||||
|
||||
/* increase and check for overflow */
|
||||
/* Increase and check for overflow */
|
||||
m = n + 2;
|
||||
if (m < n)
|
||||
return -ENOMEM;
|
||||
|
@ -404,6 +404,34 @@ int strv_push(char ***l, char *value) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int strv_push_pair(char ***l, char *a, char *b) {
|
||||
char **c;
|
||||
unsigned n, m;
|
||||
|
||||
if (!a && !b)
|
||||
return 0;
|
||||
|
||||
n = strv_length(*l);
|
||||
|
||||
/* increase and check for overflow */
|
||||
m = n + !!a + !!b + 1;
|
||||
if (m < n)
|
||||
return -ENOMEM;
|
||||
|
||||
c = realloc_multiply(*l, sizeof(char*), m);
|
||||
if (!c)
|
||||
return -ENOMEM;
|
||||
|
||||
if (a)
|
||||
c[n++] = a;
|
||||
if (b)
|
||||
c[n++] = b;
|
||||
c[n] = NULL;
|
||||
|
||||
*l = c;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int strv_push_prepend(char ***l, char *value) {
|
||||
char **c;
|
||||
unsigned n, m, i;
|
||||
|
@ -444,6 +472,18 @@ int strv_consume(char ***l, char *value) {
|
|||
return r;
|
||||
}
|
||||
|
||||
int strv_consume_pair(char ***l, char *a, char *b) {
|
||||
int r;
|
||||
|
||||
r = strv_push_pair(l, a, b);
|
||||
if (r < 0) {
|
||||
free(a);
|
||||
free(b);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
int strv_consume_prepend(char ***l, char *value) {
|
||||
int r;
|
||||
|
||||
|
|
|
@ -42,8 +42,10 @@ int strv_extend_strv_concat(char ***a, char **b, const char *suffix);
|
|||
int strv_extend(char ***l, const char *value);
|
||||
int strv_extendf(char ***l, const char *format, ...) _printf_(2,0);
|
||||
int strv_push(char ***l, char *value);
|
||||
int strv_push_pair(char ***l, char *a, char *b);
|
||||
int strv_push_prepend(char ***l, char *value);
|
||||
int strv_consume(char ***l, char *value);
|
||||
int strv_consume_pair(char ***l, char *a, char *b);
|
||||
int strv_consume_prepend(char ***l, char *value);
|
||||
|
||||
char **strv_remove(char **l, const char *s);
|
||||
|
|
|
@ -453,6 +453,23 @@ static void test_strv_push_prepend(void) {
|
|||
assert_se(!a[5]);
|
||||
}
|
||||
|
||||
static void test_strv_push(void) {
|
||||
_cleanup_strv_free_ char **a = NULL;
|
||||
char *i, *j;
|
||||
|
||||
assert_se(i = strdup("foo"));
|
||||
assert_se(strv_push(&a, i) >= 0);
|
||||
|
||||
assert_se(i = strdup("a"));
|
||||
assert_se(j = strdup("b"));
|
||||
assert_se(strv_push_pair(&a, i, j) >= 0);
|
||||
|
||||
assert_se(streq_ptr(a[0], "foo"));
|
||||
assert_se(streq_ptr(a[1], "a"));
|
||||
assert_se(streq_ptr(a[2], "b"));
|
||||
assert_se(streq_ptr(a[3], NULL));
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
test_specifier_printf();
|
||||
test_strv_foreach();
|
||||
|
@ -501,6 +518,7 @@ int main(int argc, char *argv[]) {
|
|||
test_strv_extendf();
|
||||
test_strv_from_stdarg_alloca();
|
||||
test_strv_push_prepend();
|
||||
test_strv_push();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue