X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=parse-xml.c;h=6c93ad1a534e1f6fc7e5bf4dae944eeb7032fd75;hb=adc92d6de2ee1c71e88b66fb9c41e52de8cf4ea1;hp=892e0fb2014fe8abe99b5e7bbc5fd3e7565dc076;hpb=97419131248aacc96278ba7022b39af32359c26c;p=ext%2Fsubsurface.git diff --git a/parse-xml.c b/parse-xml.c index 892e0fb..6c93ad1 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -106,14 +106,25 @@ static void divedate(char *buffer, void *_when) { int d,m,y; time_t *when = _when; + int success = 0; + success = tm.tm_sec | tm.tm_min | tm.tm_hour; if (sscanf(buffer, "%d.%d.%d", &d, &m, &y) == 3) { tm.tm_year = y; tm.tm_mon = m-1; tm.tm_mday = d; - if (tm.tm_sec | tm.tm_min | tm.tm_hour) - *when = utc_mktime(&tm); + } else if (sscanf(buffer, "%d-%d-%d", &y, &m, &d) == 3) { + tm.tm_year = y; + tm.tm_mon = m-1; + tm.tm_mday = d; + } else { + fprintf(stderr, "Unable to parse date '%s'\n", buffer); + success = 0; } + + if (success) + *when = utc_mktime(&tm); + free(buffer); } @@ -197,7 +208,7 @@ static void pressure(char *buffer, void *_press) case FLOAT: /* Maybe it's in Bar? */ if (val.fp < 500.0) { - pressure->mbar = val.fp * 1000; + pressure->mbar = val.fp * 1000 + 0.5; break; } printf("Unknown fractional pressure reading %s\n", buffer); @@ -233,7 +244,7 @@ static void depth(char *buffer, void *_depth) val.fp = val.i; /* fallthrough */ case FLOAT: - depth->mm = val.fp * 1000; + depth->mm = val.fp * 1000 + 0.5; break; default: printf("Strange depth reading %s\n", buffer); @@ -257,7 +268,7 @@ static void temperature(char *buffer, void *_temperature) break; /* Celsius */ if (val.fp < 50.0) { - temperature->mkelvin = (val.fp + 273.16) * 1000; + temperature->mkelvin = (val.fp + 273.15) * 1000 + 0.5; break; } /* Fahrenheit */ @@ -326,10 +337,17 @@ static void percent(char *buffer, void *_fraction) static void gasmix(char *buffer, void *_fraction) { + /* libdivecomputer does negative percentages. */ + if (*buffer == '-') + return; if (gasmix_index < MAX_MIXES) percent(buffer, _fraction); } +static void gasmix_nitrogen(char *buffer, void *_gasmix) +{ + /* Ignore n2 percentages. There's no value in them. */ +} #define MATCH(pattern, fn, dest) \ match(pattern, strlen(pattern), name, len, fn, buf, dest) @@ -346,6 +364,8 @@ static void try_to_fill_sample(struct sample *sample, const char *name, char *bu return; if (MATCH(".sample.depth", depth, &sample->depth)) return; + if (MATCH(".sample.temp", temperature, &sample->temperature)) + return; if (MATCH(".sample.temperature", temperature, &sample->temperature)) return; if (MATCH(".sample.sampletime", sampletime, &sample->time)) @@ -387,6 +407,8 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf) return; if (MATCH(".meandepth", depth, &dive->meandepth)) return; + if (MATCH(".duration", duration, &dive->duration)) + return; if (MATCH(".divetime", duration, &dive->duration)) return; if (MATCH(".divetimesec", duration, &dive->duration)) @@ -404,7 +426,7 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf) if (MATCH(".o2", gasmix, &dive->gasmix[gasmix_index].o2)) return; - if (MATCH(".n2", gasmix, &dive->gasmix[gasmix_index].n2)) + if (MATCH(".n2", gasmix_nitrogen, &dive->gasmix[gasmix_index])) return; if (MATCH(".he", gasmix, &dive->gasmix[gasmix_index].he)) return; @@ -465,12 +487,43 @@ static char *generate_name(struct dive *dive) return p; } +static void sanitize_gasmix(struct dive *dive) +{ + int i; + + for (i = 0; i < MAX_MIXES; i++) { + gasmix_t *mix = dive->gasmix+i; + unsigned int o2, he; + + o2 = mix->o2.permille; + he = mix->he.permille; + + /* Regular air: leave empty */ + if (!he) { + if (!o2) + continue; + /* 20.9% or 21% O2 is just air */ + if (o2 >= 209 && o2 <= 210) { + mix->o2.permille = 0; + continue; + } + } + + /* Sane mix? */ + if (o2 <= 1000 && he <= 1000 && o2+he <= 1000) + continue; + fprintf(stderr, "Odd gasmix: %d O2 %d He\n", o2, he); + memset(mix, 0, sizeof(*mix)); + } +} + static void dive_end(void) { if (!dive) return; if (!dive->name) dive->name = generate_name(dive); + sanitize_gasmix(dive); record_dive(dive); dive = NULL; gasmix_index = 0;