[libcamera-devel,v3,3/4] libcamera: utils: Use internal basename implementation.

Message ID 20190403041058.20921-4-kieran.bingham@ideasonboard.com
State Accepted
Commit 0e1a80952524e672ce8ce5eb900740dda2ae9044
Headers show
Series
  • Cleanup and non-GNU C library support
Related show

Commit Message

Kieran Bingham April 3, 2019, 4:10 a.m. UTC
Differing implementations of basename() exist, some of which may modify
the content of the string passed as an argument.

The implementation of basename() is trivial, thus to support different
C librariese, provide our own version which accepts and returns a const
char *.

Update the call sites to use the new implementation.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 src/libcamera/include/utils.h |  2 ++
 src/libcamera/log.cpp         |  2 +-
 src/libcamera/meson.build     |  1 +
 src/libcamera/utils.cpp       | 51 +++++++++++++++++++++++++++++++++++
 4 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 src/libcamera/utils.cpp

Comments

Laurent Pinchart April 3, 2019, 5:40 a.m. UTC | #1
Hi Kieran,

Thank you for the patch.

On Wed, Apr 03, 2019 at 11:10:57AM +0700, Kieran Bingham wrote:
> Differing implementations of basename() exist, some of which may modify
> the content of the string passed as an argument.
> 
> The implementation of basename() is trivial, thus to support different
> C librariese, provide our own version which accepts and returns a const
> char *.
> 
> Update the call sites to use the new implementation.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

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

> ---
>  src/libcamera/include/utils.h |  2 ++
>  src/libcamera/log.cpp         |  2 +-
>  src/libcamera/meson.build     |  1 +
>  src/libcamera/utils.cpp       | 51 +++++++++++++++++++++++++++++++++++
>  4 files changed, 55 insertions(+), 1 deletion(-)
>  create mode 100644 src/libcamera/utils.cpp
> 
> diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h
> index 73fa2e69b029..1b2a62c0fda7 100644
> --- a/src/libcamera/include/utils.h
> +++ b/src/libcamera/include/utils.h
> @@ -15,6 +15,8 @@ namespace libcamera {
>  
>  namespace utils {
>  
> +const char *basename(const char *path);
> +
>  /* C++11 doesn't provide std::make_unique */
>  template<typename T, typename... Args>
>  std::unique_ptr<T> make_unique(Args&&... args)
> diff --git a/src/libcamera/log.cpp b/src/libcamera/log.cpp
> index 26ebf410a7a9..eb444c31857d 100644
> --- a/src/libcamera/log.cpp
> +++ b/src/libcamera/log.cpp
> @@ -438,7 +438,7 @@ void LogMessage::init(const char *fileName, unsigned int line)
>  
>  	msgStream_ << " " << log_severity_name(severity_);
>  	msgStream_ << " " << category_.name();
> -	msgStream_ << " " << basename(fileName) << ":" << line << " ";
> +	msgStream_ << " " << utils::basename(fileName) << ":" << line << " ";
>  }
>  
>  LogMessage::~LogMessage()
> diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
> index 8384cd0af451..863cb60d4b90 100644
> --- a/src/libcamera/meson.build
> +++ b/src/libcamera/meson.build
> @@ -16,6 +16,7 @@ libcamera_sources = files([
>      'signal.cpp',
>      'stream.cpp',
>      'timer.cpp',
> +    'utils.cpp',
>      'v4l2_device.cpp',
>      'v4l2_subdevice.cpp',
>  ])
> diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp
> new file mode 100644
> index 000000000000..fae28cee556a
> --- /dev/null
> +++ b/src/libcamera/utils.cpp
> @@ -0,0 +1,51 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2019, Google Inc.
> + *
> + * utils.cpp - Miscellaneous utility functions
> + */
> +
> +#include <string.h>
> +#include <sys/auxv.h>
> +
> +#include "utils.h"
> +
> +/**
> + * \file utils.h
> + * \brief Miscellaneous utility functions
> + */
> +
> +namespace libcamera {
> +
> +namespace utils {
> +
> +/**
> + * \def ARRAY_SIZE(array)
> + * \brief Determine the number of elements in the static array.
> + */
> +
> +/**
> + * \brief Strip the directory prefix from the path
> + * \param[in] path The path to process
> + *
> + * basename is implemented differently across different C libraries. This
> + * implementation matches the one provided by the GNU libc, and does not
> + * modify its input parameter.
> + *
> + * \return A pointer within the given path without any leading directory
> + * components.
> + */
> +const char *basename(const char *path)
> +{
> +       const char *base = strrchr(path, '/');
> +       return base ? base + 1 : path;
> +}
> +
> +/**
> + * \fn libcamera::utils::make_unique(Args &&... args)
> + * \brief Constructs an object of type T and wraps it in a std::unique_ptr.
> + */
> +
> +} /* namespace utils */
> +
> +} /* namespace libcamera */

Patch

diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h
index 73fa2e69b029..1b2a62c0fda7 100644
--- a/src/libcamera/include/utils.h
+++ b/src/libcamera/include/utils.h
@@ -15,6 +15,8 @@  namespace libcamera {
 
 namespace utils {
 
+const char *basename(const char *path);
+
 /* C++11 doesn't provide std::make_unique */
 template<typename T, typename... Args>
 std::unique_ptr<T> make_unique(Args&&... args)
diff --git a/src/libcamera/log.cpp b/src/libcamera/log.cpp
index 26ebf410a7a9..eb444c31857d 100644
--- a/src/libcamera/log.cpp
+++ b/src/libcamera/log.cpp
@@ -438,7 +438,7 @@  void LogMessage::init(const char *fileName, unsigned int line)
 
 	msgStream_ << " " << log_severity_name(severity_);
 	msgStream_ << " " << category_.name();
-	msgStream_ << " " << basename(fileName) << ":" << line << " ";
+	msgStream_ << " " << utils::basename(fileName) << ":" << line << " ";
 }
 
 LogMessage::~LogMessage()
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 8384cd0af451..863cb60d4b90 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -16,6 +16,7 @@  libcamera_sources = files([
     'signal.cpp',
     'stream.cpp',
     'timer.cpp',
+    'utils.cpp',
     'v4l2_device.cpp',
     'v4l2_subdevice.cpp',
 ])
diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp
new file mode 100644
index 000000000000..fae28cee556a
--- /dev/null
+++ b/src/libcamera/utils.cpp
@@ -0,0 +1,51 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * utils.cpp - Miscellaneous utility functions
+ */
+
+#include <string.h>
+#include <sys/auxv.h>
+
+#include "utils.h"
+
+/**
+ * \file utils.h
+ * \brief Miscellaneous utility functions
+ */
+
+namespace libcamera {
+
+namespace utils {
+
+/**
+ * \def ARRAY_SIZE(array)
+ * \brief Determine the number of elements in the static array.
+ */
+
+/**
+ * \brief Strip the directory prefix from the path
+ * \param[in] path The path to process
+ *
+ * basename is implemented differently across different C libraries. This
+ * implementation matches the one provided by the GNU libc, and does not
+ * modify its input parameter.
+ *
+ * \return A pointer within the given path without any leading directory
+ * components.
+ */
+const char *basename(const char *path)
+{
+       const char *base = strrchr(path, '/');
+       return base ? base + 1 : path;
+}
+
+/**
+ * \fn libcamera::utils::make_unique(Args &&... args)
+ * \brief Constructs an object of type T and wraps it in a std::unique_ptr.
+ */
+
+} /* namespace utils */
+
+} /* namespace libcamera */