diff options
author | Junio C Hamano <junkio@cox.net> | 2006-04-05 02:03:58 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-04-05 02:09:58 -0700 |
commit | d9ea73e0564c7db8d791fe6b03c976ce57c9b079 (patch) | |
tree | 1440a434f16a356f31f5c00029fafecd7a5664ea /xdiff-interface.c | |
parent | f23fc773a2acce9966ac7fa267818d5be55667fa (diff) | |
download | git-d9ea73e0564c7db8d791fe6b03c976ce57c9b079.tar.gz |
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>
Diffstat (limited to 'xdiff-interface.c')
-rw-r--r-- | xdiff-interface.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/xdiff-interface.c b/xdiff-interface.c new file mode 100644 index 0000000000..0a66ded953 --- /dev/null +++ b/xdiff-interface.c @@ -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; +} |