pang@1: #include pang@1: #include pang@1: #include pang@1: pang@1: #define __USE_GNU pang@1: #include pang@1: paulo@4: #include paulo@4: paulo@4: #define _GNU_SOURCE paulo@4: #include paulo@4: 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: paulo@4: typedef enum _exit_code { paulo@4: EXIT_OK, paulo@4: EXIT_REALLOC_ERROR, paulo@4: EXIT_ARGS_ERROR, paulo@4: } Exit_code; paulo@4: paulo@3: int re_error(int errcode, const regex_t *re) paulo@3: { paulo@3: char *err_string = calloc(BUFSIZE, sizeof(char)); paulo@3: regerror(errcode, re, err_string, BUFSIZE*sizeof(char)); paulo@3: fprintf(stderr, "%s \n", err_string); paulo@3: free(err_string); paulo@3: return errcode; paulo@3: } paulo@3: paulo@4: Exit_code realloc_error() paulo@3: { paulo@3: fprintf(stderr, "realloc() failure \n"); paulo@4: return EXIT_REALLOC_ERROR; paulo@4: } paulo@4: paulo@4: Exit_code args_error() paulo@4: { paulo@4: fprintf(stderr, "Invalid or nonexistent argument. \n"); paulo@4: return EXIT_ARGS_ERROR; paulo@4: } paulo@4: paulo@4: // returns regular expression argument paulo@4: char *parseArgs(int argc, char **argv) paulo@4: { paulo@4: static struct option long_options[] = paulo@4: { paulo@4: { 0, 0, 0, 0 }, paulo@4: }; paulo@4: paulo@4: int c; paulo@4: int l; paulo@4: while ((c = getopt_long(argc, argv, "", long_options, &l)) >= 0) paulo@4: { paulo@4: } paulo@4: paulo@4: if (optind >= argc) paulo@4: exit(args_error()); paulo@4: paulo@4: return argv[optind]; paulo@3: } paulo@3: pang@1: int main(int argc, char **argv) pang@1: { paulo@4: char *re_expression = parseArgs(argc, argv); paulo@4: paulo@4: fprintf(stderr, "re_expression = %s \n", re_expression); //d/ 20100405 PBA paulo@4: pang@1: char *buf = calloc(BUFSIZE, sizeof(char)); pang@1: paulo@3: int re_err; pang@1: regex_t *re = calloc(1, sizeof(regex_t)); paulo@4: re_err = regcomp(re, re_expression, REG_EXTENDED); paulo@3: if (re_err != 0) paulo@3: exit(re_error(re_err, re)); 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@1: while (fgets(buf, BUFSIZE, stdin)) pang@1: { pang@2: int so = -1; pang@2: int eo = -1; pang@1: paulo@3: size_t out_len = strlen(buf); paulo@3: char *out = calloc(out_len, sizeof(char)); paulo@3: unsigned int out_pos = 0; paulo@3: unsigned int buf_pos = 0; paulo@3: paulo@4: for (re_err = 0; re_err != REG_NOMATCH;) pang@2: { paulo@3: re_err = regexec(re, &buf[buf_pos], 1, rem, 0); pang@1: paulo@3: //fprintf(stderr, "%s", &buf[buf_pos]); //d// 20100405 PBA paulo@3: 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: paulo@3: //fprintf(stderr, "%d %d \n", so, eo); //d// 20100327 PBA pang@1: paulo@3: if (re_err != REG_NOMATCH && 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)); paulo@3: if (!out) paulo@3: exit(realloc_error()); paulo@3: strncpy(&out[out_pos], &buf[buf_pos], so); paulo@3: out_pos += so; paulo@3: buf_pos += so; 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 paulo@3: strncpy(&out[out_pos], &buf[buf_pos], out_len - out_pos); pang@1: } pang@1: pang@1: fputs(out, stdout); paulo@3: free(out); pang@1: } pang@1: paulo@4: return EXIT_OK; pang@1: }