strv: add calls to add two entries to an strv at once

This commit is contained in:
Lennart Poettering 2014-12-03 18:31:51 +01:00
parent 8433e33955
commit 98940a3cd9
3 changed files with 61 additions and 1 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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;
}