basic/parse-util: add helper to parse bounded unsigned values
"parse_range" is already used for stuff like "a-b", so use "bounded" here to avoid confusion.
This commit is contained in:
@@ -425,6 +425,21 @@ int safe_atou_full(const char *s, unsigned base, unsigned *ret_u) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int safe_atou_bounded(const char *s, unsigned min, unsigned max, unsigned *ret) {
|
||||
unsigned v;
|
||||
int r;
|
||||
|
||||
r = safe_atou(s, &v);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (v < min || v > max)
|
||||
return -ERANGE;
|
||||
|
||||
*ret = v;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int safe_atoi(const char *s, int *ret_i) {
|
||||
unsigned base = 0;
|
||||
char *x = NULL;
|
||||
|
||||
@@ -30,11 +30,12 @@ int parse_fd(const char *t);
|
||||
#define SAFE_ATO_MASK_FLAGS(base) ((base) & ~SAFE_ATO_ALL_FLAGS)
|
||||
|
||||
int safe_atou_full(const char *s, unsigned base, unsigned *ret_u);
|
||||
|
||||
static inline int safe_atou(const char *s, unsigned *ret_u) {
|
||||
return safe_atou_full(s, 0, ret_u);
|
||||
}
|
||||
|
||||
int safe_atou_bounded(const char *s, unsigned min, unsigned max, unsigned *ret);
|
||||
|
||||
int safe_atoi(const char *s, int *ret_i);
|
||||
int safe_atolli(const char *s, long long int *ret_i);
|
||||
|
||||
|
||||
@@ -417,6 +417,32 @@ TEST(parse_range) {
|
||||
assert_se(upper == 9999);
|
||||
}
|
||||
|
||||
TEST(safe_atou_bounded) {
|
||||
int r;
|
||||
unsigned x;
|
||||
|
||||
r = safe_atou_bounded("12345", 12, 20000, &x);
|
||||
assert_se(r == 0);
|
||||
assert_se(x == 12345);
|
||||
|
||||
r = safe_atou_bounded("12", 12, 20000, &x);
|
||||
assert_se(r == 0);
|
||||
assert_se(x == 12);
|
||||
|
||||
r = safe_atou_bounded("20000", 12, 20000, &x);
|
||||
assert_se(r == 0);
|
||||
assert_se(x == 20000);
|
||||
|
||||
r = safe_atou_bounded("-1", 12, 20000, &x);
|
||||
assert_se(r == -ERANGE);
|
||||
|
||||
r = safe_atou_bounded("11", 12, 20000, &x);
|
||||
assert_se(r == -ERANGE);
|
||||
|
||||
r = safe_atou_bounded("20001", 12, 20000, &x);
|
||||
assert_se(r == -ERANGE);
|
||||
}
|
||||
|
||||
TEST(safe_atolli) {
|
||||
int r;
|
||||
long long l;
|
||||
|
||||
Reference in New Issue
Block a user