1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <regex.h>
int parse(const char *args)
{
char *dup, *p, *save_p;
regex_t preg;
# define NMATCH (3+1)
regmatch_t match[NMATCH];
const char *regexp = "([0-9]+):([0-9]+)-([0-9]+|\\+)";
if (!(dup = strdup(args))) {
fprintf(stderr, "failed to duplicate `%s'\n", args);
return 1;
}
if (regcomp(&preg, regexp, REG_EXTENDED)) {
fprintf(stderr, "failed to compile regexp `%s'\n", regexp);
free(dup);
return 2;
}
for (p = strtok_r(dup, ",", &save_p); p; p = strtok_r(NULL, ",", &save_p)) {
int number;
int begin;
int end;
int end_infinity = 0;
if (regexec(&preg, p, NMATCH, match, 0)) {
fprintf(stderr, "failed to match on `%s'\n", p);
regfree(&preg);
free(dup);
return 2;
}
/* given () start at 1 */
number = atoi(p+match[1].rm_so);
begin = atoi(p+match[2].rm_so);
if (p[match[2].rm_so] == '+')
end_infinity = 1;
else
end = atoi(p+match[3].rm_so);
printf("Found %d %d %d (in %s)\n", number, begin, end, p);
}
free(dup);
regfree(&preg);
return 0;
}
int main(void)
{
const char *args = "1:0-30,2:30-60,1:60-70,3:70-+";
parse(args);
return 0;
} |