Message ID | 1453986865-133572-2-git-send-email-andriy.shevchenko@linux.intel.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
On Thu, 28 Jan 2016 15:14:17 +0200 Andy Shevchenko <andriy.shevchenko@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); -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, 2016-02-01 at 22:05 -0800, Andrew Morton wrote: > On Thu, 28 Jan 2016 15:14:17 +0200 Andy Shevchenko <andriy.shevchenko > @linux.intel.com> wrote: > > + * @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. It was Rasmus' idea [1], before that I used int and tristate branch. I agreed that one of that branches wasn't a good idea, but the rest was exactly about differentiating size to compare and infinite (till terminator) loop. [1] http://www.spinics.net/lists/kernel/msg2156925.html > > > > + item = array[index]; > > + if (!item) > > + break; > > + if (!strcmp(item, string)) > > + return index; > > + } > > + > > + return -ENODATA; > > +} > > +EXPORT_SYMBOL(match_string); >
On Tue, Feb 02 2016, Andrew Morton <akpm@linux-foundation.org> wrote: > On Thu, 28 Jan 2016 15:14:17 +0200 Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote: > >> + * @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. n has unsigned type to make it easy to pass 'infinity'; *that's* where we rely on integer promotion. One could make index be unsigned int (or size_t), but it won't matter, because it will never have a value where the type promotion (nor the implicit cast back to int if/when it's used as a return value) changes its value. Rasmus -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/linux/string.h b/include/linux/string.h index b0a732b..07505aa 100644 --- 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 + * @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++) { + item = array[index]; + if (!item) + break; + if (!strcmp(item, string)) + return index; + } + + return -ENODATA; +} +EXPORT_SYMBOL(match_string); + +/** * strtobool - convert common user inputs into boolean values * @s: input string * @res: result
From time to time we have to match a string in an array. Make a simple helper for that purpose. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> --- include/linux/string.h | 2 ++ lib/string.c | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+)