[libcamera-devel] [PATCH v1 2/2] libcamera: base: utils: Support C libraries lacking locale support
Jacopo Mondi
jacopo at jmondi.org
Tue Jan 10 09:13:53 CET 2023
Hi Laurent
On Sun, Jan 08, 2023 at 11:43:57PM +0200, Laurent Pinchart via libcamera-devel wrote:
> Not all C libraries include support for locale objects (locale_t) and
> the strto*_l() family of functions. A notable example is uClibc that can
> be compiled with a hardcoded "C" locale. Compilation then fails as the
> newlocale(), freelocale() and strtod_l() functions are not defined.
>
> Fix the compilation breakage by checking for the availability of
> newlocale(), and fall back to strtod() when the function isn't
> available. This may not lead to the correct result if support for locale
> objects isn't available and the locale isn't hardcoded to "C", but that
> is such a corner case that we will likely never encounter it.
>
> Fixes: e8ae254970cf ("libcamera: yaml_parser: Use C locale")
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> meson.build | 4 ++++
> src/libcamera/base/utils.cpp | 12 ++++++++++++
> 2 files changed, 16 insertions(+)
>
> diff --git a/meson.build b/meson.build
> index e86673dd5c0c..7dcd34d3e6b3 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -72,6 +72,10 @@ if cc.has_header_symbol('unistd.h', 'issetugid')
> config_h.set('HAVE_ISSETUGID', 1)
> endif
>
> +if cc.has_header_symbol('locale.h', 'newlocale', prefix : '#define _GNU_SOURCE')
> + config_h.set('HAVE_NEWLOCALE', 1)
> +endif
> +
> if cc.has_header_symbol('stdlib.h', 'secure_getenv', prefix : '#define _GNU_SOURCE')
> config_h.set('HAVE_SECURE_GETENV', 1)
> endif
> diff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp
> index 4a239427a4d9..ac3e1311995e 100644
> --- a/src/libcamera/base/utils.cpp
> +++ b/src/libcamera/base/utils.cpp
> @@ -464,6 +464,8 @@ std::string toAscii(const std::string &str)
> * \a b
> */
>
> +#if HAVE_NEWLOCALE
> +
Just bikeshedding on the NEWLOCALE symbol. "New" to implies there's an
old vs new version, while you're just here checking that locale is
supported. Maybe just HAVE_LOCALE ?
Apart from this:
Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
Thanks
j
> namespace {
>
> /*
> @@ -493,6 +495,8 @@ Locale cLocale("C");
>
> } /* namespace */
>
> +#endif /* HAVE_NEWLOCALE */
> +
> /**
> * \brief Convert a string to a double independently of the current locale
> * \param[in] nptr The string to convert
> @@ -506,7 +510,15 @@ Locale cLocale("C");
> */
> double strtod(const char *__restrict nptr, char **__restrict endptr)
> {
> +#if HAVE_NEWLOCALE
> return strtod_l(nptr, endptr, cLocale.locale());
> +#else
> + /*
> + * If the libc implementation doesn't provide locale object support,
> + * assume that strtod() is locale-independent.
> + */
> + return strtod(nptr, endptr);
> +#endif
> }
>
> } /* namespace utils */
> --
> Regards,
>
> Laurent Pinchart
>
More information about the libcamera-devel
mailing list