![]() |
Linux
Application Development |
Michael K. Johnson Erik W. Troan |
/* match.c Gathering of Sec. 21.2 code snippets (thanks to Robert Lynch). */
#include <sys/types.h>
#include <regex.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void do_regerror(int errcode, const regex_t *preg);
int main() {
regex_t p;
regmatch_t *pmatch;
int rcomp_err, rexec_err;
char string[BUFSIZ+1];
int i;
rcomp_err = regcomp(&p, "(^(.*[^\\])#.*$)|(^[^#]+$)",
REG_EXTENDED | REG_NEWLINE);
if(rcomp_err) {
do_regerror(rcomp_err, &p);
}
pmatch = alloca(sizeof(regmatch_t) * (p.re_nsub+1));
if(!pmatch) {
perror("alloca");
}
printf("Input a string: ");
fgets(string, sizeof(string), stdin);
rexec_err = regexec(&p, string, p.re_nsub+1, pmatch, 0);
if(rexec_err) {
do_regerror(rexec_err, &p);
} else {
/* match succeeded */
for(i = 0; i <= p.re_nsub; i++) {
/* print the matching portion(s) of the string */
if(pmatch[i].rm_so != -1) {
char * submatch;
size_t matchlen = pmatch[i].rm_eo - pmatch[i].rm_so;
submatch = malloc(matchlen+1);
strncpy(submatch, string+pmatch[i].rm_so, matchlen);
submatch[matchlen] = '\0';
printf("match %i: %s\n", i, submatch);
free(submatch);
}
}
}
exit(0);
}
void do_regerror(int errcode, const regex_t *preg) {
char *errbuf;
size_t errbuf_size;
errbuf_size = regerror(errcode, preg, NULL, 0); /* missing ; */
errbuf = alloca(errbuf_size);
if(!errbuf) {
perror("alloca");
return;
}
regerror(errcode, preg, errbuf, errbuf_size);
fprintf(stderr, "%s\n", errbuf);
}