summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--parse-xml.c20
-rw-r--r--save-xml.c34
2 files changed, 40 insertions, 14 deletions
diff --git a/parse-xml.c b/parse-xml.c
index 90ad91c79..44ef45746 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -1171,13 +1171,20 @@ static void dive_start(void)
return;
cur_dive = alloc_dive();
memset(&cur_tm, 0, sizeof(cur_tm));
+ if (cur_trip) {
+ cur_dive->divetrip = cur_trip;
+ cur_dive->tripflag = IN_TRIP;
+ }
}
static void dive_end(void)
{
- if (!is_dive())
+ if (!cur_dive)
return;
- record_dive(cur_dive);
+ if (!is_dive())
+ free(cur_dive);
+ else
+ record_dive(cur_dive);
cur_dive = NULL;
cur_cylinder_index = 0;
cur_ws_index = 0;
@@ -1187,6 +1194,7 @@ static void trip_start(void)
{
if (cur_trip)
return;
+ dive_end();
cur_trip = calloc(sizeof(dive_trip_t),1);
memset(&cur_tm, 0, sizeof(cur_tm));
}
@@ -1262,14 +1270,14 @@ static void entry(const char *name, int size, const char *raw)
try_to_fill_sample(cur_sample, name, buf);
return;
}
- if (cur_trip) {
- try_to_fill_trip(&cur_trip, name, buf);
- return;
- }
if (cur_dive) {
try_to_fill_dive(&cur_dive, name, buf);
return;
}
+ if (cur_trip) {
+ try_to_fill_trip(&cur_trip, name, buf);
+ return;
+ }
free(buf);
}
diff --git a/save-xml.c b/save-xml.c
index 63e5a9ae3..8fa723f61 100644
--- a/save-xml.c
+++ b/save-xml.c
@@ -304,7 +304,9 @@ static void save_trip(FILE *f, dive_trip_t *trip)
tm.tm_hour, tm.tm_min, tm.tm_sec);
if (trip->location)
show_utf8(f, trip->location, " location=\'","\'", 1);
- fprintf(f, " />\n");
+ fprintf(f, ">\n");
+ if (trip->notes)
+ show_utf8(f, trip->notes, "<notes>","</notes>\n", 0);
}
static void save_dive(FILE *f, struct dive *dive)
@@ -317,7 +319,13 @@ static void save_dive(FILE *f, struct dive *dive)
fputs("<dive", f);
if (dive->number)
fprintf(f, " number='%d'", dive->number);
- if (dive->tripflag != TF_NONE)
+ /*
+ * TF_NONE is the default for dives with no trips
+ * IN_TRIP is the default for dives with trips
+ * ASSIGNED_TRIP is an in-memory thing and gets converted
+ * to IN_TRIP by the save code.
+ */
+ if (dive->tripflag != TF_NONE && dive->tripflag != IN_TRIP && dive->tripflag != ASSIGNED_TRIP)
fprintf(f, " tripflag='%s'", tripflag_names[dive->tripflag]);
if (dive->rating)
fprintf(f, " rating='%d'", dive->rating);
@@ -341,7 +349,8 @@ static void save_dive(FILE *f, struct dive *dive)
void save_dives(const char *filename)
{
int i;
- GList *trip = NULL;
+ struct dive *dive;
+ dive_trip_t *trip = NULL;
FILE *f = fopen(filename, "w");
@@ -353,13 +362,22 @@ void save_dives(const char *filename)
fprintf(f, "<dives>\n<program name='subsurface' version='%d'></program>\n", VERSION);
- /* save the trips */
- while ((trip = NEXT_TRIP(trip)) != NULL)
- save_trip(f, trip->data);
-
/* save the dives */
- for (i = 0; i < dive_table.nr; i++)
+ for_each_dive(i, dive) {
+ dive_trip_t *thistrip = dive->divetrip;
+ if (trip != thistrip) {
+ /* Close the old trip? */
+ if (trip)
+ fprintf(f, "</trip>\n");
+ /* Open the new one */
+ if (thistrip)
+ save_trip(f, thistrip);
+ trip = thistrip;
+ }
save_dive(f, get_dive(i));
+ }
+ if (trip)
+ fprintf(f, "</trip>\n");
fprintf(f, "</dives>\n");
fclose(f);
}