summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2009-11-19 00:46:47 +0100
committerLennart Poettering <lennart@poettering.net>2009-11-19 00:46:47 +0100
commit852618039bea9f6fa851a0ae3101f79b65d3cf6b (patch)
tree59d51b9de6193942f06de1b122f0b35777b554e7 /util.c
parente1cc7a01bb4663b4aea307cf22368bb5568a9e46 (diff)
util: add parsers for boolean and integers
Diffstat (limited to 'util.c')
-rw-r--r--util.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/util.c b/util.c
index 3ef190fa2a..bcb608480f 100644
--- a/util.c
+++ b/util.c
@@ -4,6 +4,7 @@
#include <string.h>
#include <unistd.h>
#include <errno.h>
+#include <stdlib.h>
#include "macro.h"
#include "util.h"
@@ -93,3 +94,54 @@ int nointr_close(int fd) {
return r;
}
}
+
+int parse_boolean(const char *v) {
+ assert(v);
+
+ if (!strcmp(v, "1") || v[0] == 'y' || v[0] == 'Y' || v[0] == 't' || v[0] == 'T' || !strcasecmp(v, "on"))
+ return 1;
+ else if (!strcmp(v, "0") || v[0] == 'n' || v[0] == 'N' || v[0] == 'f' || v[0] == 'F' || !strcasecmp(v, "off"))
+ return 0;
+
+ return -EINVAL;
+}
+
+int safe_atou(const char *s, unsigned *ret_u) {
+ char *x = NULL;
+ unsigned l;
+
+ assert(s);
+ assert(ret_u);
+
+ errno = 0;
+ l = strtoul(s, &x, 0);
+
+ if (!x || *x || errno)
+ return errno ? -errno : -EINVAL;
+
+ if ((unsigned) l != l)
+ return -ERANGE;
+
+ *ret_u = (unsigned) l;
+ return 0;
+}
+
+int safe_atoi(const char *s, int *ret_i) {
+ char *x = NULL;
+ int l;
+
+ assert(s);
+ assert(ret_i);
+
+ errno = 0;
+ l = strtol(s, &x, 0);
+
+ if (!x || *x || errno)
+ return errno ? -errno : -EINVAL;
+
+ if ((int) l != l)
+ return -ERANGE;
+
+ *ret_i = (unsigned) l;
+ return 0;
+}