aboutsummaryrefslogtreecommitdiffstats
path: root/parse-xml.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-09-06 17:01:28 -0700
committerGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-09-06 17:01:28 -0700
commit4d19f42a4e0aea4c12b9b05af25c7c0f42ca3a48 (patch)
treeed5f9e805a19ef8f3468fe18331eb0d457cfb7df /parse-xml.c
parent0e3bbd4102ec4d355637b2b8a72a1c16012ec0bc (diff)
downloadsubsurface-4d19f42a4e0aea4c12b9b05af25c7c0f42ca3a48.tar.gz
Add framework for UDDF importer
There are several sample UDDF files around on the net, so we might as well start importing some of it. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'parse-xml.c')
-rw-r--r--parse-xml.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/parse-xml.c b/parse-xml.c
index 36db7e744..d53c9b323 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -70,12 +70,17 @@ static int match(const char *pattern, int plen,
static struct units {
enum { METERS, FEET } length;
enum { LITER, CUFT } volume;
- enum { BAR, PSI } pressure;
- enum { CELSIUS, FAHRENHEIT } temperature;
+ enum { BAR, PSI, PASCAL } pressure;
+ enum { CELSIUS, FAHRENHEIT, KELVIN } temperature;
enum { KG, LBS } weight;
} units;
-/* We're going to default to SI units for input */
+/*
+ * We're going to default to SI units for input. Yes,
+ * technically the SI unit for pressure is Pascal, but
+ * we default to bar (10^5 pascal), which people
+ * actually use. Similarly, C instead of Kelvin.
+ */
static const struct units SI_units = {
.length = METERS,
.volume = LITER,
@@ -99,6 +104,7 @@ static enum import_source {
SUUNTO,
UEMIS,
DIVINGLOG,
+ UDDF,
} import_source;
static time_t utc_mktime(struct tm *tm)
@@ -238,6 +244,9 @@ static void pressure(char *buffer, void *_press)
if (!val.fp)
break;
switch (units.pressure) {
+ case PASCAL:
+ mbar = val.fp / 100;
+ break;
case BAR:
/* Assume mbar, but if it's really small, it's bar */
mbar = val.fp;
@@ -293,6 +302,9 @@ static void temperature(char *buffer, void *_temperature)
break;
/* Celsius */
switch (units.temperature) {
+ case KELVIN:
+ temperature->mkelvin = val.fp * 1000;
+ break;
case CELSIUS:
temperature->mkelvin = (val.fp + 273.15) * 1000 + 0.5;
break;
@@ -1171,6 +1183,14 @@ static void DivingLog_importer(void)
units.pressure = PSI;
}
+static void uddf_importer(void)
+{
+ import_source = UDDF;
+ units = SI_units;
+ units.pressure = PASCAL;
+ units.temperature = KELVIN;
+}
+
/*
* I'm sure this could be done as some fancy DTD rules.
* It's just not worth the headache.
@@ -1182,6 +1202,7 @@ static struct nesting {
{ "dive", dive_start, dive_end },
{ "Dive", dive_start, dive_end },
{ "sample", sample_start, sample_end },
+ { "waypoint", sample_start, sample_end },
{ "SAMPLE", sample_start, sample_end },
{ "reading", sample_start, sample_end },
{ "event", event_start, event_end },
@@ -1193,6 +1214,7 @@ static struct nesting {
{ "SUUNTO", suunto_importer },
{ "Divinglog", DivingLog_importer },
{ "pre_dive", uemis_importer },
+ { "uddf", uddf_importer },
{ NULL, }
};