4#ifndef SRC_SUPLA_PV_INVERTER_PARSER_H_
5#define SRC_SUPLA_PV_INVERTER_PARSER_H_
19inline bool onlyWhitespace(
const char *text) {
20 while (*text !=
'\0') {
21 if (!isspace(
static_cast<unsigned char>(*text++))) {
28template <
typename Number =
double,
typename Measurement>
29bool parseInverterValue(
const char *text,
31 Measurement *measurement) {
32 if (text ==
nullptr) {
37 double parsed = strtod(text, &end);
38 double maximum =
sizeof(Number) ==
sizeof(
float) ? FLT_MAX : DBL_MAX;
39 if (end == text || errno == ERANGE || !onlyWhitespace(end) ||
40 !isfinite(parsed) || parsed < -maximum || parsed > maximum) {
46 double scaled =
static_cast<Number
>(parsed) *
static_cast<Number
>(scale);
47 bool isSigned =
static_cast<Measurement
>(-1) <
static_cast<Measurement
>(1);
48 int digits =
sizeof(Measurement) * CHAR_BIT - (isSigned ? 1 : 0);
49 double upper = ldexp(1.0, digits);
50 double lower = isSigned ? -upper : 0;
51 if (!isfinite(scaled) || scaled < lower || scaled >= upper) {
54 *measurement =
static_cast<Measurement
>(scaled);