[libcamera-devel] [PATCH 2/2] libcamera: utils: Provide strchrnul() wrapper
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Dec 2 21:31:26 CET 2022
Hi Jacopo,
Thank you for the patch.
On Fri, Dec 02, 2022 at 05:41:45PM +0100, Jacopo Mondi via libcamera-devel wrote:
> The strchrnul function is a GNU-specific extension to string.h and it's
> not availalable on all C libraries (in example, Android's Bionic).
It has been added to bionic in API level 24.
Which API level are you using ? Would it be feasible to require level 24
? It seems to have been introduced in Android 7.0, first released in
2016. Do we need to support anything older than that ?
Same question for lockf(), which also got introduce in API level 24.
> Provide an implementation of the function based around the generally
> available strchr() function and use it in the Logger class.
>
> Open code the same wrapper in the application's option parser, where we
> cannot use the internal utils namespace.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> include/libcamera/base/utils.h | 1 +
> src/apps/common/options.cpp | 5 ++++-
> src/libcamera/base/log.cpp | 2 +-
> src/libcamera/base/utils.cpp | 19 +++++++++++++++++++
> 4 files changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
> index eb7bcdf4c173..b7064ec6253b 100644
> --- a/include/libcamera/base/utils.h
> +++ b/include/libcamera/base/utils.h
> @@ -36,6 +36,7 @@ namespace libcamera {
> namespace utils {
>
> const char *basename(const char *path);
> +const char *strchrnul(const char *s, int c);
>
> char *secure_getenv(const char *name);
> std::string dirname(const std::string &path);
> diff --git a/src/apps/common/options.cpp b/src/apps/common/options.cpp
> index 4f7e869144c8..1bbbec7fa25c 100644
> --- a/src/apps/common/options.cpp
> +++ b/src/apps/common/options.cpp
> @@ -363,7 +363,10 @@ KeyValueParser::Options KeyValueParser::parse(const char *arguments)
> Options options;
>
> for (const char *pair = arguments; *arguments != '\0'; pair = arguments) {
> - const char *comma = strchrnul(arguments, ',');
> + const char *comma = strchr(arguments, ',');
> + if (!comma)
> + comma = &arguments[strlen(arguments)];
> +
> size_t len = comma - pair;
>
> /* Skip over the comma. */
> diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp
> index 55fbd7b03438..cc30681fd67f 100644
> --- a/src/libcamera/base/log.cpp
> +++ b/src/libcamera/base/log.cpp
> @@ -629,7 +629,7 @@ void Logger::parseLogLevels()
> return;
>
> for (const char *pair = debug; *debug != '\0'; pair = debug) {
> - const char *comma = strchrnul(debug, ',');
> + const char *comma = utils::strchrnul(debug, ',');
> size_t len = comma - pair;
>
> /* Skip over the comma. */
> diff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp
> index 6a307940448e..f829a8106b76 100644
> --- a/src/libcamera/base/utils.cpp
> +++ b/src/libcamera/base/utils.cpp
> @@ -39,6 +39,25 @@ const char *basename(const char *path)
> return base ? base + 1 : path;
> }
>
> +/**
> + * \brief Implement strchnul wrapper
> + * \param[in] s The string to seach on
> + * \param[in] c The character to search
> + *
> + * The strchrnul function is a GNU-specific extension to string.h and it's not
> + * available on all C libraries (in example, Android's Bionic). This
> + * implementation realizes strchrnul() on strchr() which is instead more
> + * generally available.
> + *
> + * \return A pointer to the first occurrence of \a c in \a s, or a pointer to
> + * the null byte at the end of \a s if \a c is not found
> + */
> +const char *strchrnul(const char *s, int c)
> +{
> + const char *p = strchr(s, c);
> + return p ? : s + strlen(s);
> +}
> +
> /**
> * \brief Get an environment variable
> * \param[in] name The name of the variable to return
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list