From 613402f6c9dd73dfd36e65254fab9534765d9eb6 Mon Sep 17 00:00:00 2001
From: Dirk Hohndel <dirk@hohndel.org>
Date: Sun, 12 Oct 2014 14:49:18 -0400
Subject: [PATCH] Correctly copy all information in an event

Instead of trying to use add_event() to reinsert events we simply copy the
memory and adjust the pointers.

Using add_event() lost the gas mix and gas index information on gaschange
events - and this prevent switches between cylinders with the same gasmix
to be rendered correctly.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
---
 dive.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/dive.c b/dive.c
index 775367b58..65efd49cf 100644
--- a/dive.c
+++ b/dive.c
@@ -491,18 +491,23 @@ void selective_copy_dive(struct dive *s, struct dive *d, struct dive_components
 }
 #undef CONDITIONAL_COPY_STRING
 
-/* only copies events from the first dive computer */
+/* copies all events in this dive computer */
 void copy_events(struct divecomputer *s, struct divecomputer *d)
 {
-	struct event *ev;
+	struct event *ev, **pev;
 	if (!s || !d)
 		return;
 	ev = s->events;
-	d->events = NULL;
+	pev = &d->events;
 	while (ev != NULL) {
-		add_event(d, ev->time.seconds, ev->type, ev->flags, ev->value, ev->name);
+		int size = sizeof(*ev) + strlen(ev->name) + 1;
+		struct event *new_ev = malloc(size);
+		memcpy(new_ev, ev, size);
+		*pev = new_ev;
+		pev = &new_ev->next;
 		ev = ev->next;
 	}
+	*pev = NULL;
 }
 
 int nr_cylinders(struct dive *dive)