static int diff_grep(mmfile_t *one, mmfile_t *two, struct diff_options *o, regex_t *regexp, kwset_t kws) { regmatch_t regmatch; struct diffgrep_cb ecbdata; xpparam_t xpp; xdemitconf_t xecfg; if (!one) return !regexec(regexp, two->ptr, 1, ®match, 0); if (!two) return !regexec(regexp, one->ptr, 1, ®match, 0); /* * We have both sides; need to run textual diff and see if * the pattern appears on added/deleted lines. */ memset(&xpp, 0, sizeof(xpp)); memset(&xecfg, 0, sizeof(xecfg)); ecbdata.regexp = regexp; ecbdata.hit = 0; xecfg.ctxlen = o->context; xecfg.interhunkctxlen = o->interhunkcontext; xdi_diff_outf(one, two, diffgrep_consume, &ecbdata, &xpp, &xecfg); return ecbdata.hit; }
static void combine_diff(const unsigned char *parent, unsigned int mode, mmfile_t *result_file, struct sline *sline, unsigned int cnt, int n, int num_parent) { unsigned int p_lno, lno; unsigned long nmask = (1UL << n); xpparam_t xpp; xdemitconf_t xecfg; mmfile_t parent_file; xdemitcb_t ecb; struct combine_diff_state state; unsigned long sz; if (!cnt) return; /* result deleted */ parent_file.ptr = grab_blob(parent, mode, &sz); parent_file.size = sz; memset(&xpp, 0, sizeof(xpp)); xpp.flags = XDF_NEED_MINIMAL; memset(&xecfg, 0, sizeof(xecfg)); memset(&state, 0, sizeof(state)); state.nmask = nmask; state.sline = sline; state.lno = 1; state.num_parent = num_parent; state.n = n; xdi_diff_outf(&parent_file, result_file, consume_line, &state, &xpp, &xecfg, &ecb); free(parent_file.ptr); /* Assign line numbers for this parent. * * sline[lno].p_lno[n] records the first line number * (counting from 1) for parent N if the final hunk display * started by showing sline[lno] (possibly showing the lost * lines attached to it first). */ for (lno = 0, p_lno = 1; lno <= cnt; lno++) { struct lline *ll; sline[lno].p_lno[n] = p_lno; /* How many lines would this sline advance the p_lno? */ ll = sline[lno].lost_head; while (ll) { if (ll->parent_map & nmask) p_lno++; /* '-' means parent had it */ ll = ll->next; } if (lno < cnt && !(sline[lno].flag & nmask)) p_lno++; /* no '+' means parent had it */ } sline[lno].p_lno[n] = p_lno; /* trailer */ }
static int diffsize(const char *a, const char *b) { xpparam_t pp = { 0 }; xdemitconf_t cfg = { 0 }; mmfile_t mf1, mf2; int count = 0; mf1.ptr = (char *)a; mf1.size = strlen(a); mf2.ptr = (char *)b; mf2.size = strlen(b); cfg.ctxlen = 3; if (!xdi_diff_outf(&mf1, &mf2, diffsize_consume, &count, &pp, &cfg)) return count; error(_("failed to generate diff")); return COST_MAX; }