]> xenbits.xensource.com Git - libvirt.git/commitdiff
virstring: Introduce virStringListAdd
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 25 Nov 2016 14:43:53 +0000 (15:43 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 6 Dec 2016 12:33:18 +0000 (13:33 +0100)
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/libvirt_private.syms
src/util/virstring.c
src/util/virstring.h
tests/virstringtest.c

index 43220e0656be4ee827979f0a0d88c382b3eb45f8..bc6588969ad5120984ecb07317e07f84f47274b5 100644 (file)
@@ -2460,6 +2460,7 @@ virStringEncodeBase64;
 virStringHasControlChars;
 virStringIsEmpty;
 virStringIsPrintable;
+virStringListAdd;
 virStringListFree;
 virStringListFreeCount;
 virStringListGetFirstWithPrefix;
index 740cf4d238fc48906594bb69b3330e7ef352a3fe..629f8ca32e0388b939340747f92185f463aed171 100644 (file)
@@ -168,6 +168,40 @@ char *virStringListJoin(const char **strings,
 }
 
 
+/**
+ * virStringListAdd:
+ * @strings: a NULL-terminated array of strings
+ * @item: string to add
+ *
+ * Creates new strings list with all strings duplicated and @item
+ * at the end of the list. Callers is responsible for freeing
+ * both @strings and returned list.
+ */
+char **
+virStringListAdd(const char **strings,
+                 const char *item)
+{
+    char **ret = NULL;
+    size_t i = virStringListLength(strings);
+
+    if (VIR_ALLOC_N(ret, i + 2) < 0)
+        goto error;
+
+    for (i = 0; strings && strings[i]; i++) {
+        if (VIR_STRDUP(ret[i], strings[i]) < 0)
+            goto error;
+    }
+
+    if (VIR_STRDUP(ret[i], item) < 0)
+        goto error;
+
+    return ret;
+ error:
+    virStringListFree(ret);
+    return NULL;
+}
+
+
 /**
  * virStringListFree:
  * @str_array: a NULL-terminated array of strings to free
index f6801fcd1484a44a4094a513cfa33ef4fc7de530..da9d35ccad6490e2464157e4ce653c10c36443dd 100644 (file)
@@ -41,6 +41,9 @@ char *virStringListJoin(const char **strings,
                         const char *delim)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
+char **virStringListAdd(const char **strings,
+                        const char *item);
+
 void virStringListFree(char **strings);
 void virStringListFreeCount(char **strings,
                             size_t count);
index a11d7c5d87055e21a970378e6caa392bbd03f1e0..43657c84c5e1366298a8041cd06b5f4424d8ea31 100644 (file)
@@ -122,6 +122,46 @@ static int testJoin(const void *args)
     return ret;
 }
 
+
+static int testAdd(const void *args)
+{
+    const struct testJoinData *data = args;
+    char **list = NULL;
+    char *got = NULL;
+    int ret = -1;
+    size_t i;
+
+    for (i = 0; data->tokens[i]; i++) {
+        char **tmp = virStringListAdd((const char **)list, data->tokens[i]);
+        if (!tmp)
+            goto cleanup;
+        virStringListFree(list);
+        list = tmp;
+        tmp = NULL;
+    }
+
+    if (!list &&
+        VIR_ALLOC(list) < 0)
+        goto cleanup;
+
+    if (!(got = virStringListJoin((const char **)list, data->delim))) {
+        VIR_DEBUG("Got no result");
+        goto cleanup;
+    }
+
+    if (STRNEQ(got, data->string)) {
+        virFilePrintf(stderr, "Mismatch '%s' vs '%s'\n", got, data->string);
+        goto cleanup;
+    }
+
+    ret = 0;
+ cleanup:
+    virStringListFree(list);
+    VIR_FREE(got);
+    return ret;
+}
+
+
 static bool fail;
 
 static const char *
@@ -594,6 +634,8 @@ mymain(void)
             ret = -1;                                                   \
         if (virTestRun("Join " #str, testJoin, &joinData) < 0)          \
             ret = -1;                                                   \
+        if (virTestRun("Add " #str, testAdd, &joinData) < 0)            \
+            ret = -1;                                                   \
     } while (0)
 
     const char *tokens1[] = { NULL };