mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Merge dive events correctly too
It's very similar to the sample merging. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
3a77eb8510
commit
a6f6e8d6ff
1 changed files with 54 additions and 1 deletions
55
dive.c
55
dive.c
|
@ -319,6 +319,59 @@ static char *merge_text(const char *a, const char *b)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SORT(a,b,field) \
|
||||||
|
if (a->field != b->field) return a->field < b->field ? -1 : 1
|
||||||
|
|
||||||
|
static int sort_event(struct event *a, struct event *b)
|
||||||
|
{
|
||||||
|
SORT(a,b,time.seconds);
|
||||||
|
SORT(a,b,type);
|
||||||
|
SORT(a,b,flags);
|
||||||
|
SORT(a,b,value);
|
||||||
|
return strcmp(a->name, b->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void merge_events(struct dive *res, struct dive *src1, struct dive *src2, int offset)
|
||||||
|
{
|
||||||
|
struct event *a, *b;
|
||||||
|
struct event **p = &res->events;
|
||||||
|
|
||||||
|
a = src1->events;
|
||||||
|
b = src2->events;
|
||||||
|
while (b) {
|
||||||
|
b->time.seconds += offset;
|
||||||
|
b = b->next;
|
||||||
|
}
|
||||||
|
b = src2->events;
|
||||||
|
|
||||||
|
while (a || b) {
|
||||||
|
int s;
|
||||||
|
if (!b) {
|
||||||
|
*p = a;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!a) {
|
||||||
|
*p = b;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
s = sort_event(a, b);
|
||||||
|
/* Pick b */
|
||||||
|
if (s > 0) {
|
||||||
|
*p = b;
|
||||||
|
p = &b->next;
|
||||||
|
b = b->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* Pick 'a' or neither */
|
||||||
|
if (s < 0) {
|
||||||
|
*p = a;
|
||||||
|
p = &a->next;
|
||||||
|
}
|
||||||
|
a = a->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Pick whichever has any info (if either). Prefer 'a' */
|
/* Pick whichever has any info (if either). Prefer 'a' */
|
||||||
static void merge_cylinder_type(cylinder_type_t *res, cylinder_type_t *a, cylinder_type_t *b)
|
static void merge_cylinder_type(cylinder_type_t *res, cylinder_type_t *a, cylinder_type_t *b)
|
||||||
{
|
{
|
||||||
|
@ -371,6 +424,6 @@ struct dive *try_to_merge(struct dive *a, struct dive *b)
|
||||||
MERGE_MIN(res, a, b, watertemp.mkelvin);
|
MERGE_MIN(res, a, b, watertemp.mkelvin);
|
||||||
for (i = 0; i < MAX_CYLINDERS; i++)
|
for (i = 0; i < MAX_CYLINDERS; i++)
|
||||||
merge_cylinder_info(res->cylinder+i, a->cylinder + i, b->cylinder + i);
|
merge_cylinder_info(res->cylinder+i, a->cylinder + i, b->cylinder + i);
|
||||||
|
merge_events(res, a, b, 0);
|
||||||
return merge_samples(res, a, b, 0);
|
return merge_samples(res, a, b, 0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue