int libevdev_event_value_from_name(unsigned int type, unsigned int code,
const char *name);
+/**
+ * @ingroup misc
+ *
+ * Look up an event type for a event code name. For example, the name
+ * "ABS_Y" returns EV_ABS. For the lookup to succeed, the name must be
+ * unique, which is the case for all #defines as of kernel 5.0 and likely to
+ * be the case in the future.
+ *
+ * This is equivalent to libevdev_event_type_from_name() but takes the code
+ * name instead of the type name.
+ *
+ * @param name A non-NULL string describing an input-event value
+ * ("ABS_X", "REL_Y", "KEY_A", ...)
+ *
+ * @return The given event code for the name or -1 if not found.
+ */
+int
+libevdev_event_type_from_code_name(const char *name);
+
+/**
+ * @ingroup misc
+ *
+ * Look up an event type for a event code name. For example, the name
+ * "ABS_Y" returns EV_ABS. For the lookup to succeed, the name must be
+ * unique, which is the case for all #defines as of kernel 5.0 and likely to
+ * be the case in the future.
+ *
+ * This is equivalent to libevdev_event_type_from_name_n() but takes the code
+ * name instead of the type name.
+ *
+ * @param name A non-NULL string describing an input-event value
+ * ("ABS_X", "REL_Y", "KEY_A", ...)
+ * @param len The length of the passed string excluding any terminating 0
+ * character.
+ *
+ * @return The given event code for the name or -1 if not found.
+ */
+int
+libevdev_event_type_from_code_name_n(const char *name, size_t len);
+
+/**
+ * @ingroup misc
+ *
+ * Look up an event code by its name. For example, the name "ABS_Y" returns
+ * 1. For the lookup to succeed, the name must be unique, which is the case
+ * for all #defines as of kernel 5.0 and likely to be the case in the future.
+ *
+ * This is equivalent to libevdev_event_code_from_name() without the need
+ * for knowing the event type.
+ *
+ * @param name A non-NULL string describing an input-event value
+ * ("ABS_X", "REL_Y", "KEY_A", ...)
+ *
+ * @return The given event code for the name or -1 if not found.
+ */
+int
+libevdev_event_code_from_code_name(const char *name);
+
+/**
+ * @ingroup misc
+ *
+ * Look up an event code by its name. For example, the name "ABS_Y" returns
+ * 1. For the lookup to succeed, the name must be unique, which is the case
+ * for all #defines as of kernel 5.0 and likely to be the case in the future.
+ *
+ * This is equivalent to libevdev_event_code_from_name_n() without the need
+ * for knowing the event type.
+ *
+ * @param name A non-NULL string describing an input-event value
+ * ("ABS_X", "REL_Y", "KEY_A", ...)
+ * @param len The length of the passed string excluding any terminating 0
+ * character.
+ *
+ * @return The given event code for the name or -1 if not found.
+ */
+int
+libevdev_event_code_from_code_name_n(const char *name, size_t len);
+
/**
* @ingroup misc
*
}
END_TEST
+START_TEST(test_type_name_lookup)
+{
+ ck_assert_int_eq(libevdev_event_type_from_code_name("SYN_REPORT"), EV_SYN);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("KEY_A"), EV_KEY);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("REL_Z"), EV_REL);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("ABS_Z"), EV_ABS);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("MSC_SERIAL"), EV_MSC);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("SND_TONE"), EV_SND);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("SW_TABLET_MODE"), EV_SW);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("LED_CHARGING"), EV_LED);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("REP_PERIOD"), EV_REP);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("FF_SPRING"), EV_FF);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("FF_STATUS_STOPPED"), EV_FF_STATUS);
+
+ ck_assert_int_eq(libevdev_event_type_from_code_name_n("KEY_1zzzzz", 5), EV_KEY);
+ ck_assert_int_eq(libevdev_event_type_from_code_name_n("ABS_Zooom", 5), EV_ABS);
+
+ ck_assert_int_eq(libevdev_event_type_from_code_name("KEY_MAX"), EV_KEY);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("REL_MAX"), EV_REL);
+ ck_assert_int_eq(libevdev_event_type_from_code_name("ABS_MAX"), EV_ABS);
+}
+END_TEST
+
+START_TEST(test_type_name_lookup_invalid)
+{
+ ck_assert_int_eq(libevdev_event_type_from_name("SYN_REPORTED"), -1);
+ ck_assert_int_eq(libevdev_event_type_from_name("syn_blah"), -1);
+ ck_assert_int_eq(libevdev_event_type_from_name("SYN_"), -1);
+ ck_assert_int_eq(libevdev_event_type_from_name("KEY_BANANA"), -1);
+
+ ck_assert_int_eq(libevdev_event_type_from_name_n("KEY_BA", 6), -1);
+ ck_assert_int_eq(libevdev_event_type_from_name_n("KEY_BLAH", 8), -1);
+}
+END_TEST
+
START_TEST(test_code_names)
{
ck_assert_int_eq(libevdev_event_code_from_name(EV_SYN, "SYN_REPORT"), SYN_REPORT);
}
END_TEST
+START_TEST(test_code_name_lookup)
+{
+ /* Same as test_code_names() but without the type */
+ ck_assert_int_eq(libevdev_event_code_from_code_name("SYN_REPORT"), SYN_REPORT);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("ABS_X"), ABS_X);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("BTN_A"), BTN_A);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("KEY_A"), KEY_A);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("REL_X"), REL_X);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("MSC_RAW"), MSC_RAW);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("LED_KANA"), LED_KANA);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("SND_BELL"), SND_BELL);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("REP_DELAY"), REP_DELAY);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("SYN_DROPPED"), SYN_DROPPED);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("KEY_RESERVED"), KEY_RESERVED);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("BTN_0"), BTN_0);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("KEY_0"), KEY_0);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("FF_GAIN"), FF_GAIN);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("FF_STATUS_MAX"), FF_STATUS_MAX);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("SW_PEN_INSERTED"), SW_PEN_INSERTED);
+
+ ck_assert_int_eq(libevdev_event_code_from_code_name_n("ABS_YXZ", 5), ABS_Y);
+}
+END_TEST
+
START_TEST(test_code_names_invalid)
{
ck_assert_int_eq(libevdev_event_code_from_name(EV_MAX, "MAX_FAKE"), -1);
}
END_TEST
+START_TEST(test_code_name_lookup_invalid)
+{
+ /* Same as test_code_names_invalid() but without the type */
+ ck_assert_int_eq(libevdev_event_code_from_code_name("MAX_FAKE"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("CNT_FAKE"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("PWR_SOMETHING"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("EV_ABS"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("ABS_XY"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("BTN_GAMEPAD"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("BUS_PCI"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("FF_STATUS"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("FF_STATUS_"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("FF_STATUS"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("FF_STATUS_"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("ID_BUS"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("SND_CNT"), -1);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("SW_CNT"), -1);
+
+ ck_assert_int_eq(libevdev_event_code_from_code_name_n("ABS_X", 4), -1);
+}
+END_TEST
+
START_TEST(test_code_names_max)
{
ck_assert_int_eq(libevdev_event_code_from_name(EV_SYN, "SYN_MAX"), SYN_MAX);
ck_assert_int_eq(libevdev_event_code_from_name(EV_SND, "SND_MAX"), SND_MAX);
ck_assert_int_eq(libevdev_event_code_from_name(EV_REP, "REP_MAX"), REP_MAX);
ck_assert_int_eq(libevdev_event_code_from_name(EV_FF, "FF_MAX"), FF_MAX);
+
+ ck_assert_int_eq(libevdev_event_code_from_code_name("SYN_MAX"), SYN_MAX);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("KEY_MAX"), KEY_MAX);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("REL_MAX"), REL_MAX);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("ABS_MAX"), ABS_MAX);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("MSC_MAX"), MSC_MAX);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("SW_MAX"), SW_MAX);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("LED_MAX"), LED_MAX);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("SND_MAX"), SND_MAX);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("REP_MAX"), REP_MAX);
+ ck_assert_int_eq(libevdev_event_code_from_code_name("FF_MAX"), FF_MAX);
}
END_TEST
TCase *tc = tcase_create("type tests");
tcase_add_test(tc, test_type_names);
tcase_add_test(tc, test_type_names_invalid);
+ tcase_add_test(tc, test_type_name_lookup);
+ tcase_add_test(tc, test_type_name_lookup_invalid);
suite_add_tcase(s, tc);
tc = tcase_create("code tests");
tcase_add_test(tc, test_code_names);
+ tcase_add_test(tc, test_code_name_lookup);
tcase_add_test(tc, test_code_names_invalid);
+ tcase_add_test(tc, test_code_name_lookup_invalid);
tcase_add_test(tc, test_code_names_max);
suite_add_tcase(s, tc);