diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2014-08-16 07:55:31 -0600 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-08-16 09:21:20 -0600 |
commit | dd49e3a9a92e3d1a1534a870e9e3b588845fb364 (patch) | |
tree | 64eb9e5cbea9dd01d61193c71f2f56124101c2e8 | |
parent | c58d136d3313692d275c73cdab44b9e71f637f09 (diff) | |
download | subsurface-dd49e3a9a92e3d1a1534a870e9e3b588845fb364.tar.gz |
Cut'n'paste for dive data: implement some infrastructure
This commit doesn't do anything, yet. It just puts in place helper
infrastructure that will later allow us to cut and paste parts of the data
of one dive into another dive (or set of dives).
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | dive.c | 45 | ||||
-rw-r--r-- | dive.h | 16 |
2 files changed, 56 insertions, 5 deletions
@@ -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) @@ -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); |