Messages in this thread | | | Subject | Re: [for-next][PATCH 23/24] string.h: Add strncmp_prefix() helper macro | From | Joe Perches <> | Date | Fri, 21 Dec 2018 12:46:47 -0800 |
| |
On Fri, 2018-12-21 at 15:35 -0500, Steven Rostedt wrote: > At first I thought this would have issues, but with a slight change... > > #define have_prefix(str, prefix) ({ \ > const char *__pfx = (const char *)prefix; \ > > > And the rest the same, it appears to work. > > Need the cast because if for some reason someone passed in something > like "const unsigned char" then it wouldn't work. But that's just a nit. > > So something like this then? > > -- Steve > > diff --git a/include/linux/string.h b/include/linux/string.h [] > @@ -14,6 +14,28 @@ extern void *memdup_user(const void __user *, size_t); > extern void *vmemdup_user(const void __user *, size_t); > extern void *memdup_user_nul(const void __user *, size_t); > > +/** > + * have_prefix - Test if a string has a given prefix
There is a naming mismatch of have/has here and has_prefix is probably too generic a name.
How about str_has_prefix?
> + * @str: The string to test > + * @prefix: The string to see if @str starts with > + * > + * A common way to test a prefix of a string is to do: > + * strncmp(str, prefix, sizeof(prefix) - 1) > + * > + * But this can lead to bugs due to typos, or if prefix is a pointer > + * and not a constant. Instead use has_prefix(). > + * > + * Returns: 0 if @str does not start with @prefix > + strlen(@prefix) if @str does start with @prefix > + */ > +#define has_prefix(str, prefix) \ > + ({ \ > + const char *____prefix____ = (const char *)(prefix); \ > + int ____len____ = strlen(____prefix____); \ > + strncmp(str, ____prefix____, ____len____) == 0 ? \ > + ____len____ : 0; \ > + })
I think all the underscores are unnecessary and confusing.
| |