]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Fix an issue with trips that have dives from multiple input files
authorDirk Hohndel <dirk@hohndel.org>
Mon, 27 Aug 2012 22:29:40 +0000 (15:29 -0700)
committerDirk Hohndel <dirk@hohndel.org>
Mon, 27 Aug 2012 22:29:40 +0000 (15:29 -0700)
The existing code didn't handle the case of different trips for the same
date coming from different sources. It also got confused if the first dive
processed (which is, chronologically, the last dive) happened to be a
"NOTRIP" dive.

This commit adds a bit of debugging infrastructure for the trip handling,
too.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
dive.h
divelist.c
parse-xml.c

diff --git a/dive.h b/dive.h
index 65b812b06aaa615c02fa26e97c76317fde152cfe..a715ea24912d56536109b7bd1c91418c5d26143d 100644 (file)
--- a/dive.h
+++ b/dive.h
@@ -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
index a3bb1fb5eb897320cdd382728778fc01f3274f15..83161b8c55f647ec64b5b901f5196b823101b2c6 100644 (file)
@@ -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 */
index 00538dad93a07f5dc15897a7467eb5b86c5b2a4b..b70f154449975571541f95572c404aed6dff30c6 100644 (file)
@@ -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)