X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=buffer_tree.c;h=cd3a3c78a45db3babb73c34a3b860b55c2d99bd7;hb=4bd379f56960bddd9623f78b80f40b1dc9337a99;hp=1cb295b4de02e3ca3003f83043cf34d536f2ffc5;hpb=d29a1515fbb74f7853fa771698e90646c24bde33;p=paraslash.git diff --git a/buffer_tree.c b/buffer_tree.c index 1cb295b4..cd3a3c78 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -309,9 +309,9 @@ void *btr_context(struct btr_node *btrn) * * This is a quite expensive operation. * - * \return The number of buffers that have been merged (zero, one or two). + * \return The number of buffers that have been available (zero, one or two). */ -int btr_merge(struct btr_node *btrn) +static int merge_input(struct btr_node *btrn) { struct btr_buffer_reference *brs[2], *br; char *bufs[2], *buf; @@ -351,3 +351,23 @@ int btr_merge(struct btr_node *btrn) para_list_add(&br->node, &btrn->input_queue); return 2; } + +void btr_merge(struct btr_node *btrn, size_t dest_size) +{ + for (;;) { + char *buf; + size_t len = btr_next_buffer(btrn, &buf); + if (len >= dest_size) + return; + if (merge_input(btrn) < 2) + return; + } +} + +bool btr_eof(struct btr_node *btrn) +{ + char *buf; + size_t len = btr_next_buffer(btrn, &buf); + + return (len == 0 && btr_no_parent(btrn)); +}