xdiff: provide a separate emit callback for hunks
The xdiff library always emits hunk header lines to our callbacks as formatted strings like "@@ -a,b +c,d @@\n". This is convenient if we're going to output a diff, but less so if we actually need to compute using those numbers, which requires re-parsing the line. In preparation for moving away from this, let's teach xdiff a new callback function which gets the broken-out hunk information. To help callers that don't want to use this new callback, if it's NULL we'll continue to format the hunk header into a string. Note that this function renames the "outf" callback to "out_line", as well. This isn't strictly necessary, but helps in two ways: 1. Now that there are two callbacks, it's nice to use more descriptive names. 2. Many callers did not zero the emit_callback_data struct, and needed to be modified to set ecb.out_hunk to NULL. By changing the name of the existing struct member, that guarantees that any new callers from in-flight topics will break the build and be examined manually. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
cae598d998
commit
611e42a598
@ -54,7 +54,7 @@ int xdl_emit_diffrec(char const *rec, long size, char const *pre, long psize,
|
||||
mb[2].size = strlen(mb[2].ptr);
|
||||
i++;
|
||||
}
|
||||
if (ecb->outf(ecb->priv, mb, i) < 0) {
|
||||
if (ecb->out_line(ecb->priv, mb, i) < 0) {
|
||||
|
||||
return -1;
|
||||
}
|
||||
@ -344,8 +344,9 @@ int xdl_num_out(char *out, long val) {
|
||||
return str - out;
|
||||
}
|
||||
|
||||
int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
|
||||
const char *func, long funclen, xdemitcb_t *ecb) {
|
||||
static int xdl_format_hunk_hdr(long s1, long c1, long s2, long c2,
|
||||
const char *func, long funclen,
|
||||
xdemitcb_t *ecb) {
|
||||
int nb = 0;
|
||||
mmbuffer_t mb;
|
||||
char buf[128];
|
||||
@ -387,9 +388,21 @@ int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
|
||||
|
||||
mb.ptr = buf;
|
||||
mb.size = nb;
|
||||
if (ecb->outf(ecb->priv, &mb, 1) < 0)
|
||||
if (ecb->out_line(ecb->priv, &mb, 1) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
|
||||
const char *func, long funclen,
|
||||
xdemitcb_t *ecb) {
|
||||
if (!ecb->out_hunk)
|
||||
return xdl_format_hunk_hdr(s1, c1, s2, c2, func, funclen, ecb);
|
||||
if (ecb->out_hunk(ecb->priv,
|
||||
c1 ? s1 : s1 - 1, c1,
|
||||
c2 ? s2 : s2 - 1, c2,
|
||||
func, funclen) < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user