pang@1: #include pang@1: #include pang@1: #include pang@1: pang@1: #define __USE_GNU pang@1: #include pang@1: pang@1: const size_t BUFSIZE = 5000; pang@1: pang@1: const char *CLR_START = "-CLR_START-"; pang@1: const char *CLR_END = "-CLR_END-"; pang@1: pang@1: int main(int argc, char **argv) pang@1: { pang@1: char *buf = calloc(BUFSIZE, sizeof(char)); pang@1: pang@1: regex_t *re = calloc(1, sizeof(regex_t)); pang@2: regcomp(re, "Hello", REG_EXTENDED); pang@1: pang@2: regmatch_t *rem = calloc(1, sizeof(regmatch_t)); pang@1: pang@1: size_t CLR_START_len = strlen(CLR_START); pang@1: size_t CLR_END_len = strlen(CLR_END); pang@1: pang@2: char *out = NULL; pang@1: unsigned int out_pos = 0; pang@2: unsigned int buf_pos = 0; pang@1: pang@1: while (fgets(buf, BUFSIZE, stdin)) pang@1: { pang@2: int i = 0; pang@2: int so = -1; pang@2: int eo = -1; pang@1: pang@2: do pang@2: { pang@2: regexec(re, &buf[buf_pos], 1, rem, 0); pang@1: pang@2: size_t out_len = strlen(&buf[buf_pos]); pang@2: if (out_len >= (BUFSIZE - buf_pos)) pang@2: out_len = (BUFSIZE - buf_pos) - 1; pang@1: pang@2: so = rem[0].rm_so; pang@2: eo = rem[0].rm_eo; pang@1: pang@2: fprintf(stderr, "%d %d \n", so, eo); //d// 20100327 PBA pang@1: pang@1: if (so >= 0 && eo >= 0) pang@1: { pang@1: int match_len = eo - so; pang@1: out_len += CLR_START_len + CLR_END_len; pang@1: out = (char *)realloc(out, out_len*sizeof(char)); pang@2: if (i++ == 0) pang@1: { pang@2: strncpy(out, buf, so); pang@1: out_pos += so; pang@2: buf_pos += so; pang@1: } pang@1: strncpy(&out[out_pos], CLR_START, CLR_START_len); pang@1: out_pos += CLR_START_len; pang@2: strncpy(&out[out_pos], &buf[buf_pos], match_len); pang@1: out_pos += match_len; pang@1: strncpy(&out[out_pos], CLR_END, CLR_END_len); pang@1: out_pos += CLR_END_len; pang@2: pang@2: buf_pos += match_len; pang@1: } pang@2: else pang@2: strncpy(&out[out_pos], &buf[eo], out_len - out_pos); pang@1: } pang@2: while (so >= 0 && eo >= 0); pang@1: pang@1: fputs(out, stdout); pang@1: } pang@1: pang@1: return 0; pang@1: }