From 47f9f59c1a8c9a6a10b6169562066a58da7aee76 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Thu, 3 Jul 2014 13:34:27 -0700 Subject: UI restructure: add clone_dive helper This is kind of the inverse to copy_dive(). Instead of duplicating all the data that the dive points to, it moves it to a new struct dive and zeroes out the old one so there are no two sets of pointers to these data. Signed-off-by: Dirk Hohndel --- dive.c | 15 +++++++++++++++ dive.h | 1 + 2 files changed, 16 insertions(+) diff --git a/dive.c b/dive.c index 5bebba3b2..6bbb72e1e 100644 --- a/dive.c +++ b/dive.c @@ -326,6 +326,9 @@ void clear_dive(struct dive *d) memset(d, 0, sizeof(struct dive)); } +/* make a true copy that is independent of the source dive; + * all data structures are duplicated, so the copy can be modified without + * any impact on the source */ void copy_dive(struct dive *s, struct dive *d) { clear_dive(d); @@ -343,6 +346,18 @@ void copy_dive(struct dive *s, struct dive *d) STRUCTURED_LIST_COPY(struct tag_entry, s->tag_list, d->tag_list, copy_tl); } +/* make a clone of the source dive and clean out the source dive; + * this is specifically so we can create a dive in the displayed_dive and then + * add it to the divelist. + * Note the difference to copy_dive() / clean_dive() */ +struct dive *clone_dive(struct dive *s) +{ + struct dive *dive = alloc_dive(); + *dive = *s; // so all the pointers in dive point to the things s pointed to + memset(s, 0, sizeof(struct dive)); // and now the pointers in s are gone + return dive; +} + /* only copies events from the first dive computer */ void copy_events(struct divecomputer *s, struct divecomputer *d) { diff --git a/dive.h b/dive.h index 8549296d7..f20a0cff0 100644 --- a/dive.h +++ b/dive.h @@ -605,6 +605,7 @@ extern struct dive *alloc_dive(void); extern void record_dive(struct dive *dive); extern void clear_dive(struct dive *dive); extern void copy_dive(struct dive *s, struct dive *d); +extern struct dive *clone_dive(struct dive *s); extern struct sample *prepare_sample(struct divecomputer *dc); extern void finish_sample(struct divecomputer *dc); -- cgit v1.2.3-70-g09d2