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);