X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=buffer_tree.c;h=2c02c69466f19111241aa835dd2f919cf710ecc0;hp=b7420ebeeb38e70f85ad4c9f34fa215b59504f61;hb=ef634463b527880f074dd9d5a5733e24cc22d389;hpb=dfecdabf4aa13e3587b7c73be0f051693dab4d20 diff --git a/buffer_tree.c b/buffer_tree.c index b7420ebe..2c02c694 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -166,6 +166,9 @@ size_t btr_get_buffer_by_reference(struct btr_buffer_reference *br, char **buf) return br_available_bytes(br); } +/** + * \return zero if the input buffer queue is empty. + */ size_t btr_next_buffer(struct btr_node *btrn, char **bufp) { struct btr_buffer_reference *br; @@ -244,7 +247,6 @@ void btr_splice_out_node(struct btr_node *btrn) assert(list_empty(&btrn->children)); free(btrn->name); free(btrn); - return 1; } /** @@ -307,7 +309,7 @@ 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) { @@ -349,3 +351,15 @@ int btr_merge(struct btr_node *btrn) para_list_add(&br->node, &btrn->input_queue); return 2; } + +void btr_merge_to(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 (btr_merge(btrn) < 2) + return; + } +}