[PATCH libinput 5/8] Add a atoi_safe helper for basic string conversions
Peter Hutterer
peter.hutterer at who-t.net
Tue Dec 1 17:46:29 PST 2015
Does what you expect, and returns false on errors.
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
src/libinput-util.h | 23 +++++++++++++++++++++++
test/misc.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/src/libinput-util.h b/src/libinput-util.h
index 53fe85f..04a454f 100644
--- a/src/libinput-util.h
+++ b/src/libinput-util.h
@@ -26,6 +26,7 @@
#define LIBINPUT_UTIL_H
#include <unistd.h>
+#include <limits.h>
#include <math.h>
#include <stdarg.h>
#include <stdbool.h>
@@ -352,4 +353,26 @@ us2ms(uint64_t us)
return (uint32_t)(us / 1000);
}
+static inline bool
+atoi_safe(const char *str, int *val)
+{
+ char *endptr;
+ long v;
+
+ if (!str)
+ return false;
+
+ v = strtol(str, &endptr, 0);
+
+ if (str == endptr || *endptr != '\0')
+ return false;
+
+ if (v > INT_MAX || v < INT_MIN)
+ return false;
+
+ *val = v;
+
+ return true;
+}
+
#endif /* LIBINPUT_UTIL_H */
diff --git a/test/misc.c b/test/misc.c
index d880496..07cc21e 100644
--- a/test/misc.c
+++ b/test/misc.c
@@ -772,6 +772,46 @@ START_TEST(dimension_prop_parser)
}
END_TEST
+START_TEST(atoi_safe_test)
+{
+ struct test_case {
+ const char *str;
+ bool success;
+ int value;
+ } tests[] = {
+ { "0", true, 0 },
+ { "-1", true, -1 },
+ { "1", true, 1 },
+ { "0xffff", true, 0xffff },
+ { "077", true, 077 },
+ { "abc", false, 0 },
+ { "-1a", false, 0 },
+ { "b-1", false, 0 },
+ { "0xffffffffffffffff", false, 0 },
+ { "0xffffffff", false, 0 },
+ { NULL, false, 0 },
+ };
+ struct test_case *t = tests;
+ int val;
+ bool success;
+
+ while (t->str) {
+ val = 0x54;
+
+ success = atoi_safe(t->str, &val);
+ ck_assert_int_eq(success, t->success);
+ if (success)
+ ck_assert_int_eq(val, t->value);
+ else
+ ck_assert_int_eq(val, 0x54);
+ t++;
+ }
+
+ success = atoi_safe(NULL, &val);
+ ck_assert_int_eq(success, false);
+}
+END_TEST
+
START_TEST(time_conversion)
{
ck_assert_int_eq(us(10), 10);
@@ -793,7 +833,6 @@ litest_setup_tests(void)
litest_add_for_device("events:conversion", event_conversion_touch, LITEST_WACOM_TOUCH);
litest_add_for_device("events:conversion", event_conversion_gesture, LITEST_BCM5974);
litest_add_for_device("events:conversion", event_conversion_tablet, LITEST_WACOM_CINTIQ);
- litest_add_no_device("bitfield_helpers", bitfield_helpers);
litest_add_no_device("context:refcount", context_ref_counting);
litest_add_no_device("config:status string", config_status_string);
@@ -805,4 +844,6 @@ litest_setup_tests(void)
litest_add_no_device("misc:parser", trackpoint_accel_parser);
litest_add_no_device("misc:parser", dimension_prop_parser);
litest_add_no_device("misc:time", time_conversion);
+ litest_add_no_device("misc:helpers", bitfield_helpers);
+ litest_add_no_device("misc:helpers", atoi_safe_test);
}
--
2.5.0
More information about the wayland-devel
mailing list