[PATCH libevdev] Provide separate lookup functions for zero-terminated strings

Peter Hutterer peter.hutterer at who-t.net
Thu Oct 31 23:22:57 CET 2013


On Thu, Oct 31, 2013 at 11:00:34AM +0100, David Herrmann wrote:
> Hi Peter
> 
> On Thu, Oct 31, 2013 at 2:50 AM, Peter Hutterer
> <peter.hutterer at who-t.net> wrote:
> > Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> > ---
> > I didn't like the tests with all the -1 in the end, I think it's confusing.
> > let's just provide two separate APIs, though I'm not 100% convinced on the
> > _n postfix. any better suggestions?
> 
> Patch looks good to me:
> Reviewed-by: David Herrmann <dh.herrmann at gmail.com>
> 
> Regarding the suffix, "name"/"string" usually refer to zero-terminated
> strings. "buf"/"buffer"/"mem" to "sized"-memory. But type_from_buf()
> or type_from_mem() doesn't sound better, either. So I'm fine with the
> _n suffix.

Ok, thanks. the whole set pushed as
   c4111f7..2aa3d3f  master -> master

Cheers,
   Peter

> >  libevdev/libevdev-names.c |  23 +++++++---
> >  libevdev/libevdev.h       |  47 +++++++++++++++++---
> >  test/test-event-codes.c   | 106 +++++++++++++++++++++++-----------------------
> >  3 files changed, 112 insertions(+), 64 deletions(-)
> >
> > diff --git a/libevdev/libevdev-names.c b/libevdev/libevdev-names.c
> > index f9669cc..10669a3 100644
> > --- a/libevdev/libevdev-names.c
> > +++ b/libevdev/libevdev-names.c
> > @@ -67,13 +67,19 @@ lookup_name(const struct name_entry *array, size_t asize,
> >  }
> >
> >  LIBEVDEV_EXPORT int
> > -libevdev_event_type_from_name(const char *name, ssize_t len)
> > +libevdev_event_type_from_name(const char *name)
> > +{
> > +       return libevdev_event_type_from_name_n(name, strlen(name));
> > +}
> > +
> > +LIBEVDEV_EXPORT int
> > +libevdev_event_type_from_name_n(const char *name, size_t len)
> >  {
> >         struct name_lookup lookup;
> >         const struct name_entry *entry;
> >
> >         lookup.name = name;
> > -       lookup.len = (len < 0) ? strlen(name) : (size_t)len;
> > +       lookup.len = len;
> >
> >         entry = lookup_name(ev_names, ARRAY_LENGTH(ev_names), &lookup);
> >
> > @@ -86,9 +92,6 @@ static int type_from_prefix(const char *name, ssize_t len)
> >         size_t i;
> >         ssize_t l;
> >
> > -       if (len < 0)
> > -               len = strlen(name);
> > -
> >         /* MAX_ is not allowed, even though EV_MAX exists */
> >         if (startswith(name, len, "MAX_", 4))
> >                 return -1;
> > @@ -113,7 +116,13 @@ static int type_from_prefix(const char *name, ssize_t len)
> >  }
> >
> >  LIBEVDEV_EXPORT int
> > -libevdev_event_code_from_name(unsigned int type, const char *name, ssize_t len)
> > +libevdev_event_code_from_name(unsigned int type, const char *name)
> > +{
> > +       return libevdev_event_code_from_name_n(type, name, strlen(name));
> > +}
> > +
> > +LIBEVDEV_EXPORT int
> > +libevdev_event_code_from_name_n(unsigned int type, const char *name, size_t len)
> >  {
> >         struct name_lookup lookup;
> >         const struct name_entry *entry;
> > @@ -126,7 +135,7 @@ libevdev_event_code_from_name(unsigned int type, const char *name, ssize_t len)
> >
> >         /* now look up the name @name and return the constant */
> >         lookup.name = name;
> > -       lookup.len = (len < 0) ? strlen(name) : (size_t)len;
> > +       lookup.len = len;
> >
> >         entry = lookup_name(code_names, ARRAY_LENGTH(code_names), &lookup);
> >
> > diff --git a/libevdev/libevdev.h b/libevdev/libevdev.h
> > index 2bba4ba..1ee74b9 100644
> > --- a/libevdev/libevdev.h
> > +++ b/libevdev/libevdev.h
> > @@ -1467,15 +1467,52 @@ int libevdev_event_type_get_max(unsigned int type);
> >   * returns the constant assigned to the event-type or -1 if not found.
> >   *
> >   * @param name A non-NULL string describing an input-event type ("EV_KEY",
> > + * "EV_ABS", ...), zero-terminated.
> > + *
> > + * @return The given type constant for the passed name or -1 if not found.
> > + *
> > + * @note EV_MAX is also recognized.
> > + */
> > +int libevdev_event_type_from_name(const char *name);
> > +
> > +/**
> > + * @ingroup misc
> > + *
> > + * Look up an event-type by its name. Event-types start with "EV_" followed by
> > + * the name (eg., "EV_ABS"). The "EV_" prefix must be included in the name. It
> > + * returns the constant assigned to the event-type or -1 if not found.
> > + *
> > + * @param name A non-NULL string describing an input-event type ("EV_KEY",
> >   * "EV_ABS", ...).
> >   * @param len The length of the passed string excluding any terminating 0
> > - * character. If less than zero the string is assumed to be zero-terminated.
> > + * character.
> >   *
> >   * @return The given type constant for the passed name or -1 if not found.
> >   *
> >   * @note EV_MAX is also recognized.
> >   */
> > -int libevdev_event_type_from_name(const char *name, ssize_t len);
> > +int libevdev_event_type_from_name_n(const char *name, size_t len);
> > +
> > +/**
> > + * @ingroup misc
> > + *
> > + * Look up an event-code by its type and name. Event-codes start with a fixed
> > + * prefix followed by their name (eg., "ABS_X"). The prefix must be included in
> > + * the name. It returns the constant assigned to the event-code or -1 if not
> > + * found.
> > + *
> > + * You have to pass the event-type where to look for the name. For instance, to
> > + * resolve "ABS_X" you need to pass EV_ABS as type and "ABS_X" as string.
> > + * Supported event-codes are codes starting with SYN_, KEY_, BTN_, REL_, ABS_,
> > + * MSC_, SND_, SW_, LED_, REP_, FF_.
> > + *
> > + * @param type The event type (EV_* constant) where to look for the name.
> > + * @param name A non-NULL string describing an input-event code ("KEY_A",
> > + * "ABS_X", "BTN_Y", ...), zero-terminated.
> > + *
> > + * @return The given code constant for the passed name or -1 if not found.
> > + */
> > +int libevdev_event_code_from_name(unsigned int type, const char *name);
> >
> >  /**
> >   * @ingroup misc
> > @@ -1494,12 +1531,12 @@ int libevdev_event_type_from_name(const char *name, ssize_t len);
> >   * @param name A non-NULL string describing an input-event code ("KEY_A",
> >   * "ABS_X", "BTN_Y", ...).
> >   * @param len The length of the passed string excluding any terminating 0
> > - * character. If less than zero the string is assumed to be zero-terminated.
> > + * character.
> >   *
> >   * @return The given code constant for the passed name or -1 if not found.
> >   */
> > -int libevdev_event_code_from_name(unsigned int type, const char *name,
> > -                                 ssize_t len);
> > +int libevdev_event_code_from_name_n(unsigned int type, const char *name,
> > +                                   size_t len);
> >
> >  /**
> >   * @ingroup bits
> > diff --git a/test/test-event-codes.c b/test/test-event-codes.c
> > index 22666dd..3a57973 100644
> > --- a/test/test-event-codes.c
> > +++ b/test/test-event-codes.c
> > @@ -26,75 +26,77 @@
> >
> >  START_TEST(test_type_codes)
> >  {
> > -       ck_assert(libevdev_event_type_from_name("EV_SYN", -1) == EV_SYN);
> > -       ck_assert(libevdev_event_type_from_name("EV_KEY", -1) == EV_KEY);
> > -       ck_assert(libevdev_event_type_from_name("EV_REL", -1) == EV_REL);
> > -       ck_assert(libevdev_event_type_from_name("EV_ABS", -1) == EV_ABS);
> > -       ck_assert(libevdev_event_type_from_name("EV_MSC", -1) == EV_MSC);
> > -       ck_assert(libevdev_event_type_from_name("EV_SND", -1) == EV_SND);
> > -       ck_assert(libevdev_event_type_from_name("EV_SW", -1) == EV_SW);
> > -       ck_assert(libevdev_event_type_from_name("EV_LED", -1) == EV_LED);
> > -       ck_assert(libevdev_event_type_from_name("EV_REP", -1) == EV_REP);
> > -       ck_assert(libevdev_event_type_from_name("EV_FF", -1) == EV_FF);
> > -       ck_assert(libevdev_event_type_from_name("EV_FF_STATUS", -1) == EV_FF_STATUS);
> > -       ck_assert(libevdev_event_type_from_name("EV_MAX", -1) == EV_MAX);
> > +       ck_assert(libevdev_event_type_from_name("EV_SYN") == EV_SYN);
> > +       ck_assert(libevdev_event_type_from_name("EV_KEY") == EV_KEY);
> > +       ck_assert(libevdev_event_type_from_name("EV_REL") == EV_REL);
> > +       ck_assert(libevdev_event_type_from_name("EV_ABS") == EV_ABS);
> > +       ck_assert(libevdev_event_type_from_name("EV_MSC") == EV_MSC);
> > +       ck_assert(libevdev_event_type_from_name("EV_SND") == EV_SND);
> > +       ck_assert(libevdev_event_type_from_name("EV_SW") == EV_SW);
> > +       ck_assert(libevdev_event_type_from_name("EV_LED") == EV_LED);
> > +       ck_assert(libevdev_event_type_from_name("EV_REP") == EV_REP);
> > +       ck_assert(libevdev_event_type_from_name("EV_FF") == EV_FF);
> > +       ck_assert(libevdev_event_type_from_name("EV_FF_STATUS") == EV_FF_STATUS);
> > +       ck_assert(libevdev_event_type_from_name("EV_MAX") == EV_MAX);
> >
> > -       ck_assert(libevdev_event_type_from_name("EV_SYNTAX", 6) == EV_SYN);
> > -       ck_assert(libevdev_event_type_from_name("EV_REPTILE", 6) == EV_REP);
> > +       ck_assert(libevdev_event_type_from_name_n("EV_SYNTAX", 6) == EV_SYN);
> > +       ck_assert(libevdev_event_type_from_name_n("EV_REPTILE", 6) == EV_REP);
> >  }
> >  END_TEST
> >
> >  START_TEST(test_type_invalid)
> >  {
> > -       ck_assert(libevdev_event_type_from_name("EV_Syn", -1) == -1);
> > -       ck_assert(libevdev_event_type_from_name("ev_SYN", -1) == -1);
> > -       ck_assert(libevdev_event_type_from_name("SYN", -1) == -1);
> > +       ck_assert(libevdev_event_type_from_name("EV_Syn") == -1);
> > +       ck_assert(libevdev_event_type_from_name("ev_SYN") == -1);
> > +       ck_assert(libevdev_event_type_from_name("SYN") == -1);
> > +       ck_assert(libevdev_event_type_from_name("EV_SYNTAX") == -1);
> >
> > -       ck_assert(libevdev_event_type_from_name("EV_SYN", 5) == -1);
> > -       ck_assert(libevdev_event_type_from_name("EV_SYNTAX", -1) == -1);
> > -       ck_assert(libevdev_event_type_from_name("EV_REPTILE", 7) == -1);
> > +       ck_assert(libevdev_event_type_from_name_n("EV_SYN", 5) == -1);
> > +       ck_assert(libevdev_event_type_from_name_n("EV_REPTILE", 7) == -1);
> >  }
> >  END_TEST
> >
> >  START_TEST(test_key_codes)
> >  {
> > -       ck_assert(libevdev_event_code_from_name(EV_SYN, "SYN_REPORT", -1) == SYN_REPORT);
> > -       ck_assert(libevdev_event_code_from_name(EV_ABS, "ABS_X", -1) == ABS_X);
> > -       ck_assert(libevdev_event_code_from_name(EV_KEY, "BTN_A", -1) == BTN_A);
> > -       ck_assert(libevdev_event_code_from_name(EV_KEY, "KEY_A", -1) == KEY_A);
> > -       ck_assert(libevdev_event_code_from_name(EV_REL, "REL_X", -1) == REL_X);
> > -       ck_assert(libevdev_event_code_from_name(EV_ABS, "ABS_YXZ", 5) == ABS_Y);
> > -       ck_assert(libevdev_event_code_from_name(EV_MSC, "MSC_RAW", -1) == MSC_RAW);
> > -       ck_assert(libevdev_event_code_from_name(EV_LED, "LED_KANA", -1) == LED_KANA);
> > -       ck_assert(libevdev_event_code_from_name(EV_SND, "SND_BELL", -1) == SND_BELL);
> > -       ck_assert(libevdev_event_code_from_name(EV_REP, "REP_DELAY", -1) == REP_DELAY);
> > -       ck_assert(libevdev_event_code_from_name(EV_SYN, "SYN_DROPPED", -1) == SYN_DROPPED);
> > -       ck_assert(libevdev_event_code_from_name(EV_KEY, "KEY_RESERVED", -1) == KEY_RESERVED);
> > -       ck_assert(libevdev_event_code_from_name(EV_KEY, "BTN_0", -1) == BTN_0);
> > -       ck_assert(libevdev_event_code_from_name(EV_KEY, "KEY_0", -1) == KEY_0);
> > -       ck_assert(libevdev_event_code_from_name(EV_FF, "FF_GAIN", -1) == FF_GAIN);
> > -       ck_assert(libevdev_event_code_from_name(EV_FF_STATUS, "FF_STATUS_MAX", -1) == FF_STATUS_MAX);
> > -       ck_assert(libevdev_event_code_from_name(EV_SW, "SW_MAX", -1) == SW_MAX);
> > +       ck_assert(libevdev_event_code_from_name(EV_SYN, "SYN_REPORT") == SYN_REPORT);
> > +       ck_assert(libevdev_event_code_from_name(EV_ABS, "ABS_X") == ABS_X);
> > +       ck_assert(libevdev_event_code_from_name(EV_KEY, "BTN_A") == BTN_A);
> > +       ck_assert(libevdev_event_code_from_name(EV_KEY, "KEY_A") == KEY_A);
> > +       ck_assert(libevdev_event_code_from_name(EV_REL, "REL_X") == REL_X);
> > +       ck_assert(libevdev_event_code_from_name(EV_MSC, "MSC_RAW") == MSC_RAW);
> > +       ck_assert(libevdev_event_code_from_name(EV_LED, "LED_KANA") == LED_KANA);
> > +       ck_assert(libevdev_event_code_from_name(EV_SND, "SND_BELL") == SND_BELL);
> > +       ck_assert(libevdev_event_code_from_name(EV_REP, "REP_DELAY") == REP_DELAY);
> > +       ck_assert(libevdev_event_code_from_name(EV_SYN, "SYN_DROPPED") == SYN_DROPPED);
> > +       ck_assert(libevdev_event_code_from_name(EV_KEY, "KEY_RESERVED") == KEY_RESERVED);
> > +       ck_assert(libevdev_event_code_from_name(EV_KEY, "BTN_0") == BTN_0);
> > +       ck_assert(libevdev_event_code_from_name(EV_KEY, "KEY_0") == KEY_0);
> > +       ck_assert(libevdev_event_code_from_name(EV_FF, "FF_GAIN") == FF_GAIN);
> > +       ck_assert(libevdev_event_code_from_name(EV_FF_STATUS, "FF_STATUS_MAX") == FF_STATUS_MAX);
> > +       ck_assert(libevdev_event_code_from_name(EV_SW, "SW_MAX") == SW_MAX);
> > +
> > +       ck_assert(libevdev_event_code_from_name_n(EV_ABS, "ABS_YXZ", 5) == ABS_Y);
> >  }
> >  END_TEST
> >
> >  START_TEST(test_key_invalid)
> >  {
> > -       ck_assert(libevdev_event_code_from_name(EV_MAX, "MAX_FAKE", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_CNT, "CNT_FAKE", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_PWR, "PWR_SOMETHING", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_ABS, "EV_ABS", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_ABS, "ABS_X", 4) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_ABS, "ABS_XY", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_KEY, "BTN_GAMEPAD", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_KEY, "BUS_PCI", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_FF_STATUS, "FF_STATUS", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_FF_STATUS, "FF_STATUS_", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_FF, "FF_STATUS", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_FF, "FF_STATUS_", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_KEY, "ID_BUS", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_SND, "SND_CNT", -1) == -1);
> > -       ck_assert(libevdev_event_code_from_name(EV_SW, "SW_CNT", -1) == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_MAX, "MAX_FAKE") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_CNT, "CNT_FAKE") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_PWR, "PWR_SOMETHING") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_ABS, "EV_ABS") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_ABS, "ABS_XY") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_KEY, "BTN_GAMEPAD") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_KEY, "BUS_PCI") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_FF_STATUS, "FF_STATUS") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_FF_STATUS, "FF_STATUS_") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_FF, "FF_STATUS") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_FF, "FF_STATUS_") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_KEY, "ID_BUS") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_SND, "SND_CNT") == -1);
> > +       ck_assert(libevdev_event_code_from_name(EV_SW, "SW_CNT") == -1);
> > +
> > +       ck_assert(libevdev_event_code_from_name_n(EV_ABS, "ABS_X", 4) == -1);
> >  }
> >  END_TEST
> >
> > --
> > 1.8.3.1
> >


More information about the Input-tools mailing list