diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-11-18 07:55:41 -1000 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2012-11-19 12:03:44 -0800 |
commit | 2a78f3436ccf157977eccf9435c2680e2d7bc3d3 (patch) | |
tree | e3c2386c299e5a8d7db012fd6943b49cf63bbf45 | |
parent | 8a45a3ffb9e55b29cb7bdd056ba60eb7968e8fcd (diff) | |
download | subsurface-2a78f3436ccf157977eccf9435c2680e2d7bc3d3.tar.gz |
Fix the XML gps parsing and saving when using non-US locales
The GPS parsing and saving was using sscanf and sprintf respecively, and
since it is using floating point values (boo!) that affects both of
them. In a C/US locale, we use a period for decimal values, while most
European locales use a comma.
We really should probably just fix things to use integer values (degrees
and nanodegrees?) but this is the simplest fix/workaround for the issue.
Probably nobody ever really noticed until I tested the Swedish locale
for grins, since we don't have a good way to actually set the GPS
coordinates yet. I've got a few dives with GPS information that I
entered manually.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | parse-xml.c | 10 | ||||
-rw-r--r-- | save-xml.c | 10 |
2 files changed, 11 insertions, 9 deletions
diff --git a/parse-xml.c b/parse-xml.c index f62ce9891..15138f43e 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -1045,15 +1045,11 @@ static int uddf_dive_match(struct dive **divep, const char *name, int len, char static void gps_location(char *buffer, void *_dive) { - int i; + char *end; struct dive *dive = _dive; - double latitude, longitude; - i = sscanf(buffer, "%lf %lf", &latitude, &longitude); - if (i == 2) { - dive->latitude = latitude; - dive->longitude = longitude; - } + dive->latitude = g_ascii_strtod(buffer, &end); + dive->longitude = g_ascii_strtod(end, &end); free(buffer); } diff --git a/save-xml.c b/save-xml.c index 824763c44..a70aacc3e 100644 --- a/save-xml.c +++ b/save-xml.c @@ -193,8 +193,14 @@ static void show_location(FILE *f, struct dive *dive) */ if (latitude || longitude) { int len = snprintf(buffer, sizeof(buffer)-4, - " <location gps='%.12g %.12g'>", - latitude, longitude); + " <location gps="); + char *buf = buffer + len; + + len = strlen(g_ascii_formatd(buf, 80, "'%.12g ", latitude)); + buf += len; + len = strlen(g_ascii_formatd(buf, 80, "%.12g'>", longitude)); + buf += len; + len = buf - buffer; if (!dive->location) { memcpy(&buffer[len-1], "/>\n", 4); fputs(buffer, f); |