summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dive.c45
-rw-r--r--dive.h16
2 files changed, 56 insertions, 5 deletions
diff --git a/dive.c b/dive.c
index 8e51351fb..88233d394 100644
--- a/dive.c
+++ b/dive.c
@@ -421,6 +421,37 @@ struct dive *clone_dive(struct dive *s)
return dive;
}
+#define CONDITIONAL_COPY_STRING(_component) \
+ if (what._component) \
+ d->_component = copy_string(s->_component)
+
+// copy elements, depending on bits in what that are set
+void selective_copy_dive(struct dive *s, struct dive *d, struct dive_components what)
+{
+ clear_dive(d);
+ CONDITIONAL_COPY_STRING(location);
+ CONDITIONAL_COPY_STRING(notes);
+ CONDITIONAL_COPY_STRING(divemaster);
+ CONDITIONAL_COPY_STRING(buddy);
+ CONDITIONAL_COPY_STRING(suit);
+ if (what.rating)
+ d->rating = s->rating;
+ if (what.visibility)
+ d->visibility = s->visibility;
+ if (what.gps) {
+ d->longitude = s->longitude;
+ d->latitude = s->latitude;
+ }
+ if (what.tags)
+ STRUCTURED_LIST_COPY(struct tag_entry, s->tag_list, d->tag_list, copy_tl);
+ if (what.cylinders)
+ copy_cylinders(s, d, false);
+ if (what.weights)
+ for (int i = 0; i < MAX_WEIGHTSYSTEMS; i++)
+ d->weightsystem[i] = s->weightsystem[i];
+}
+#undef CONDITIONAL_COPY_STRING
+
/* only copies events from the first dive computer */
void copy_events(struct divecomputer *s, struct divecomputer *d)
{
@@ -459,16 +490,20 @@ int nr_weightsystems(struct dive *dive)
return nr;
}
+/* copy the equipment data part of the cylinders */
void copy_cylinders(struct dive *s, struct dive *d, bool used_only)
{
int i;
if (!s || !d)
return;
- for (i = 0; i < MAX_CYLINDERS; i++)
- if (!used_only || is_cylinder_used(s, i))
- d->cylinder[i] = s->cylinder[i];
- else
- memset(&d->cylinder[i], 0, sizeof(cylinder_t));
+ for (i = 0; i < MAX_CYLINDERS; i++) {
+ memset(&d->cylinder[i], 0, sizeof(cylinder_t));
+ if (!used_only || is_cylinder_used(s, i)) {
+ d->cylinder[i].type = s->cylinder[i].type;
+ d->cylinder[i].gasmix = s->cylinder[i].gasmix;
+ d->cylinder[i].depth = s->cylinder[i].depth;
+ }
+ }
}
void copy_samples(struct divecomputer *s, struct divecomputer *d)
diff --git a/dive.h b/dive.h
index 144726135..1756f4a64 100644
--- a/dive.h
+++ b/dive.h
@@ -295,6 +295,21 @@ struct dive {
struct picture *picture_list;
};
+/* when selectively copying dive information, which parts should be copied? */
+struct dive_components {
+ unsigned int location : 1;
+ unsigned int notes : 1;
+ unsigned int divemaster : 1;
+ unsigned int buddy : 1;
+ unsigned int suit : 1;
+ unsigned int rating : 1;
+ unsigned int visibility : 1;
+ unsigned int gps : 1;
+ unsigned int tags : 1;
+ unsigned int cylinders : 1;
+ unsigned int weights : 1;
+};
+
/* picture list and methods related to dive picture handling */
struct picture {
char *filename;
@@ -606,6 +621,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 void selective_copy_dive(struct dive *s, struct dive *d, struct dive_components what);
extern struct dive *clone_dive(struct dive *s);
extern struct sample *prepare_sample(struct divecomputer *dc);