#include #ifndef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif /* MIN */ #ifndef MAX #define MAX(a, b) ((a) > (b) ? (a) : (b)) #endif /* MAX */ #ifndef ARRAY_SIZE #define ARRAY_SIZE(a) (sizeof (a) / sizeof (a)[0]) #endif /* ARRAY_SIZE */ int parse_range_list(const char *str, int *val, size_t n_val) { int i, ret = 0; unsigned int a, b; int n1, n2; while (*str) { switch (sscanf(str, "%u%n-%u%n", &a, &n1, &b, &n2)) { case -1: perror("sscanf"); return -1; case 0: goto invalid; case 1: if (a >= n_val) goto invalid; val[a] = 1; ret++; str += n1; break; case 2: if (a >= n_val || b >= n_val) goto invalid; for (i = MIN(a, b); i <= MAX(a, b); i++) { val[i] = 1; ret++; } str += n2; break; } if (',' == *str) str++; else if (*str) goto invalid; } return ret; invalid: fprintf(stderr, "invalid input at '%.5s'\n", str); return -1; } int main(int argc,const char *argv[]) { int i, val[16]; if (argc < 2) { fprintf(stderr, "usage: %s int[-int][,...]\n", *argv); return 1; } memset(val, 0, sizeof val); i = parse_range_list(argv[1], val, ARRAY_SIZE(val)); if (-1 == i) return 2; printf("parse_range_list() returns %d\n", i); for (i = 0; i < ARRAY_SIZE(val); i++) printf("val[%d]=%d\n", i, val[i]); return 0; }