Add util function to parse a list of integers
This will help parsing arguments like '1234:5678' into a list of integers.
This commit is contained in:
@@ -81,6 +81,35 @@ parse_integer(const char *s, long *out) {
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t
|
||||
parse_integers(const char *s, const char sep, size_t max_items, long *out) {
|
||||
size_t count = 0;
|
||||
char *endptr;
|
||||
do {
|
||||
errno = 0;
|
||||
long value = strtol(s, &endptr, 0);
|
||||
if (errno == ERANGE) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (endptr == s || (*endptr != sep && *endptr != '\0')) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
out[count++] = value;
|
||||
if (*endptr == sep) {
|
||||
if (count >= max_items) {
|
||||
// max items already reached, could not accept a new item
|
||||
return 0;
|
||||
}
|
||||
// parse the next token during the next iteration
|
||||
s = endptr + 1;
|
||||
}
|
||||
} while (*endptr != '\0');
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
bool
|
||||
parse_integer_with_suffix(const char *s, long *out) {
|
||||
char *endptr;
|
||||
|
||||
@@ -31,6 +31,11 @@ strquote(const char *src);
|
||||
bool
|
||||
parse_integer(const char *s, long *out);
|
||||
|
||||
// parse s as integers separated by sep (for example '1234:2000')
|
||||
// returns the number of integers on success, 0 on failure
|
||||
size_t
|
||||
parse_integers(const char *s, const char sep, size_t max_items, long *out);
|
||||
|
||||
// parse s as an integer into value
|
||||
// like parse_integer(), but accept 'k'/'K' (x1000) and 'm'/'M' (x1000000) as
|
||||
// suffix
|
||||
|
||||
Reference in New Issue
Block a user