File 0001-spa-add-a-new-string-helper-with-spa_strtol.patch of Package pipewire.30043

From 5aa15d10e950aaed3453027853c0908934d520c1 Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Fri, 14 May 2021 10:20:09 +1000
Subject: [PATCH] spa: add a new string helper with spa_strtol()

Most of the time when we convert a string to an integer we only care about
success. Let's wrap this with a helper function that sets the value to the
result and returns true on success.
---
 spa/include/spa/utils/string.h | 67 ++++++++++++++++++++++++++++++++++
 spa/tests/test-utils.c         | 49 +++++++++++++++++++++++++
 2 files changed, 116 insertions(+)
 create mode 100644 spa/include/spa/utils/string.h

diff --git a/spa/include/spa/utils/string.h b/spa/include/spa/utils/string.h
new file mode 100644
index 0000000000..eddffe9486
--- /dev/null
+++ b/spa/include/spa/utils/string.h
@@ -0,0 +1,67 @@
+/* Simple Plugin API
+ *
+ * Copyright © 2021 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef SPA_UTILS_STRING_H
+#define SPA_UTILS_STRING_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdbool.h>
+#include <errno.h>
+
+/**
+ * Convert \a str to an int32_t with the given \a base and store the
+ * result in \a val.
+ *
+ * On failure, the value of \a val is undefined.
+ *
+ * \return true on success, false otherwise
+ */
+static inline bool spa_atoi32(const char *str, int32_t *val, int base)
+{
+	char *endptr;
+	long v;
+
+	if (!str || *str =='\0')
+		return false;
+
+	errno = 0;
+	v = strtol(str, &endptr, base);
+	if (errno != 0 || *endptr != '\0')
+		return false;
+
+	if (v != (int32_t)v)
+		return false;
+
+	*val = v;
+	return true;
+}
+
+#ifdef __cplusplus
+}  /* extern "C" */
+#endif
+
+#endif /* SPA_UTILS_STRING_H */
diff --git a/spa/tests/test-utils.c b/spa/tests/test-utils.c
index 726e1209eb..fdf75e6786 100644
--- a/spa/tests/test-utils.c
+++ b/spa/tests/test-utils.c
@@ -28,6 +28,7 @@
 #include <spa/utils/list.h>
 #include <spa/utils/hook.h>
 #include <spa/utils/ringbuffer.h>
+#include <spa/utils/string.h>
 #include <spa/utils/type.h>
 
 static void test_abi(void)
@@ -429,6 +430,53 @@ static void test_ringbuffer(void)
     spa_assert(!memcmp(buffer, " !!!o pipewire rocks", 20));
 }
 
+static void test_strtol(void)
+{
+	int32_t v;
+
+	spa_assert(spa_atoi32("0", &v, 0) && v == 0);
+	spa_assert(spa_atoi32("0", &v, 16) && v == 0);
+	spa_assert(spa_atoi32("0", &v, 32) && v == 0);
+	spa_assert(spa_atoi32("-1", &v, 0) && v == -1);
+	spa_assert(spa_atoi32("-1234", &v, 0) && v == -1234);
+	spa_assert(spa_atoi32("-2147483648", &v, 0) && v == -2147483648);
+	spa_assert(spa_atoi32("+1", &v, 0) && v == 1);
+	spa_assert(spa_atoi32("+1234", &v, 0) && v == 1234);
+	spa_assert(spa_atoi32("+2147483647", &v, 0) && v == 2147483647);
+	spa_assert(spa_atoi32("65535", &v, 0) && v == 0xffff);
+	spa_assert(spa_atoi32("65535", &v, 10) && v == 0xffff);
+	spa_assert(spa_atoi32("65535", &v, 16) && v == 0x65535);
+	spa_assert(spa_atoi32("0xff", &v, 0) && v == 0xff);
+	spa_assert(spa_atoi32("0xff", &v, 16) && v == 0xff);
+
+	v = 0xabcd;
+	spa_assert(!spa_atoi32("0xff", &v, 10) && v == 0xabcd);
+	spa_assert(!spa_atoi32("fabc", &v, 10) && v == 0xabcd);
+	spa_assert(!spa_atoi32("fabc", &v, 0) && v == 0xabcd);
+
+	spa_assert(!spa_atoi32("124bogus", &v, 0) && v == 0xabcd);
+	spa_assert(!spa_atoi32("124bogus", &v, 10) && v == 0xabcd);
+	spa_assert(!spa_atoi32("124bogus", &v, 16) && v == 0xabcd);
+	spa_assert(!spa_atoi32("0xbogus", &v, 0) && v == 0xabcd);
+	spa_assert(!spa_atoi32("bogus", &v, 10) && v == 0xabcd);
+	spa_assert(!spa_atoi32("bogus", &v, 16) && v == 0xabcd);
+	spa_assert(!spa_atoi32("", &v, 0) && v == 0xabcd);
+	spa_assert(!spa_atoi32("", &v, 10) && v == 0xabcd);
+	spa_assert(!spa_atoi32("", &v, 16) && v == 0xabcd);
+	spa_assert(!spa_atoi32("  ", &v, 0) && v == 0xabcd);
+	spa_assert(!spa_atoi32(" ", &v, 0) && v == 0xabcd);
+
+	spa_assert(!spa_atoi32("-2147483649", &v, 0) && v == 0xabcd);
+	spa_assert(!spa_atoi32("2147483648", &v, 0) && v == 0xabcd);
+	spa_assert(!spa_atoi32("9223372036854775807", &v, 0) && v == 0xabcd);
+	spa_assert(!spa_atoi32("-9223372036854775808", &v, 0) && v == 0xabcd);
+	spa_assert(!spa_atoi32("9223372036854775808999", &v, 0) && v == 0xabcd);
+
+	spa_assert(!spa_atoi32(NULL, &v, 0) && v == 0xabcd);
+	spa_assert(!spa_atoi32(NULL, &v, 10) && v == 0xabcd);
+	spa_assert(!spa_atoi32(NULL, &v, 16) && v == 0xabcd);
+}
+
 int main(int argc, char *argv[])
 {
     test_abi();
@@ -438,5 +486,6 @@ int main(int argc, char *argv[])
     test_list();
     test_hook();
     test_ringbuffer();
+    test_strtol();
     return 0;
 }
-- 
GitLab

openSUSE Build Service is sponsored by