int64_t denominator = 1;
int32_t fractional_len = 0;
int32_t exponent = 0;
+ int is_negative = 0;
errno = 0;
integral = g_ascii_strtoll(str, &endptr, 10);
- if (errno)
+ if (str == endptr && (str[0] == '-' || str[0] == '+') && str[1] == '.')
+ endptr += 1;
+ else if (errno)
return SR_ERR;
+ if (integral < 0 || str[0] == '-')
+ is_negative = 1;
+
if (*endptr == '.') {
const char* start = endptr + 1;
fractional = g_ascii_strtoll(start, &endptr, 10);
integral *= 10;
exponent -= fractional_len;
- if (integral >= 0)
+ if (!is_negative)
integral += fractional;
else
integral -= fractional;
test_rational("12.34", (struct sr_rational){1234, 100});
test_rational("-12.34", (struct sr_rational){-1234, 100});
test_rational("10.00", (struct sr_rational){1000, 100});
+ test_rational(".1", (struct sr_rational){1, 10});
+ test_rational("+0.1", (struct sr_rational){1, 10});
+ test_rational("+.1", (struct sr_rational){1, 10});
+ test_rational("-0.1", (struct sr_rational){-1, 10});
+ test_rational("-.1", (struct sr_rational){-1, 10});
}
END_TEST
test_rational("0.001e3", (struct sr_rational){1, 1});
test_rational("0.001e0", (struct sr_rational){1, 1000});
test_rational("0.001e-3", (struct sr_rational){1, 1000000});
+ test_rational("43.737E-3", (struct sr_rational){43737, 1000000});
+ test_rational("-0.1e-2", (struct sr_rational){-1, 1000});
+ test_rational("-.1e-2", (struct sr_rational){-1, 1000});
+ test_rational("-.0e-2", (struct sr_rational){0, 1000});
+ test_rational("+.0e-2", (struct sr_rational){0, 1000});
}
END_TEST