On Sat, Feb 18, 2017 at 07:24:43PM +0000, Sean Young wrote: > On Fri, Feb 17, 2017 at 10:19:16AM +0100, Matthias Reichl wrote: > > ir-keytable can't load the streamzap keymap because the > > protocol type RC5_SZ is invalid: > > > > ./ir-keytable -w rc_keymaps/streamzap > > Protocol RC5_SZ invalid > > ... > > > > Fix this by changing the protocol type to RC-5-SZ which > > matches the kernel protocol rc-5-sz > > > > Signed-off-by: Matthias Reichl <hias@xxxxxxxxx> > > --- > > utils/keytable/rc_keymaps/streamzap | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/utils/keytable/rc_keymaps/streamzap b/utils/keytable/rc_keymaps/streamzap > > index 3512cd8..03d2cb8 100644 > > --- a/utils/keytable/rc_keymaps/streamzap > > +++ b/utils/keytable/rc_keymaps/streamzap > > This is file is generated by utils/keytable/gen_keytables.pl, so there is no > use in patching it. Ouch, I totally missed that. Thanks for pointing it out! > Actually I think a better solution would be to be less pernickety about how > the protocol is specified. ir-ctl also does this. How about the following > patch. I agree, this is a much better solution. It simplifies the protocol_map and being more tolerant about spelling is also a benefit to the user. > Sean > > From: Sean Young <sean@xxxxxxxx> > Subject: [PATCH] [PATCH v4l-utils] ir-keytable: be more permissive on protocol > name > > Allowed the protocol to be specified with or without underscores or > dashes. This also solves the problem of not being able to load > the streamzap keymap. > > ./ir-keytable -w rc_keymaps/streamzap > Protocol RC5_SZ invalid > > Reported-by: Matthias Reichl <hias@xxxxxxxxx> > Signed-off-by: Sean Young <sean@xxxxxxxx> > --- > utils/keytable/keytable.c | 20 ++++++++++++++++---- > 1 file changed, 16 insertions(+), 4 deletions(-) > > diff --git a/utils/keytable/keytable.c b/utils/keytable/keytable.c > index a6ecc9e..a35db5b 100644 > --- a/utils/keytable/keytable.c > +++ b/utils/keytable/keytable.c > @@ -120,9 +120,7 @@ const struct protocol_map_entry protocol_map[] = { > { "other", NULL, SYSFS_OTHER }, > { "lirc", NULL, SYSFS_LIRC }, > { "rc-5", "/rc5_decoder", SYSFS_RC5 }, > - { "rc5", NULL, SYSFS_RC5 }, > { "rc-5x", NULL, SYSFS_INVALID }, > - { "rc5x", NULL, SYSFS_INVALID }, > { "rc-5-sz", NULL, SYSFS_RC5_SZ }, > { "jvc", "/jvc_decoder", SYSFS_JVC }, > { "sony", "/sony_decoder",SYSFS_SONY }, > @@ -134,7 +132,6 @@ const struct protocol_map_entry protocol_map[] = { > { "mce_kbd", NULL, SYSFS_MCE_KBD }, > { "mce-kbd", NULL, SYSFS_MCE_KBD }, > { "rc-6", "/rc6_decoder", SYSFS_RC6 }, > - { "rc6", NULL, SYSFS_RC6 }, > { "rc-6-0", NULL, SYSFS_INVALID }, > { "rc-6-6a-20", NULL, SYSFS_INVALID }, > { "rc-6-6a-24", NULL, SYSFS_INVALID }, > @@ -145,6 +142,21 @@ const struct protocol_map_entry protocol_map[] = { > { NULL, NULL, SYSFS_INVALID }, > }; > > +static bool str_like(const char *a, const char *b) > +{ > + while (*a && *b) { > + if (*a == '-' || *a == '_') > + a++; > + if (*b == '-' || *b == '_') > + b++; > + if (tolower(*a) != tolower(*b)) > + return false; > + a++; b++; > + } A small nit: this code will fail if both strings are identical and end with a dash or underscore. In that case we'll iterate beyond then end of the strings. Adding a continue after the dash/underscore increment should fix this, then we won't increment the pointer by 2 within a loop if (*a == '-' || *a == '_') { a++; continue; } if (*b == '-' || *b == '_') { b++; continue; } Other than that the patch looks fine to me and worked well. > + > + return !*a && !*b; > +} > + > static enum sysfs_protocols parse_sysfs_protocol(const char *name, bool all_allowed) > { > const struct protocol_map_entry *pme; > @@ -156,7 +168,7 @@ static enum sysfs_protocols parse_sysfs_protocol(const char *name, bool all_allo > return ~0; > > for (pme = protocol_map; pme->name; pme++) { > - if (!strcasecmp(name, pme->name)) > + if (str_like(name, pme->name)) > return pme->sysfs_protocol; > } > > -- > 2.9.3 >