]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib: [strutils] add strtod_or_err() function
authorSami Kerola <kerolasa@iki.fi>
Sun, 25 Sep 2011 09:03:07 +0000 (11:03 +0200)
committerSami Kerola <kerolasa@iki.fi>
Thu, 29 Sep 2011 20:45:27 +0000 (22:45 +0200)
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
include/strutils.h
lib/strutils.c

index 08ba09c01c6faaf1f3fc2ed879ed5a9cc67ff769..dbcc3d904f881e7e99a2b159fa20b9dc44c86e6f 100644 (file)
@@ -6,6 +6,7 @@
 #include <sys/types.h>
 
 extern int strtosize(const char *str, uintmax_t *res);
+extern double strtod_or_err(const char *str, const char *errmesg);
 extern long strtol_or_err(const char *str, const char *errmesg);
 extern long long strtoll_or_err(const char *str, const char *errmesg);
 extern unsigned long strtoul_or_err(const char *str, const char *errmesg);
index da395e447237c364d374c8106f7e7cc21f0fdea6..aad9f77381216dfe1290faeae040fec604e525da 100644 (file)
@@ -167,6 +167,30 @@ char *strndup(const char *s, size_t n)
 }
 #endif
 
+/*
+ * 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;
+}
 /*
  * same as strtol(3) but exit on failure instead of returning crap
  */