summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--parse-xml.c50
-rw-r--r--uemis.c3
-rw-r--r--uemis.h2
3 files changed, 42 insertions, 13 deletions
diff --git a/parse-xml.c b/parse-xml.c
index 4e68e8ee2..6a08a3845 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -3,6 +3,7 @@
#include <string.h>
#include <stdlib.h>
#include <errno.h>
+#define __USE_XOPEN
#include <time.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
@@ -640,8 +641,10 @@ static void try_to_fill_sample(struct sample *sample, const char *name, char *bu
/*
* Crazy suunto xml. Look at how those o2/he things match up.
*/
-static int suunto_dive_match(struct dive *dive, const char *name, int len, char *buf)
+static int suunto_dive_match(struct dive **divep, const char *name, int len, char *buf)
{
+ struct dive *dive = *divep;
+
return MATCH(".o2pct", percent, &dive->cylinder[0].gasmix.o2) ||
MATCH(".hepct_0", percent, &dive->cylinder[0].gasmix.he) ||
MATCH(".o2pct_2", percent, &dive->cylinder[1].gasmix.o2) ||
@@ -679,8 +682,10 @@ static void divinglog_place(char *place, void *_location)
country = NULL;
}
-static int divinglog_dive_match(struct dive *dive, const char *name, int len, char *buf)
+static int divinglog_dive_match(struct dive **divep, const char *name, int len, char *buf)
{
+ struct dive *dive = *divep;
+
return MATCH(".divedate", divedate, &dive->when) ||
MATCH(".entrytime", divetime, &dive->when) ||
MATCH(".depth", depth, &dive->maxdepth) ||
@@ -771,6 +776,21 @@ static void uemis_time_zone(char *buffer, void *_when)
#endif
}
+static void uemis_ts(char *buffer, void *_when)
+{
+ struct tm tm;
+ time_t *when = _when;
+
+ strptime(buffer, "%Y-%m-%dT%H:%M:%S", &tm);
+ *when = utc_mktime(&tm);
+}
+
+static void uemis_duration(char *buffer, void *_duration)
+{
+ duration_t *duration = _duration;
+ duration->seconds = atof(buffer) * 60 + 0.5;
+}
+
/* 0 - air ; 1 - nitrox1 ; 2 - nitrox2 ; 3 = nitrox3 */
static int uemis_gas_template;
@@ -835,8 +855,10 @@ static void uemis_percent(char *buffer, void *_cylinder)
percent(buffer, &dive->cylinder[index].gasmix.o2);
}
-static int uemis_dive_match(struct dive *dive, const char *name, int len, char *buf)
+static int uemis_dive_match(struct dive **divep, const char *name, int len, char *buf)
{
+ struct dive *dive = *divep;
+
return MATCH(".units.length", uemis_length_unit, &input_units) ||
MATCH(".units.volume", uemis_volume_unit, &input_units) ||
MATCH(".units.pressure", uemis_pressure_unit, &input_units) ||
@@ -862,7 +884,9 @@ static int uemis_dive_match(struct dive *dive, const char *name, int len, char *
MATCH(".nitrox_3.deco_tank.oxygen", uemis_percent, dive->cylinder + 5) ||
MATCH(".nitrox_3.travel_tank.size", uemis_cylindersize, dive->cylinder + 6) ||
MATCH(".nitrox_3.travel_tank.oxygen", uemis_percent, dive->cylinder + 6) ||
- MATCH(".dive.val.bin", uemis_parse_divelog_binary, &dive) ||
+ MATCH(".dive.val.float", uemis_duration, &dive->duration) ||
+ MATCH(".dive.val.ts", uemis_ts, &dive->when) ||
+ MATCH(".dive.val.bin", uemis_parse_divelog_binary, divep) ||
0;
}
@@ -910,8 +934,10 @@ success:
free(buffer);
}
-static int uddf_dive_match(struct dive *dive, const char *name, int len, char *buf)
+static int uddf_dive_match(struct dive **divep, const char *name, int len, char *buf)
{
+ struct dive *dive = *divep;
+
return MATCH(".datetime", uddf_datetime, &dive->when) ||
MATCH(".diveduration", duration, &dive->duration) ||
MATCH(".greatestdepth", depth, &dive->maxdepth) ||
@@ -933,7 +959,7 @@ static void gps_location(char *buffer, void *_dive)
}
/* 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)
+static void try_to_fill_dive(struct dive **divep, const char *name, char *buf)
{
int len = strlen(name);
@@ -941,22 +967,22 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf)
switch (import_source) {
case SUUNTO:
- if (suunto_dive_match(dive, name, len, buf))
+ if (suunto_dive_match(divep, name, len, buf))
return;
break;
case UEMIS:
- if (uemis_dive_match(dive, name, len, buf))
+ if (uemis_dive_match(divep, name, len, buf))
return;
break;
case DIVINGLOG:
- if (divinglog_dive_match(dive, name, len, buf))
+ if (divinglog_dive_match(divep, name, len, buf))
return;
break;
case UDDF:
- if (uddf_dive_match(dive, name, len, buf))
+ if (uddf_dive_match(divep, name, len, buf))
return;
break;
@@ -964,6 +990,8 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf)
break;
}
+ struct dive *dive = *divep;
+
if (MATCH(".number", get_index, &dive->number))
return;
if (MATCH(".date", divedate, &dive->when))
@@ -1224,7 +1252,7 @@ static void entry(const char *name, int size, const char *raw)
return;
}
if (dive) {
- try_to_fill_dive(dive, name, buf);
+ try_to_fill_dive(&dive, name, buf);
return;
}
}
diff --git a/uemis.c b/uemis.c
index 259d30c53..769752915 100644
--- a/uemis.c
+++ b/uemis.c
@@ -180,11 +180,12 @@ bail:
/*
* parse uemis base64 data blob into struct dive
*/
-void uemis_parse_divelog_binary(char *base64, struct dive **divep) {
+void uemis_parse_divelog_binary(char *base64, void *datap) {
int datalen;
int i;
uint8_t *data;
struct sample *sample;
+ struct dive **divep = datap;
struct dive *dive = *divep;
int template, gasoffset;
diff --git a/uemis.h b/uemis.h
index 62aeb5422..99cf44445 100644
--- a/uemis.h
+++ b/uemis.h
@@ -9,6 +9,6 @@
#define DEVICE_TYPE_UEMIS (-1)
void uemis_import();
-void uemis_parse_divelog_binary(char *base64, struct dive **divep);
+void uemis_parse_divelog_binary(char *base64, void *divep);
#endif /* DIVE_H */