[libcamera-devel] [PATCH 7/7] libcamera: yaml_parser: Add get() specializations for 16-bit integers
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Jun 16 16:24:03 CEST 2022
Extend the YamlObject::get() function template to support 16-bit
integers.
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
include/libcamera/internal/yaml_parser.h | 2 +
src/libcamera/yaml_parser.cpp | 61 ++++++++++++++++++++++++
2 files changed, 63 insertions(+)
diff --git a/include/libcamera/internal/yaml_parser.h b/include/libcamera/internal/yaml_parser.h
index 811be1affcc0..90d348eac74c 100644
--- a/include/libcamera/internal/yaml_parser.h
+++ b/include/libcamera/internal/yaml_parser.h
@@ -156,6 +156,8 @@ public:
typename std::enable_if_t<
std::is_same_v<bool, T> ||
std::is_same_v<double, T> ||
+ std::is_same_v<int16_t, T> ||
+ std::is_same_v<uint16_t, T> ||
std::is_same_v<int32_t, T> ||
std::is_same_v<uint32_t, T> ||
std::is_same_v<std::string, T> ||
diff --git a/src/libcamera/yaml_parser.cpp b/src/libcamera/yaml_parser.cpp
index bd4b501b1422..5c45e44e49c3 100644
--- a/src/libcamera/yaml_parser.cpp
+++ b/src/libcamera/yaml_parser.cpp
@@ -138,6 +138,67 @@ bool YamlObject::get(const bool &defaultValue, bool *ok) const
return defaultValue;
}
+template<>
+int16_t YamlObject::get(const int16_t &defaultValue, bool *ok) const
+{
+ setOk(ok, false);
+
+ if (type_ != Type::Value)
+ return defaultValue;
+
+ if (value_ == "")
+ return defaultValue;
+
+ char *end;
+
+ errno = 0;
+ int16_t value = std::strtol(value_.c_str(), &end, 10);
+
+ if ('\0' != *end || errno == ERANGE ||
+ value < std::numeric_limits<int16_t>::min() ||
+ value > std::numeric_limits<int16_t>::max())
+ return defaultValue;
+
+ setOk(ok, true);
+ return value;
+}
+
+template<>
+uint16_t YamlObject::get(const uint16_t &defaultValue, bool *ok) const
+{
+ setOk(ok, false);
+
+ if (type_ != Type::Value)
+ return defaultValue;
+
+ if (value_ == "")
+ return defaultValue;
+
+ /*
+ * libyaml parses all scalar values as strings. When a string has
+ * leading spaces before a minus sign, for example " -10", strtoul
+ * skips leading spaces, accepts the leading minus sign, and the
+ * calculated digits are negated as if by unary minus. Rule it out in
+ * case the user gets a large number when the value is negative.
+ */
+ std::size_t found = value_.find_first_not_of(" \t");
+ if (found != std::string::npos && value_[found] == '-')
+ return defaultValue;
+
+ char *end;
+
+ errno = 0;
+ uint16_t value = std::strtoul(value_.c_str(), &end, 10);
+
+ if ('\0' != *end || errno == ERANGE ||
+ value < std::numeric_limits<uint16_t>::min() ||
+ value > std::numeric_limits<uint16_t>::max())
+ return defaultValue;
+
+ setOk(ok, true);
+ return value;
+}
+
template<>
int32_t YamlObject::get(const int32_t &defaultValue, bool *ok) const
{
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list