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>
This commit is contained in:
Linus Torvalds 2012-11-18 07:55:41 -10:00 committed by Dirk Hohndel
parent 8a45a3ffb9
commit 2a78f3436c
2 changed files with 11 additions and 9 deletions

View file

@ -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) static void gps_location(char *buffer, void *_dive)
{ {
int i; char *end;
struct dive *dive = _dive; struct dive *dive = _dive;
double latitude, longitude;
i = sscanf(buffer, "%lf %lf", &latitude, &longitude); dive->latitude = g_ascii_strtod(buffer, &end);
if (i == 2) { dive->longitude = g_ascii_strtod(end, &end);
dive->latitude = latitude;
dive->longitude = longitude;
}
free(buffer); free(buffer);
} }

View file

@ -193,8 +193,14 @@ static void show_location(FILE *f, struct dive *dive)
*/ */
if (latitude || longitude) { if (latitude || longitude) {
int len = snprintf(buffer, sizeof(buffer)-4, int len = snprintf(buffer, sizeof(buffer)-4,
" <location gps='%.12g %.12g'>", " <location gps=");
latitude, longitude); 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) { if (!dive->location) {
memcpy(&buffer[len-1], "/>\n", 4); memcpy(&buffer[len-1], "/>\n", 4);
fputs(buffer, f); fputs(buffer, f);