util: add parsers for boolean and integers

This commit is contained in:
Lennart Poettering 2009-11-19 00:46:47 +01:00
parent e1cc7a01bb
commit 852618039b
2 changed files with 57 additions and 0 deletions

52
util.c
View file

@ -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;
}

5
util.h
View file

@ -46,4 +46,9 @@ bool startswith(const char *s, const char *prefix);
int nointr_close(int fd);
int parse_boolean(const char *v);
int safe_atou(const char *s, unsigned *ret_u);
int safe_atoi(const char *s, int *ret_i);
#endif