void free_grep_patterns(struct grep_opt *opt) { struct grep_pat *p, *n; for (p = opt->pattern_list; p; p = n) { n = p->next; switch (p->token) { case GREP_PATTERN: /* atom */ case GREP_PATTERN_HEAD: case GREP_PATTERN_BODY: if (p->kws) kwsfree(p->kws); else if (p->pcre_regexp) free_pcre_regexp(p); else regfree(&p->regexp); free(p->pattern); break; default: break; } free(p); } if (!opt->extended) return; free_pattern_expr(opt->pattern_expression); }
static void diffcore_pickaxe_count(struct diff_options *o) { const char *needle = o->pickaxe; int opts = o->pickaxe_opts; unsigned long len = strlen(needle); regex_t regex, *regexp = NULL; kwset_t kws = NULL; if (opts & DIFF_PICKAXE_REGEX) { int err; err = regcomp(®ex, needle, REG_EXTENDED | REG_NEWLINE); if (err) { /* The POSIX.2 people are surely sick */ char errbuf[1024]; regerror(err, ®ex, errbuf, 1024); regfree(®ex); die("invalid pickaxe regex: %s", errbuf); } regexp = ®ex; } else { kws = kwsalloc(DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE) ? tolower_trans_tbl : NULL); kwsincr(kws, needle, len); kwsprep(kws); } pickaxe(&diff_queued_diff, o, regexp, kws, has_changes); if (opts & DIFF_PICKAXE_REGEX) regfree(®ex); else kwsfree(kws); return; }
/* Allocate and initialize a keyword set object, returning an opaque pointer to it. Return NULL if memory is not available. */ kwset_t kwsalloc (char const *trans) { struct kwset *kwset; kwset = (struct kwset *) malloc(sizeof (struct kwset)); if (!kwset) return 0; obstack_init(&kwset->obstack); kwset->words = 0; kwset->trie = (struct trie *) obstack_alloc(&kwset->obstack, sizeof (struct trie)); if (!kwset->trie) { kwsfree((kwset_t) kwset); return 0; } kwset->trie->accepting = 0; kwset->trie->links = 0; kwset->trie->parent = 0; kwset->trie->next = 0; kwset->trie->fail = 0; kwset->trie->depth = 0; kwset->trie->shift = 0; kwset->mind = INT_MAX; kwset->maxd = -1; kwset->target = 0; kwset->trans = trans; return (kwset_t) kwset; }
void dispose_fast_regex( struct fast_regex * fre_t ) { struct _fregex * fre = (struct _fregex *)( fre_t->data ) ; if( HAS_REGEX( fre_t->options ) ) { fre->regex.translate = NULL ; regfree( &fre->regex ) ; } if( HAS_DFA( fre_t->options ) ) dfafree( &fre->dfa ) ; if( fre->kwset ) kwsfree( fre->kwset ) ; }
void diffcore_pickaxe(struct diff_options *o) { const char *needle = o->pickaxe; int opts = o->pickaxe_opts; regex_t regex, *regexp = NULL; kwset_t kws = NULL; if (opts & (DIFF_PICKAXE_REGEX | DIFF_PICKAXE_KIND_G)) { int cflags = REG_EXTENDED | REG_NEWLINE; if (o->pickaxe_opts & DIFF_PICKAXE_IGNORE_CASE) cflags |= REG_ICASE; regcomp_or_die(®ex, needle, cflags); regexp = ®ex; } else if (opts & DIFF_PICKAXE_KIND_S) { if (o->pickaxe_opts & DIFF_PICKAXE_IGNORE_CASE && has_non_ascii(needle)) { struct strbuf sb = STRBUF_INIT; int cflags = REG_NEWLINE | REG_ICASE; basic_regex_quote_buf(&sb, needle); regcomp_or_die(®ex, sb.buf, cflags); strbuf_release(&sb); regexp = ®ex; } else { kws = kwsalloc(o->pickaxe_opts & DIFF_PICKAXE_IGNORE_CASE ? tolower_trans_tbl : NULL); kwsincr(kws, needle, strlen(needle)); kwsprep(kws); } } pickaxe(&diff_queued_diff, o, regexp, kws, (opts & DIFF_PICKAXE_KIND_G) ? diff_grep : has_changes); if (regexp) regfree(regexp); if (kws) kwsfree(kws); return; }