3 const DataType *ConfigKey::data_type() const
5 const struct sr_key_info *info = sr_key_info_get(SR_KEY_CONFIG, id());
7 throw Error(SR_ERR_NA);
8 return DataType::get(info->datatype);
11 std::string ConfigKey::identifier() const
13 const struct sr_key_info *info = sr_key_info_get(SR_KEY_CONFIG, id());
15 throw Error(SR_ERR_NA);
16 return valid_string(info->id);
19 std::string ConfigKey::description() const
21 const struct sr_key_info *info = sr_key_info_get(SR_KEY_CONFIG, id());
23 throw Error(SR_ERR_NA);
24 return valid_string(info->name);
27 const ConfigKey *ConfigKey::get_by_identifier(std::string identifier)
29 const struct sr_key_info *info = sr_key_info_name_get(SR_KEY_CONFIG, identifier.c_str());
31 throw Error(SR_ERR_ARG);
32 return get(info->key);
35 #ifndef HAVE_STOI_STOD
37 /* Fallback implementation of stoi and stod */
44 static inline int stoi( const std::string& str )
48 const long ret = std::strtol(str.c_str(), &endptr, 10);
49 if (endptr == str.c_str())
50 throw std::invalid_argument("stoi");
51 else if (errno == ERANGE ||
52 ret < std::numeric_limits<int>::min() ||
53 ret > std::numeric_limits<int>::max())
54 throw std::out_of_range("stoi");
59 static inline double stod( const std::string& str )
63 const double ret = std::strtod(str.c_str(), &endptr);
64 if (endptr == str.c_str())
65 throw std::invalid_argument("stod");
66 else if (errno == ERANGE)
67 throw std::out_of_range("stod");
75 /* Fallback implementation of stoul. */
82 static inline unsigned long stoul(const std::string &str)
87 ret = std::strtoul(str.c_str(), &endptr, 10);
88 if (endptr == str.c_str())
89 throw std::invalid_argument("stoul");
91 * TODO Convert to a larger/wider intermediate data type?
92 * Because after conversion into the very target type, the
93 * range check is assumed to be ineffective.
95 if (errno == ERANGE ||
96 ret < std::numeric_limits<unsigned long>::min() ||
97 ret > std::numeric_limits<unsigned long>::max())
98 throw std::out_of_range("stoul");
103 // Conversion from text to uint32_t, including a range check.
104 // This is sigrok specific, _not_ part of any C++ standard library.
105 static uint32_t stou32(const std::string &str)
111 throw std::out_of_range("stou32");
112 if (ret > std::numeric_limits<uint32_t>::max())
113 throw std::out_of_range("stou32");
117 Glib::VariantBase ConfigKey::parse_string(std::string value, enum sr_datatype dt)
125 check(sr_parse_sizestring(value.c_str(), &p));
126 variant = g_variant_new_uint64(p);
129 variant = g_variant_new_string(value.c_str());
132 variant = g_variant_new_boolean(sr_parse_boolstring(value.c_str()));
136 variant = g_variant_new_double(stod(value));
137 } catch (invalid_argument&) {
138 throw Error(SR_ERR_ARG);
141 case SR_T_RATIONAL_PERIOD:
142 check(sr_parse_period(value.c_str(), &p, &q));
143 variant = g_variant_new("(tt)", p, q);
145 case SR_T_RATIONAL_VOLT:
146 check(sr_parse_voltage(value.c_str(), &p, &q));
147 variant = g_variant_new("(tt)", p, q);
151 variant = g_variant_new_int32(stoi(value));
152 } catch (invalid_argument&) {
153 throw Error(SR_ERR_ARG);
158 variant = g_variant_new_uint32(stou32(value));
159 } catch (invalid_argument&) {
160 throw Error(SR_ERR_ARG);
164 throw Error(SR_ERR_BUG);
167 return Glib::VariantBase(variant, false);
170 Glib::VariantBase ConfigKey::parse_string(std::string value) const
172 enum sr_datatype dt = (enum sr_datatype)(data_type()->id());
173 return parse_string(value, dt);