# HG changeset patch # User pang@sojourner.intellisis # Date 1269993664 25200 # Node ID 2b95aa9e4e46fe07715294971f4fb4dafcaadbff # Parent df03fa355b60ab3a64f28df546edccfbcdccf408 initial add rcg.c diff -r df03fa355b60 -r 2b95aa9e4e46 rcg.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rcg.c Tue Mar 30 17:01:04 2010 -0700 @@ -0,0 +1,78 @@ +#include +#include +#include + +#define __USE_GNU +#include + +const size_t BUFSIZE = 5000; +const size_t REMSIZE = 3; + +const char *CLR_START = "-CLR_START-"; +const char *CLR_END = "-CLR_END-"; + +int main(int argc, char **argv) +{ + char *buf = calloc(BUFSIZE, sizeof(char)); + + regex_t *re = calloc(1, sizeof(regex_t)); + regcomp(re, "(Hello)", REG_EXTENDED); + + regmatch_t *rem = calloc(REMSIZE, 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)); + unsigned int out_pos = 0; + + while (fgets(buf, BUFSIZE, stdin)) + { + regexec(re, buf, REMSIZE, rem, 0); + + int i; + + for (i = 0; i < REMSIZE; i++) + fprintf(stderr, "%d %d \n", rem[i].rm_so, rem[i].rm_eo); //d// 20100327 PBA + + for (i = 1; i < REMSIZE; i++) + { + int so = rem[i].rm_so; + int eo = rem[i].rm_eo; + int nso = BUFSIZE; + + if ((i + 1) < REMSIZE) + nso = rem[i + 1].rm_so; + if (nso == -1) + nso = BUFSIZE; + + 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) + { + strncpy(&out[out_pos], buf, so); + out_pos += so; + } + strncpy(&out[out_pos], CLR_START, CLR_START_len); + out_pos += CLR_START_len; + strncpy(&out[out_pos], &buf[so], 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; + } + } + + fputs(out, stdout); + } + + return 0; +}