extern int ul_strtou64(const char *str, uint64_t *num, int base);
extern int ul_strtos32(const char *str, int32_t *num, int base);
extern int ul_strtou32(const char *str, uint32_t *num, int base);
+extern int ul_strtold(const char *str, long double *num);
extern int64_t str2num_or_err(const char *str, int base, const char *errmesg, int64_t low, int64_t up);
extern uint64_t str2unum_or_err(const char *str, int base, const char *errmesg, uint64_t up);
errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
}
-long double strtold_or_err(const char *str, const char *errmesg)
+int ul_strtold(const char *str, long double *num)
{
- double num;
char *end = NULL;
errno = 0;
if (str == NULL || *str == '\0')
- goto err;
- num = strtold(str, &end);
+ return -(errno = EINVAL);
+ *num = strtold(str, &end);
- if (errno || str == end || (end && *end))
- goto err;
+ if (errno != 0)
+ return -errno;
+ if (str == end || (end && *end))
+ return -(errno = EINVAL);
+ return 0;
+}
- return num;
-err:
+long double strtold_or_err(const char *str, const char *errmesg)
+{
+ long double num = 0;
+
+ if (ul_strtold(str, &num) == 0)
+ return num;
if (errno == ERANGE)
err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);