static int file_callback(const struct option *opt, const char *arg, int unset) { struct grep_opt *grep_opt = opt->value; int from_stdin = !strcmp(arg, "-"); FILE *patterns; int lno = 0; struct strbuf sb = STRBUF_INIT; patterns = from_stdin ? stdin : fopen(arg, "r"); if (!patterns) die_errno(_("cannot open '%s'"), arg); while (strbuf_getline(&sb, patterns, '\n') == 0) { char *s; size_t len; /* ignore empty line like grep does */ if (sb.len == 0) continue; s = strbuf_detach(&sb, &len); append_grep_pat(grep_opt, s, len, arg, ++lno, GREP_PATTERN); } if (!from_stdin) fclose(patterns); strbuf_release(&sb); return 0; }
struct grep_opt *grep_opt_dup(const struct grep_opt *opt) { struct grep_pat *pat; struct grep_opt *ret = xmalloc(sizeof(struct grep_opt)); *ret = *opt; ret->pattern_list = NULL; ret->pattern_tail = &ret->pattern_list; for(pat = opt->pattern_list; pat != NULL; pat = pat->next) { if(pat->token == GREP_PATTERN_HEAD) append_header_grep_pattern(ret, pat->field, pat->pattern); else append_grep_pat(ret, pat->pattern, pat->patternlen, pat->origin, pat->no, pat->token); } return ret; }
void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t) { append_grep_pat(opt, pat, strlen(pat), origin, no, t); }