[PATCH 01/99] lib: Add option iterator
Thomas Zimmermann
tzimmermann at suse.de
Tue Mar 7 08:40:48 UTC 2023
Hi
Am 06.03.23 um 23:37 schrieb Randy Dunlap:
[...]
>> + *
>> + * The call to option_iter_init() initializes the iterator instance
>> + * from the option string. The while loop walks over the individual
>> + * options in the sting and returns each in the second argument. The
>> + * returned memory is owned by the iterator instance and callers may
>> + * not modify or free it. The call to option_iter_release() frees all
>> + * resources of the iterator. This process does not modify the original
>> + * option string. If the option string contains an empty option (i.e.,
>> + * two commas next to each other), option_iter_next() skips the empty
>> + * option automatically.
>
> Is that latter skipping over a ",," automatically something that you have
> observed as needed?
It's not strictly needed for correctness, but many of those fbdev
drivers contain code to do that. Like this one:
https://elixir.bootlin.com/linux/v6.2/source/drivers/video/fbdev/vesafb.c#L217
So doing it in the _incr() helper seems useful
> I can imagine a driver or module wanting to know that an empty string
> was entered (i.e., ",,").
I only looked at fbdev drivers, but none of them cared about empty
strings. They all have named options and/or key-value pairs.
>
>> + */
>> +
>> +/**
>> + * option_iter_init - Initializes an option iterator
>> + * @iter: the iterator to initialize
>> + * @options: the options string
>> + */
>> +void option_iter_init(struct option_iter *iter, const char *options)
>> +{
>> + if (options && *options)
>> + iter->optbuf = kstrdup(options, GFP_KERNEL); // can be NULL
>> + else
>> + iter->optbuf = NULL;
>> + iter->next_opt = iter->optbuf;
>> +}
>> +EXPORT_SYMBOL(option_iter_init);
>> +
>> +/**
>> + * option_iter_release - Releases an option iterator's resources
>> + * @iter: the iterator
>> + */
>> +void option_iter_release(struct option_iter *iter)
>> +{
>> + kfree(iter->optbuf);
>> + iter->next_opt = NULL;
>> +}
>> +EXPORT_SYMBOL(option_iter_release);
>> +
>> +/**
>> + * option_iter_incr - Return current option and advance to the next
>> + * @iter: the iterator
>> + *
>> + * Returns:
>
> * Return:
> matches kernel-doc notation documentation.
>
>> + * The current option string, or NULL if there are no more options.
>> + */
>> +const char *option_iter_incr(struct option_iter *iter)
>> +{
>> + char *opt;
>> +
>> + if (!iter->next_opt) { // can be OK if kstrdup failed
>> + if (iter->optbuf) // iter has already been released; logic error
>> + pr_err("Incrementing option iterator without string\n");
>> + return NULL;
>> + }
>> +
>> + do {
>> + opt = strsep(&iter->next_opt, ",");
>> + if (!opt)
>> + return NULL;
>> + } while (!*opt); // found empty option string, try next
>> +
>> + return opt;
>> +}
>> +EXPORT_SYMBOL(option_iter_incr);
>
> Looks useful. Thanks.
Thanks.
Best regards
Thomas
>
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20230307/77d345b4/attachment.sig>
More information about the dri-devel
mailing list