forked from git/git
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
combine-diff: refactor built-in xdiff interface.
This refactors the line-by-line callback mechanism used in combine-diff so that other programs can reuse it more easily. Signed-off-by: Junio C Hamano <junkio@cox.net>
- Loading branch information
Junio C Hamano
committed
Apr 5, 2006
1 parent
f23fc77
commit d9ea73e
Showing
4 changed files
with
84 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
#include "cache.h" | ||
#include "xdiff-interface.h" | ||
|
||
static void consume_one(void *priv_, char *s, unsigned long size) | ||
{ | ||
struct xdiff_emit_state *priv = priv_; | ||
char *ep; | ||
while (size) { | ||
unsigned long this_size; | ||
ep = memchr(s, '\n', size); | ||
this_size = (ep == NULL) ? size : (ep - s + 1); | ||
priv->consume(priv, s, this_size); | ||
size -= this_size; | ||
s += this_size; | ||
} | ||
} | ||
|
||
int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf) | ||
{ | ||
struct xdiff_emit_state *priv = priv_; | ||
int i; | ||
|
||
for (i = 0; i < nbuf; i++) { | ||
if (mb[i].ptr[mb[i].size-1] != '\n') { | ||
/* Incomplete line */ | ||
priv->remainder = realloc(priv->remainder, | ||
priv->remainder_size + | ||
mb[i].size); | ||
memcpy(priv->remainder + priv->remainder_size, | ||
mb[i].ptr, mb[i].size); | ||
priv->remainder_size += mb[i].size; | ||
continue; | ||
} | ||
|
||
/* we have a complete line */ | ||
if (!priv->remainder) { | ||
consume_one(priv, mb[i].ptr, mb[i].size); | ||
continue; | ||
} | ||
priv->remainder = realloc(priv->remainder, | ||
priv->remainder_size + | ||
mb[i].size); | ||
memcpy(priv->remainder + priv->remainder_size, | ||
mb[i].ptr, mb[i].size); | ||
consume_one(priv, priv->remainder, | ||
priv->remainder_size + mb[i].size); | ||
free(priv->remainder); | ||
priv->remainder = NULL; | ||
priv->remainder_size = 0; | ||
} | ||
if (priv->remainder) { | ||
consume_one(priv, priv->remainder, priv->remainder_size); | ||
free(priv->remainder); | ||
priv->remainder = NULL; | ||
priv->remainder_size = 0; | ||
} | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
#ifndef XDIFF_INTERFACE_H | ||
#define XDIFF_INTERFACE_H | ||
|
||
#include "xdiff/xdiff.h" | ||
|
||
struct xdiff_emit_state; | ||
|
||
typedef void (*xdiff_emit_consume_fn)(void *, char *, unsigned long); | ||
|
||
struct xdiff_emit_state { | ||
xdiff_emit_consume_fn consume; | ||
char *remainder; | ||
unsigned long remainder_size; | ||
}; | ||
|
||
int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf); | ||
|
||
#endif |