summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dive.h1
-rw-r--r--parse-xml.c16
-rw-r--r--save-xml.c29
3 files changed, 45 insertions, 1 deletions
diff --git a/dive.h b/dive.h
index 8503c3b93..abfd95174 100644
--- a/dive.h
+++ b/dive.h
@@ -133,6 +133,7 @@ struct dive {
char *location;
char *notes;
char *divemaster, *buddy;
+ double latitude, longitude;
depth_t maxdepth, meandepth;
duration_t duration, surfacetime;
depth_t visibility;
diff --git a/parse-xml.c b/parse-xml.c
index 6bb78fdf6..22ab8458e 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -882,6 +882,20 @@ static int uddf_dive_match(struct dive *dive, const char *name, int len, char *b
0;
}
+static void gps_location(char *buffer, void *_dive)
+{
+ int i;
+ struct dive *dive = _dive;
+ double latitude, longitude;
+
+ i = sscanf(buffer, "%lf %lf", &latitude, &longitude);
+ if (i == 2) {
+ dive->latitude = latitude;
+ dive->longitude = longitude;
+ }
+ free(buffer);
+}
+
/* We're in the top-level dive xml. Try to convert whatever value to a dive value */
static void try_to_fill_dive(struct dive *dive, const char *name, char *buf)
{
@@ -950,6 +964,8 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf)
return;
if (MATCH(".cylinderendpressure", pressure, &dive->cylinder[0].end))
return;
+ if (MATCH(".gps", gps_location, dive))
+ return;
if (MATCH(".location", utf8_string, &dive->location))
return;
if (MATCH(".notes", utf8_string, &dive->notes))
diff --git a/save-xml.c b/save-xml.c
index 42bd17e9f..e64b380a4 100644
--- a/save-xml.c
+++ b/save-xml.c
@@ -147,12 +147,39 @@ static void save_temperatures(FILE *f, struct dive *dive)
fputs(" />\n", f);
}
+static void show_location(FILE *f, struct dive *dive)
+{
+ char buffer[80];
+ const char *prefix = " <location>";
+ double latitude = dive->latitude;
+ double longitude = dive->longitude;
+
+ /*
+ * Ok, theoretically I guess you could dive at
+ * exactly 0,0. But we don't support that. So
+ * if you do, just fudge it a bit, and say that
+ * you dove a few meters away.
+ */
+ if (latitude || longitude) {
+ int len = snprintf(buffer, sizeof(buffer)-4,
+ " <location gps='%f %f'>",
+ latitude, longitude);
+ if (!dive->location) {
+ memcpy(&buffer[len-1], "/>\n", 4);
+ fputs(buffer, f);
+ return;
+ }
+ prefix = buffer;
+ }
+ show_utf8(f, dive->location, prefix,"</location>\n");
+}
+
static void save_overview(FILE *f, struct dive *dive)
{
save_depths(f, dive);
save_temperatures(f, dive);
show_duration(f, dive->surfacetime, " <surfacetime>", "</surfacetime>\n");
- show_utf8(f, dive->location, " <location>","</location>\n");
+ show_location(f, dive);
show_utf8(f, dive->divemaster, " <divemaster>","</divemaster>\n");
show_utf8(f, dive->buddy, " <buddy>","</buddy>\n");
show_utf8(f, dive->notes, " <notes>","</notes>\n");