]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add functions dealing with control characters in strings
authorJán Tomko <jtomko@redhat.com>
Tue, 14 Apr 2015 10:30:16 +0000 (12:30 +0200)
committerJán Tomko <jtomko@redhat.com>
Wed, 15 Apr 2015 17:25:59 +0000 (19:25 +0200)
Add virStringHasControlChars that checks if the string has
any control characters other than \t\r\n,
and virStringStripControlChars that removes them in-place.

(cherry picked from commit 2a530a3e50d9314950cff0a5790c81910b0750a9)
Signed-off-by: Ján Tomko <jtomko@redhat.com>
Conflicts:
src/libvirt_private.syms
src/util/virstring.c
src/util/virstring.h
tests/virstringtest.c
  virStringStripIPv6Brackets is not backported

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

index ce14d78bb6b8198e1d15586d6f8d2d365d6bbeb9..4bdbd1c22686289cc4b4daa10c513faf3f9d674f 100644 (file)
@@ -1992,6 +1992,7 @@ virStrdup;
 virStringArrayHasString;
 virStringFreeList;
 virStringFreeListCount;
+virStringHasControlChars;
 virStringIsEmpty;
 virStringJoin;
 virStringListLength;
@@ -2001,6 +2002,7 @@ virStringSortCompare;
 virStringSortRevCompare;
 virStringSplit;
 virStringSplitCount;
+virStringStripControlChars;
 virStrncpy;
 virStrndup;
 virStrToDouble;
index 8291617a103bf1b57dd5dc1a3cd3f4b34496873f..542c8935c8388b42b30fab26be99fad6522c37e0 100644 (file)
@@ -945,3 +945,45 @@ virStringReplace(const char *haystack,
 
     return virBufferContentAndReset(&buf);
 }
+
+
+static const char control_chars[] =
+    "\x01\x02\x03\x04\x05\x06\x07"
+    "\x08" /* \t \n */ "\x0B\x0C" /* \r */ "\x0E\x0F"
+    "\x10\x11\x12\x13\x14\x15\x16\x17"
+    "\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";
+
+bool
+virStringHasControlChars(const char *str)
+{
+    if (!str)
+        return false;
+
+    return str[strcspn(str, control_chars)] != '\0';
+}
+
+
+/**
+ * virStringStripControlChars:
+ * @str: the string to strip
+ *
+ * Modify the string in-place to remove the control characters
+ * in the interval: [0x01, 0x20)
+ */
+void
+virStringStripControlChars(char *str)
+{
+    size_t len, i, j;
+
+    if (!str)
+        return;
+
+    len = strlen(str);
+    for (i = 0, j = 0; i < len; i++) {
+        if (index(control_chars, str[i]))
+            continue;
+
+        str[j++] = str[i];
+    }
+    str[j] = '\0';
+}
index 0c87fadbb3f1dd4a416c3492ce83cb1f055488ae..f5c49ca291115dba7610660895503bc3162db50f 100644 (file)
@@ -270,4 +270,6 @@ char *virStringReplace(const char *haystack,
                        const char *newneedle)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
 
+bool virStringHasControlChars(const char *str);
+void virStringStripControlChars(char *str);
 #endif /* __VIR_STRING_H__ */
index 3d07209d8f6ad85ebca788efab9fe379ffd0849b..1052fc6b0de1ff75b36d5c95fd91683a2faeb521 100644 (file)
@@ -522,6 +522,35 @@ testVirStringFreeListCount(const void *opaque ATTRIBUTE_UNUSED)
 }
 
 
+struct testStripData {
+    const char *string;
+    const char *result;
+};
+
+static int testStripControlChars(const void *args)
+{
+    const struct testStripData *data = args;
+    int ret = -1;
+    char *res = NULL;
+
+    if (VIR_STRDUP(res, data->string) < 0)
+        goto cleanup;
+
+    virStringStripControlChars(res);
+
+    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)
 {
@@ -734,6 +763,23 @@ mymain(void)
                     NULL) < 0)
         ret = -1;
 
+
+#define TEST_STRIP_CONTROL_CHARS(str, res)                              \
+    do {                                                                \
+        struct testStripData stripData = {                              \
+            .string = str,                                              \
+            .result = res,                                              \
+        };                                                              \
+        if (virtTestRun("Strip control chars from " #str,               \
+                        testStripControlChars, &stripData) < 0)         \
+            ret = -1;                                                   \
+    } while (0)
+
+    TEST_STRIP_CONTROL_CHARS(NULL, NULL);
+    TEST_STRIP_CONTROL_CHARS("\nhello \r hello\t", "\nhello \r hello\t");
+    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");
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }