summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak2012-03-30 16:11:31 +0200
committerKarel Zak2012-03-30 16:11:31 +0200
commita99c913091cdf0c392a959ecfe3505bc74a56155 (patch)
treea93b1d1afed6e0482e0e16fb2788bf108fe17235
parentdocs: clarify KiB vs. KB in man pages (diff)
downloadkernel-qcow2-util-linux-a99c913091cdf0c392a959ecfe3505bc74a56155.tar.gz
kernel-qcow2-util-linux-a99c913091cdf0c392a959ecfe3505bc74a56155.tar.xz
kernel-qcow2-util-linux-a99c913091cdf0c392a959ecfe3505bc74a56155.zip
lib/strutils: add strtosize_or_err, clean up
* add strtosize_or_err(), we use strtosize() + err() on many places * add STRTOXX_EXIT_CODE to overwrite the default EXIT_FAILURE * remove else-after-noreturn (e.g. if (foo) err(...); else err(...)) * clean up indent... Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r--include/strutils.h7
-rw-r--r--lib/strutils.c82
2 files changed, 52 insertions, 37 deletions
diff --git a/include/strutils.h b/include/strutils.h
index ef283dfed..3134fde9e 100644
--- a/include/strutils.h
+++ b/include/strutils.h
@@ -5,11 +5,18 @@
#include <string.h>
#include <sys/types.h>
+/* default strtoxx_or_err() exit code */
+#ifndef STRTOXX_EXIT_CODE
+# define STRTOXX_EXIT_CODE EXIT_FAILURE
+#endif
+
+
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);
+extern uintmax_t strtosize_or_err(const char *str, const char *errmesg);
#ifndef HAVE_STRNLEN
extern size_t strnlen(const char *s, size_t maxlen);
diff --git a/lib/strutils.c b/lib/strutils.c
index c40daf200..db1511023 100644
--- a/lib/strutils.c
+++ b/lib/strutils.c
@@ -184,60 +184,56 @@ double strtod_or_err(const char *str, const char *errmesg)
goto err;
return num;
- err:
+err:
if (errno)
- err(EXIT_FAILURE, "%s: '%s'", errmesg, str);
- else
- errx(EXIT_FAILURE, "%s: '%s'", errmesg, str);
- return 0;
+ err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
+
+ errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
}
/*
* same as strtol(3) but exit on failure instead of returning crap
*/
long strtol_or_err(const char *str, const char *errmesg)
{
- long num;
- char *end = NULL;
+ long num;
+ char *end = NULL;
- if (str == NULL || *str == '\0')
- goto err;
- errno = 0;
- num = strtol(str, &end, 10);
+ if (str == NULL || *str == '\0')
+ goto err;
+ errno = 0;
+ num = strtol(str, &end, 10);
- if (errno || str == end || (end && *end))
- goto err;
+ if (errno || str == end || (end && *end))
+ goto err;
- return num;
+ return num;
err:
- if (errno)
- err(EXIT_FAILURE, "%s: '%s'", errmesg, str);
- else
- errx(EXIT_FAILURE, "%s: '%s'", errmesg, str);
- return 0;
+ if (errno)
+ err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
+ errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
}
/*
* same as strtoll(3) but exit on failure instead of returning crap
*/
long long strtoll_or_err(const char *str, const char *errmesg)
{
- long long num;
- char *end = NULL;
+ long long num;
+ char *end = NULL;
- if (str == NULL || *str == '\0')
- goto err;
- errno = 0;
- num = strtoll(str, &end, 10);
+ if (str == NULL || *str == '\0')
+ goto err;
+ errno = 0;
+ num = strtoll(str, &end, 10);
- if (errno || str == end || (end && *end))
- goto err;
+ if (errno || str == end || (end && *end))
+ goto err;
- return num;
+ return num;
err:
- if (errno)
- err(EXIT_FAILURE, "%s: '%s'", errmesg, str);
- else
- errx(EXIT_FAILURE, "%s: '%s'", errmesg, str);
- return 0;
+ if (errno)
+ err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
+
+ errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
}
/*
* same as strtoul(3) but exit on failure instead of returning crap
@@ -258,10 +254,22 @@ unsigned long strtoul_or_err(const char *str, const char *errmesg)
return num;
err:
if (errno)
- err(EXIT_FAILURE, "%s: '%s'", errmesg, str);
- else
- errx(EXIT_FAILURE, "%s: '%s'", errmesg, str);
- return 0;
+ err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
+
+ errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
+}
+
+uintmax_t strtosize_or_err(const char *str, const char *errmesg)
+{
+ uintmax_t num;
+
+ if (strtosize(str, &num) == 0)
+ return num;
+
+ if (errno)
+ err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
+
+ errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
}
/*