int parse_ranges(char *str, int defmin, int defmax, int defmult, int (*parse_func)(), char **rangeptr, char **errptr); int range_min(char *rbuf, int r); int range_max(char *rbuf, int r); int range_mult(char *rbuf, int r);
num
or
min:max[:mult]
any of the values may be blank (ie. min::mult, :max, etc.) and default values for missing arguments may be supplied by the caller.
The special first form is short hand for 'num:num'.
After parsing the string, the ranges are put into an array of integers, which is malloc'd by the routine. The min, max, and mult entries of each range can be extracted from the array using the range_min(), range_max(), and range_mult() functions.
If range_ptr is not NULL, and parse_ranges() successfully parses the range string (ie. does not return -1), *range_ptr will point to space malloc'd by parse_ranges(). The user may free this space by calling free().
parse_ranges() parameters are:
int parse_func(char *str, int *val)
The function should return -1 if str cannot be parsed
into an integer, or >= 0 if it was successfully
parsed. The resulting integer will be stored in
*val. If parse_func is NULL, parse_ranges will parse
the tokens in a manner consistent with the the sscanf %i format.
range_min(), range_max(), and range_mult() parameters are:
/*
* simple example to take a list of ranges on the cmdline (in argv[1]), and
* print a random number from within that range.
*/
#include <stdio.h>
main()
{
extern intparse_ranges(), range_min(), range_max(), range_mult();
extern longrandom_range(), random_range_seed();
int min, max, mult, nranges;
char *ep, *rp;
random_range_seed(getpid());
if ((nranges = parse_ranges(argv[1], 0, INT_MAX, 1, NULL, &rp, &ep)) < 0) {
fprintf(stderr, "parse_ranges() failed: %s, ep);
exit(1);
}
range = random_range(0, nranges-1, 1);
min = range_min(rp, range);
max = range_max(rp, range);
mult = range_mult(rp, range);
fprintf("%d\n", random_range(min, max-1, mult));
exit(0);
}