From e85c98f31588f2a8a5ad0aebf0e6e4840b8f3441 Mon Sep 17 00:00:00 2001 From: Přemysl Janouch Date: Sun, 21 Jun 2015 21:50:47 +0200 Subject: degesch: implement the rest of buffer merging --- degesch.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/degesch.c b/degesch.c index 88ea34a..75ad5af 100644 --- a/degesch.c +++ b/degesch.c @@ -2652,7 +2652,39 @@ static void buffer_merge (struct app_context *ctx, struct buffer *buffer, struct buffer *merged) { - // TODO: try to merge the buffers as best as we can + // XXX: anything better to do? This situation is arguably rare and I'm + // not entirely sure what action to take. + buffer_send_status (ctx, buffer, + "Buffer %s was merged into this buffer", merged->name); + + // Find all lines from "merged" newer than the newest line in "buffer" + struct buffer_line *start = merged->lines; + if (buffer->lines_tail) + while (start && start->when < buffer->lines_tail->when) + start = start->next; + if (!start) + return; + + // Count how many of them we have + size_t n = 0; + for (struct buffer_line *iter = start; iter; iter = iter->next) + n++; + + // Append the merged part to current lines in the buffer + buffer->lines_tail->next = start; + start->prev = buffer->lines_tail; + + buffer->lines_tail = merged->lines_tail; + buffer->lines_count += n; + + // And remove it from the original buffer + if (start == merged->lines_tail) + if (!(merged->lines_tail = start->prev)) + merged->lines = NULL; + merged->lines_count -= n; + + // XXX: we don't want to log this entry to a file + buffer_send_status (ctx, buffer, "End of merged content"); } static void @@ -2672,7 +2704,6 @@ buffer_rename (struct app_context *ctx, // When there's a collision, there's not much else we can do // other than somehow trying to merge them buffer_merge (ctx, collision, buffer); - // TODO: log a status message about the merge if (ctx->current_buffer == buffer) buffer_activate (ctx, collision); buffer_remove (ctx, buffer); -- cgit v1.2.3-70-g09d2