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

Kieran Bingham kieran.bingham at ideasonboard.com
Fri Feb 21 12:15:53 CET 2020


Hi Laurent,

On 20/02/2020 20:24, Laurent Pinchart wrote:
> 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 ?


No - because my version doesn't and didn't intend to :-)


>> + * \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) ?

Would you like to submit this as your own patch ?
Or for me to take it verbatim ...


> /**
>  * \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>

That may be a bit redundant if it's on /your/ code. ...

--
Kieran



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

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list