diff --git a/include/strutils.h b/include/strutils.h index b2f9a906..e36048d0 100644 --- a/include/strutils.h +++ b/include/strutils.h @@ -6,5 +6,6 @@ #define PROCPS_NG_STRUTILS extern long strtol_or_err(const char *str, const char *errmesg); +extern double strtod_or_err(const char *str, const char *errmesg); #endif diff --git a/lib/strutils.c b/lib/strutils.c index 53dcc75c..65ef998f 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -29,6 +29,30 @@ long strtol_or_err(const char *str, const char *errmesg) else errx(EXIT_FAILURE, "%s: '%s'", errmesg, str); } +/* + * same as strtod(3) but exit on failure instead of returning crap + */ +double strtod_or_err(const char *str, const char *errmesg) +{ + double num; + char *end = NULL; + + if (str == NULL || *str == '\0') + goto err; + errno = 0; + num = strtod(str, &end); + + if (errno || str == end || (end && *end)) + goto err; + + return num; + err: + if (errno) + err(EXIT_FAILURE, "%s: '%s'", errmesg, str); + else + errx(EXIT_FAILURE, "%s: '%s'", errmesg, str); + return 0; +} #ifdef TEST_PROGRAM int main(int argc, char *argv[])