diff options
-rw-r--r-- | dive.h | 33 | ||||
-rw-r--r-- | divelist.c | 9 | ||||
-rw-r--r-- | parse-xml.c | 2 |
3 files changed, 38 insertions, 6 deletions
@@ -278,9 +278,40 @@ static inline int dive_date_cmp(gconstpointer _a, gconstpointer _b) { return ((struct dive *)(_a))->when - ((struct dive *)(_b))->when; } -#define INSERT_TRIP(_trip, _list) g_list_insert_sorted((_list), (_trip), dive_date_cmp) #define FIND_TRIP(_trip, _list) g_list_find_custom((_list), (_trip), dive_date_cmp) +#ifdef DEBUG_TRIP +static void dump_trip_list(void) +{ + GList *p = NULL; + int i=0; + while ((p = NEXT_TRIP(p, dive_trip_list))) { + struct tm *tm = gmtime(&DIVE_TRIP(p)->when); + printf("trip %d to \"%s\" on %04u-%02u-%02u\n", ++i, DIVE_TRIP(p)->location, + tm->tm_year + 1900, tm->tm_mon+1, tm->tm_mday); + } + printf("-----\n"); +} +#endif + +/* insert the trip into the list - but ensure you don't have two trips + * for the same date; but if you have, make sure you don't keep the + * one with less information */ +static inline GList *insert_trip(struct dive *_trip, GList *_list) +{ + GList *result = FIND_TRIP(_trip, _list); + if (result) { + if (! DIVE_TRIP(result)->location) + DIVE_TRIP(result)->location = _trip->location; + } else { + result = g_list_insert_sorted((_list), (_trip), dive_date_cmp); + } +#ifdef DEBUG_TRIP + dump_trip_list(); +#endif + return result; +} + /* * We keep our internal data in well-specified units, but * the input and output may come in some random format. This diff --git a/divelist.c b/divelist.c index a3bb1fb5e..83161b8c5 100644 --- a/divelist.c +++ b/divelist.c @@ -893,8 +893,6 @@ static void fill_dive_list(void) /* if we have pre-existing trips, start on the last one */ trip = g_list_last(dive_trip_list); - if (trip) - dive_trip = DIVE_TRIP(trip); treestore = GTK_TREE_STORE(dive_list.treemodel); liststore = GTK_TREE_STORE(dive_list.listmodel); @@ -911,6 +909,9 @@ static void fill_dive_list(void) DIVE_LOCATION, dive_trip->location, -1); } + /* the dive_trip info might have been killed by a previous UNGROUPED dive */ + if (trip) + dive_trip = DIVE_TRIP(trip); /* tripflag defines how dives are handled; * TF_NONE "not handled yet" - create time based group if autogroup == TRUE * NO_TRIP "set as no group" - simply leave at top level @@ -925,7 +926,7 @@ static void fill_dive_list(void) /* allocate new trip - all fields default to 0 and get filled in further down */ dive_trip = alloc_dive(); - dive_trip_list = INSERT_TRIP(dive_trip, dive_trip_list); + dive_trip_list = insert_trip(dive_trip, dive_trip_list); trip = FIND_TRIP(dive_trip, dive_trip_list); } } else { /* either the dive has a trip or we aren't creating trips */ @@ -938,7 +939,7 @@ static void fill_dive_list(void) * Otherwise we need to create a new trip */ if (autogroup) { dive_trip = alloc_dive(); - dive_trip_list = INSERT_TRIP(dive_trip, dive_trip_list); + dive_trip_list = insert_trip(dive_trip, dive_trip_list); trip = FIND_TRIP(dive_trip, dive_trip_list); } else { /* let's go back to the last valid trip */ diff --git a/parse-xml.c b/parse-xml.c index 00538dad9..b70f15444 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -41,7 +41,7 @@ void record_dive(struct dive *dive) void record_trip(struct dive *trip) { - dive_trip_list = INSERT_TRIP(trip, dive_trip_list); + dive_trip_list = insert_trip(trip, dive_trip_list); } static void delete_dive_renumber(struct dive **dives, int i, int nr) |