For parsing hex numbers Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- src/libinput-util.h | 12 +++++++-- test/test-misc.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 2 deletions(-)
diff --git a/src/libinput-util.h b/src/libinput-util.h index bf632a5c..139d6932 100644 --- a/src/libinput-util.h +++ b/src/libinput-util.h @@ -473,13 +473,15 @@ tv2us(const struct timeval *tv) } static inline bool -safe_atoi(const char *str, int *val) +safe_atoi_base(const char *str, int *val, int base) { char *endptr; long v; + assert(base == 10 || base == 16 || base == 8); + errno = 0; - v = strtol(str, &endptr, 10); + v = strtol(str, &endptr, base); if (errno > 0) return false; if (str == endptr) @@ -495,6 +497,12 @@ safe_atoi(const char *str, int *val) } static inline bool +safe_atoi(const char *str, int *val) +{ + return safe_atoi_base(str, val, 10); +} + +static inline bool safe_atod(const char *str, double *val) { char *endptr; diff --git a/test/test-misc.c b/test/test-misc.c index 2173910b..13d65144 100644 --- a/test/test-misc.c +++ b/test/test-misc.c @@ -1123,6 +1123,77 @@ START_TEST(safe_atoi_test) } END_TEST +START_TEST(safe_atoi_base_16_test) +{ + struct atoi_test tests[] = { + { "10", true, 0x10 }, + { "20", true, 0x20 }, + { "-1", true, -1 }, + { "0x10", true, 0x10 }, + { "0xff", true, 0xff }, + { "abc", true, 0xabc }, + { "-10", true, -0x10 }, + { "0x0", true, 0 }, + { "0", true, 0 }, + { "0x-99", false, 0 }, + { "0xak", false, 0 }, + { "0x", false, 0 }, + { "x10", false, 0 }, + { NULL, false, 0 } + }; + + int v; + bool success; + + for (int i = 0; tests[i].str != NULL; i++) { + v = 0xad; + success = safe_atoi_base(tests[i].str, &v, 16); + ck_assert(success == tests[i].success); + if (success) + ck_assert_int_eq(v, tests[i].val); + else + ck_assert_int_eq(v, 0xad); + } +} +END_TEST + +START_TEST(safe_atoi_base_8_test) +{ + struct atoi_test tests[] = { + { "7", true, 07 }, + { "10", true, 010 }, + { "20", true, 020 }, + { "-1", true, -1 }, + { "010", true, 010 }, + { "0ff", false, 0 }, + { "abc", false, 0}, + { "0xabc", false, 0}, + { "-10", true, -010 }, + { "0", true, 0 }, + { "00", true, 0 }, + { "0x0", false, 0 }, + { "0x-99", false, 0 }, + { "0xak", false, 0 }, + { "0x", false, 0 }, + { "x10", false, 0 }, + { NULL, false, 0 } + }; + + int v; + bool success; + + for (int i = 0; tests[i].str != NULL; i++) { + v = 0xad; + success = safe_atoi_base(tests[i].str, &v, 8); + ck_assert(success == tests[i].success); + if (success) + ck_assert_int_eq(v, tests[i].val); + else + ck_assert_int_eq(v, 0xad); + } +} +END_TEST + struct atod_test { char *str; bool success; @@ -1376,6 +1447,8 @@ litest_setup_tests_misc(void) litest_add_no_device("misc:parser", range_prop_parser); litest_add_no_device("misc:parser", palm_pressure_parser); litest_add_no_device("misc:parser", safe_atoi_test); + litest_add_no_device("misc:parser", safe_atoi_base_16_test); + litest_add_no_device("misc:parser", safe_atoi_base_8_test); litest_add_no_device("misc:parser", safe_atod_test); litest_add_no_device("misc:parser", strsplit_test); litest_add_no_device("misc:time", time_conversion); -- 2.13.5 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel