summaryrefslogtreecommitdiffstats
path: root/divelist.c
diff options
context:
space:
mode:
Diffstat (limited to 'divelist.c')
-rw-r--r--divelist.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/divelist.c b/divelist.c
index cc301a8b0..28c2e8d53 100644
--- a/divelist.c
+++ b/divelist.c
@@ -1053,6 +1053,7 @@ static void delete_trip(dive_trip_t *trip)
{
GList *trip_list = find_trip(trip);
+ assert(!trip->dives);
/*
* The trip may not be on the list, if it had the
* same time as another trip.
@@ -1066,23 +1067,31 @@ static void delete_trip(dive_trip_t *trip)
static void find_new_trip_start_time(dive_trip_t *trip)
{
- int i;
- struct dive *dive;
+ struct dive *dive = trip->dives;
+ timestamp_t when = dive->when;
- for_each_dive(i, dive) {
- if (dive->divetrip != trip)
- continue;
- trip->when = dive->when;
- break;
+ while ((dive = dive->next) != NULL) {
+ if (dive->when < when)
+ when = dive->when;
}
+ trip->when = when;
}
void remove_dive_from_trip(struct dive *dive)
{
+ struct dive *next, **pprev;
dive_trip_t *trip = dive->divetrip;
if (!trip)
return;
+
+ /* Remove the dive from the trip's list of dives */
+ next = dive->next;
+ pprev = dive->pprev;
+ *pprev = next;
+ if (next)
+ next->pprev = pprev;
+
dive->divetrip = NULL;
assert(trip->nrdives > 0);
if (!--trip->nrdives)
@@ -1099,6 +1108,14 @@ void add_dive_to_trip(struct dive *dive, dive_trip_t *trip)
remove_dive_from_trip(dive);
trip->nrdives++;
dive->divetrip = trip;
+
+ /* Add it to the trip's list of dives*/
+ dive->next = trip->dives;
+ if (dive->next)
+ dive->next->pprev = &dive->next;
+ trip->dives = dive;
+ dive->pprev = &trip->dives;
+
if (dive->when && trip->when > dive->when)
trip->when = dive->when;
}