[libcamera-devel] [PATCH v3 1/6] libcamera: utils: Add an internal dirname helper

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Feb 20 21:24:24 CET 2020


Hi Kieran,

Thank you for the patch.

On Thu, Feb 20, 2020 at 04:56:59PM +0000, Kieran Bingham wrote:
> Provide a wrapped dirname call which returns a std::string.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
>  src/libcamera/include/utils.h |  1 +
>  src/libcamera/utils.cpp       | 17 +++++++++++++++++
>  2 files changed, 18 insertions(+)
> 
> diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h
> index 080ea6614de0..940597760ee2 100644
> --- a/src/libcamera/include/utils.h
> +++ b/src/libcamera/include/utils.h
> @@ -33,6 +33,7 @@ namespace utils {
>  const char *basename(const char *path);
>  
>  char *secure_getenv(const char *name);
> +std::string dirname(const std::string &path);
>  
>  template<class InputIt1, class InputIt2>
>  unsigned int set_overlap(InputIt1 first1, InputIt1 last1,
> diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp
> index 453e3b3b5995..3fd3aeaf822a 100644
> --- a/src/libcamera/utils.cpp
> +++ b/src/libcamera/utils.cpp
> @@ -70,6 +70,23 @@ char *secure_getenv(const char *name)
>  #endif
>  }
>  
> +/**
> + * \brief identify the dirname portion of a path

s/identify/Identify/

> + * \param[in] path The full path to parse
> + *

Should we add that this function conforms to the behaviour of the
dirname() function defined by POSIX ?

> + * \returns A string of the directory component of the path

s/returns/return/

> + */
> +std::string dirname(const std::string &path)
> +{
> +	size_t pos = path.rfind('/', path.length());
> +
> +	if (pos != std::string::npos) {
> +		return (path.substr(0, pos));
> +	}

No need for braces and parentheses around path.substr(0, pos).

> +
> +	return path;

To be compatible with the glibc implementation, you should return the
string "." if the path doesn't contain a '/'. Furthemore, if the whole
path string is equal to "/", then you should return "/", while the above
returns an empty string. There's also the case of trailing '/' in the
path that is not handled correctly.

How about the following (only compile-test) ?

/**
 * \brief Identify the dirname portion of a path
 * \param[in] path The full path to parse
 *
 * This function conforms with the behaviour of the %dirname() function as
 * defined by POSIX.
 *
 * \return A string of the directory component of the path
 */
std::string dirname(const std::string &path)
{
	if (path.empty())
		return ".";

        /*
	 * Skip all trailing slashes. If the path is only made of slashes,
	 * return "/".
	 */
	size_t pos = path.size();
	while (pos > 0 && path[pos-1] == '/')
		pos--;

        if (!pos)
		return "/";

	/*
	 * Find the previous slash. If the path contains no non-trailing slash,
	 * return ".".
	 */
	while (pos > 0 && path[pos-1] != '/')
		pos--;

	if (!pos)
		return ".";

	/*
	 * Return the directory name until (but not including) the slash. If
	 * this would result in an empty string, return "/".
	 */
	if (pos == 1)
		return "/";

	return path.substr(0, pos - 1);
}

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> +}
> +
>  /**
>   * \fn libcamera::utils::set_overlap(InputIt1 first1, InputIt1 last1,
>   *				     InputIt2 first2, InputIt2 last2)

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list