summaryrefslogtreecommitdiffstats
path: root/dive.c
diff options
context:
space:
mode:
Diffstat (limited to 'dive.c')
-rw-r--r--dive.c15
1 files changed, 15 insertions, 0 deletions
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)
{