diff options
-rw-r--r-- | dive.h | 1 | ||||
-rw-r--r-- | parse-xml.c | 16 | ||||
-rw-r--r-- | save-xml.c | 29 |
3 files changed, 45 insertions, 1 deletions
@@ -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"); |