summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2012-08-27 15:29:40 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2012-08-27 15:29:40 -0700
commit9cf961249e197d6d8a3656968ce15dfd19e3ef3b (patch)
tree92676f36bb7fa383a5fcee21fdad0d8c9dd79a16
parent6500e943c18a416b4f628a963d067ee977da48ba (diff)
downloadsubsurface-9cf961249e197d6d8a3656968ce15dfd19e3ef3b.tar.gz
Fix an issue with trips that have dives from multiple input files
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>
-rw-r--r--dive.h33
-rw-r--r--divelist.c9
-rw-r--r--parse-xml.c2
3 files changed, 38 insertions, 6 deletions
diff --git a/dive.h b/dive.h
index 65b812b06..a715ea249 100644
--- 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
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)