]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add virStringFilterChars() string utility
authorCédric Bosdonnat <cbosdonnat@suse.com>
Mon, 18 Dec 2017 14:46:53 +0000 (15:46 +0100)
committerCédric Bosdonnat <cbosdonnat@suse.com>
Wed, 3 Jan 2018 09:58:16 +0000 (10:58 +0100)
Add a function to filter a string based on a list of valid characters.

src/libvirt_private.syms
src/util/virstring.c
src/util/virstring.h
tests/virstringtest.c

index 18d0f2adfef281f695572edc5d380b5f999a9932..6662c8dac12de1832e3606e5013f9f71e9547d7e 100644 (file)
@@ -2755,6 +2755,7 @@ virStrcpy;
 virStrdup;
 virStringBufferIsPrintable;
 virStringEncodeBase64;
+virStringFilterChars;
 virStringHasChars;
 virStringHasControlChars;
 virStringIsEmpty;
index 0cb06bdc9d0d0a02ddaa89413b7a3d5ca63c1636..1c58df9150cbc9a425d5d2ae1055af66306c93b2 100644 (file)
@@ -1293,6 +1293,30 @@ virStringStripControlChars(char *str)
     str[j] = '\0';
 }
 
+/**
+ * virStringFilterChars:
+ * @str: the string to strip
+ * @valid: the valid characters for the string
+ *
+ * Modify the string in-place to remove the characters that aren't
+ * in the list of valid ones.
+ */
+void
+virStringFilterChars(char *str, const char *valid)
+{
+    size_t len, i, j;
+
+    if (!str)
+        return;
+
+    len = strlen(str);
+    for (i = 0, j = 0; i < len; i++) {
+        if (strchr(valid, str[i]))
+            str[j++] = str[i];
+    }
+    str[j] = '\0';
+}
+
 /**
  * virStringToUpper:
  * @str: string to capitalize
index b19abaf9fac6e57a1017f3b02937384f51082ceb..8af054bce7030f70929d3dfe664f3ad843c74dbe 100644 (file)
@@ -293,6 +293,7 @@ bool virStringHasChars(const char *str,
                        const char *chars);
 bool virStringHasControlChars(const char *str);
 void virStringStripControlChars(char *str);
+void virStringFilterChars(char *str, const char *valid);
 
 bool virStringIsPrintable(const char *str);
 bool virStringBufferIsPrintable(const uint8_t *buf, size_t buflen);
index 320f7a3983b8483fedd8d75b750585838c254247..e8518ede18ca99702cce0bf36e6affedd3b91f0d 100644 (file)
@@ -767,6 +767,36 @@ static int testStripControlChars(const void *args)
     return ret;
 }
 
+struct testFilterData {
+    const char *string;
+    const char *valid;
+    const char *result;
+};
+
+static int testFilterChars(const void *args)
+{
+    const struct testFilterData *data = args;
+    int ret = -1;
+    char *res = NULL;
+
+    if (VIR_STRDUP(res, data->string) < 0)
+        goto cleanup;
+
+    virStringFilterChars(res, data->valid);
+
+    if (STRNEQ_NULLABLE(res, data->result)) {
+        fprintf(stderr, "Returned '%s', expected '%s'\n",
+                NULLSTR(res), NULLSTR(data->result));
+        goto cleanup;
+    }
+
+    ret = 0;
+
+ cleanup:
+    VIR_FREE(res);
+    return ret;
+}
+
 static int
 mymain(void)
 {
@@ -1085,6 +1115,22 @@ mymain(void)
     TEST_STRIP_CONTROL_CHARS("\x01H\x02" "E\x03L\x04L\x05O", "HELLO");
     TEST_STRIP_CONTROL_CHARS("\x01\x02\x03\x04HELL\x05O", "HELLO");
     TEST_STRIP_CONTROL_CHARS("\nhello \x01\x07hello\t", "\nhello hello\t");
+
+#define TEST_FILTER_CHARS(str, filter, res) \
+    do { \
+        struct testFilterData filterData = { \
+            .string = str,  \
+            .valid = filter, \
+            .result = res,  \
+        }; \
+        if (virTestRun("Filter chars from " #str, \
+                       testFilterChars, &filterData) < 0) \
+            ret = -1; \
+    } while (0)
+
+    TEST_FILTER_CHARS(NULL, NULL, NULL);
+    TEST_FILTER_CHARS("hello 123 hello", "helo", "hellohello");
+
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }