On Thu, 28 Jan 2016 15:14:17 +0200 Andy Shevchenko <andriy.shevche...@linux.intel.com> wrote:
> >From time to time we have to match a string in an array. Make a simple helper > for that purpose. > > ... > > --- a/include/linux/string.h > +++ b/include/linux/string.h > @@ -131,6 +131,8 @@ extern void argv_free(char **argv); > extern bool sysfs_streq(const char *s1, const char *s2); > extern int strtobool(const char *s, bool *res); > > +int match_string(const char * const *array, size_t n, const char *string); > + > #ifdef CONFIG_BINARY_PRINTF > int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args); > int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf); > diff --git a/lib/string.c b/lib/string.c > index 0323c0d..ba01d4f 100644 > --- a/lib/string.c > +++ b/lib/string.c > @@ -631,6 +631,32 @@ bool sysfs_streq(const char *s1, const char *s2) > EXPORT_SYMBOL(sysfs_streq); > > /** > + * match_string - matches given string in an array I can't say I'm in love with the name, but I guess it will suffice. search_string() doesn't seem much better. > + * @array: array of strings > + * @n: number of strings in the array or -1 for NULL > terminated arrays > + * @string: string to match with > + * > + * Return: > + * index of a @string in the @array if matches, or %-ENODATA otherwise. > + */ > +int match_string(const char * const *array, size_t n, const char *string) > +{ > + int index; > + const char *item; > + > + for (index = 0; index < n; index++) { So we're taking an int and comparing that with (size_t)-1, relying upon the compiler promoting the int to an unsigned type because size_t is unsigned. It works, but it isn't pretty - there wasn't really much point in making size have type size_t. > + item = array[index]; > + if (!item) > + break; > + if (!strcmp(item, string)) > + return index; > + } > + > + return -ENODATA; > +} > +EXPORT_SYMBOL(match_string);