summaryrefslogtreecommitdiff
path: root/src/libcamera/yaml_parser.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2023-01-05 14:07:54 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2023-01-10 15:39:18 +0200
commit0e3b8d71f590d93540b2e6a6500cc7739f7199e9 (patch)
tree5d0665694004bf0963bb91cce133f29b578b764a /src/libcamera/yaml_parser.cpp
parent2535e31d9ec548aacbbee8307f4ab6f330d7c17d (diff)
base: utils: Add and use strtod() helper
The strtod() function is locale-dependent, and thus ill-suited to parse numbers coming from, for instance, YAML files. The YamlObject class uses strtod_l() to fix that issue, but that function is not available with all libc implementations. Correctly handling this problem is becoming out of scope for the YamlObject class. As a first step, add a strtod() helper function in the utils namespace that copies the implementation from YamlObject, and use it in YamlObject. The core issue will then be fixed in utils::strtod(). Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/libcamera/yaml_parser.cpp')
-rw-r--r--src/libcamera/yaml_parser.cpp34
1 files changed, 1 insertions, 33 deletions
diff --git a/src/libcamera/yaml_parser.cpp b/src/libcamera/yaml_parser.cpp
index 2806c591..153a6d53 100644
--- a/src/libcamera/yaml_parser.cpp
+++ b/src/libcamera/yaml_parser.cpp
@@ -31,38 +31,6 @@ namespace {
/* Empty static YamlObject as a safe result for invalid operations */
static const YamlObject empty;
-/*
- * Construct a global RAII locale for use by all YAML parser instances to
- * ensure consistency when parsing configuration files and types regardless of
- * the system locale configuration.
- *
- * For more information see:
- * - https://bugs.libcamera.org/show_bug.cgi?id=174
- */
-class Locale
-{
-public:
- Locale(const char *locale)
- {
- locale_ = newlocale(LC_ALL_MASK, locale, static_cast<locale_t>(0));
- if (locale_ == static_cast<locale_t>(0))
- LOG(YamlParser, Fatal)
- << "Failed to construct a locale";
- }
-
- ~Locale()
- {
- freelocale(locale_);
- }
-
- locale_t locale() { return locale_; }
-
-private:
- locale_t locale_;
-};
-
-Locale yamlLocale("C");
-
} /* namespace */
/**
@@ -315,7 +283,7 @@ std::optional<double> YamlObject::get() const
char *end;
errno = 0;
- double value = strtod_l(value_.c_str(), &end, yamlLocale.locale());
+ double value = utils::strtod(value_.c_str(), &end);
if ('\0' != *end || errno == ERANGE)
return std::nullopt;