int32_t fractional_len = 0;
int32_t exponent = 0;
bool is_negative = false;
+ bool no_integer, no_fractional;
+
+ while (isspace(*str))
+ str++;
errno = 0;
integral = g_ascii_strtoll(str, &endptr, 10);
- if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.')
+ if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.') {
endptr += 1;
- else if (errno)
+ no_integer = true;
+ } else if (str == endptr && str[0] == '.') {
+ no_integer = true;
+ } else if (errno) {
return SR_ERR;
+ } else {
+ no_integer = false;
+ }
if (integral < 0 || str[0] == '-')
is_negative = true;
+ errno = 0;
if (*endptr == '.') {
- const char* start = endptr + 1;
+ bool is_exp, is_eos;
+ const char *start = endptr + 1;
fractional = g_ascii_strtoll(start, &endptr, 10);
+ is_exp = *endptr == 'E' || *endptr == 'e';
+ is_eos = *endptr == '\0';
+ if (endptr == start && (is_exp || is_eos)) {
+ fractional = 0;
+ errno = 0;
+ }
if (errno)
return SR_ERR;
+ no_fractional = endptr == start;
+ if (no_integer && no_fractional)
+ return SR_ERR;
fractional_len = endptr - start;
}
+ errno = 0;
if ((*endptr == 'E') || (*endptr == 'e')) {
exponent = g_ascii_strtoll(endptr + 1, &endptr, 10);
if (errno)