# HG changeset patch # User paulo@twcdns.fastsearch.net # Date 1270532257 25200 # Node ID fe4b316b43860c30f27b4f653e81902f4f0321fc # Parent 4efb50ce4c9cd44ea8b57fee4614cc867b800402 rcg.c: working multiple regexec matches; couple of error handling functions diff -r 4efb50ce4c9c -r fe4b316b4386 rcg.c --- a/rcg.c Mon Apr 05 21:02:51 2010 -0700 +++ b/rcg.c Mon Apr 05 22:37:37 2010 -0700 @@ -10,52 +10,71 @@ const char *CLR_START = "-CLR_START-"; const char *CLR_END = "-CLR_END-"; +int re_error(int errcode, const regex_t *re) +{ + char *err_string = calloc(BUFSIZE, sizeof(char)); + regerror(errcode, re, err_string, BUFSIZE*sizeof(char)); + fprintf(stderr, "%s \n", err_string); + free(err_string); + return errcode; +} + +int realloc_error() +{ + fprintf(stderr, "realloc() failure \n"); + return 1; +} + int main(int argc, char **argv) { char *buf = calloc(BUFSIZE, sizeof(char)); + int re_err; regex_t *re = calloc(1, sizeof(regex_t)); - regcomp(re, "Hello", REG_EXTENDED); + re_err = regcomp(re, "Hello", REG_EXTENDED); + if (re_err != 0) + exit(re_error(re_err, re)); regmatch_t *rem = calloc(1, sizeof(regmatch_t)); size_t CLR_START_len = strlen(CLR_START); size_t CLR_END_len = strlen(CLR_END); - char *out = NULL; - unsigned int out_pos = 0; - unsigned int buf_pos = 0; while (fgets(buf, BUFSIZE, stdin)) { - int i = 0; int so = -1; int eo = -1; - do + size_t out_len = strlen(buf); + char *out = calloc(out_len, sizeof(char)); + unsigned int out_pos = 0; + unsigned int buf_pos = 0; + + while (re_err != REG_NOMATCH) { - regexec(re, &buf[buf_pos], 1, rem, 0); + re_err = regexec(re, &buf[buf_pos], 1, rem, 0); - size_t out_len = strlen(&buf[buf_pos]); + //fprintf(stderr, "%s", &buf[buf_pos]); //d// 20100405 PBA + if (out_len >= (BUFSIZE - buf_pos)) out_len = (BUFSIZE - buf_pos) - 1; so = rem[0].rm_so; eo = rem[0].rm_eo; - fprintf(stderr, "%d %d \n", so, eo); //d// 20100327 PBA + //fprintf(stderr, "%d %d \n", so, eo); //d// 20100327 PBA - if (so >= 0 && eo >= 0) + if (re_err != REG_NOMATCH && so >= 0 && eo >= 0) { int match_len = eo - so; out_len += CLR_START_len + CLR_END_len; out = (char *)realloc(out, out_len*sizeof(char)); - if (i++ == 0) - { - strncpy(out, buf, so); - out_pos += so; - buf_pos += so; - } + if (!out) + exit(realloc_error()); + strncpy(&out[out_pos], &buf[buf_pos], so); + out_pos += so; + buf_pos += so; strncpy(&out[out_pos], CLR_START, CLR_START_len); out_pos += CLR_START_len; strncpy(&out[out_pos], &buf[buf_pos], match_len); @@ -66,11 +85,11 @@ buf_pos += match_len; } else - strncpy(&out[out_pos], &buf[eo], out_len - out_pos); + strncpy(&out[out_pos], &buf[buf_pos], out_len - out_pos); } - while (so >= 0 && eo >= 0); fputs(out, stdout); + free(out); } return 0;