# HG changeset patch # User pang@apollo5.intellisis # Date 1270526571 25200 # Node ID 4efb50ce4c9cd44ea8b57fee4614cc867b800402 # Parent 2b95aa9e4e46fe07715294971f4fb4dafcaadbff rcg.c: expect only one match at a time from regexec() diff -r 2b95aa9e4e46 -r 4efb50ce4c9c rcg.c --- a/rcg.c Tue Mar 30 17:01:04 2010 -0700 +++ b/rcg.c Mon Apr 05 21:02:51 2010 -0700 @@ -6,7 +6,6 @@ #include const size_t BUFSIZE = 5000; -const size_t REMSIZE = 3; const char *CLR_START = "-CLR_START-"; const char *CLR_END = "-CLR_END-"; @@ -16,60 +15,60 @@ char *buf = calloc(BUFSIZE, sizeof(char)); regex_t *re = calloc(1, sizeof(regex_t)); - regcomp(re, "(Hello)", REG_EXTENDED); + regcomp(re, "Hello", REG_EXTENDED); - regmatch_t *rem = calloc(REMSIZE, sizeof(regmatch_t)); + regmatch_t *rem = calloc(1, sizeof(regmatch_t)); size_t CLR_START_len = strlen(CLR_START); size_t CLR_END_len = strlen(CLR_END); - size_t out_len = strlen(buf); - if (out_len >= BUFSIZE) - out_len = BUFSIZE - 1; - - char *out = calloc(out_len, sizeof(char)); + char *out = NULL; unsigned int out_pos = 0; + unsigned int buf_pos = 0; while (fgets(buf, BUFSIZE, stdin)) { - regexec(re, buf, REMSIZE, rem, 0); + int i = 0; + int so = -1; + int eo = -1; - int i; + do + { + regexec(re, &buf[buf_pos], 1, rem, 0); - for (i = 0; i < REMSIZE; i++) - fprintf(stderr, "%d %d \n", rem[i].rm_so, rem[i].rm_eo); //d// 20100327 PBA + size_t out_len = strlen(&buf[buf_pos]); + if (out_len >= (BUFSIZE - buf_pos)) + out_len = (BUFSIZE - buf_pos) - 1; - for (i = 1; i < REMSIZE; i++) - { - int so = rem[i].rm_so; - int eo = rem[i].rm_eo; - int nso = BUFSIZE; + so = rem[0].rm_so; + eo = rem[0].rm_eo; - if ((i + 1) < REMSIZE) - nso = rem[i + 1].rm_so; - if (nso == -1) - nso = BUFSIZE; + fprintf(stderr, "%d %d \n", so, eo); //d// 20100327 PBA if (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) + if (i++ == 0) { - strncpy(&out[out_pos], buf, so); + strncpy(out, buf, 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[so], match_len); + strncpy(&out[out_pos], &buf[buf_pos], match_len); out_pos += match_len; strncpy(&out[out_pos], CLR_END, CLR_END_len); out_pos += CLR_END_len; - strncpy(&out[out_pos], &buf[eo], nso - eo); - out_pos += nso - eo; + + buf_pos += match_len; } + else + strncpy(&out[out_pos], &buf[eo], out_len - out_pos); } + while (so >= 0 && eo >= 0); fputs(out, stdout); }