X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=parse-xml.c;h=efae6b61fd196e893cacc46df8fcffc280f21fd9;hb=a32d28d5e388ab3e31eadcd329814488fa5e8b1b;hp=1eb6e95fdd1007aff73d326c7d6b073c7fe36f36;hpb=d94fb7ca6b4fc17dacd069522d7fad00aa69e088;p=ext%2Fsubsurface.git diff --git a/parse-xml.c b/parse-xml.c index 1eb6e95..efae6b6 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -92,8 +92,14 @@ const struct units IMPERIAL_units = { */ static struct dive *dive; static struct sample *sample; +static struct { + int active; + duration_t time; + int type, flags, value; + const char *name; +} event; static struct tm tm; -static int event_index, cylinder_index; +static int cylinder_index; static enum import_source { UNKNOWN, @@ -558,6 +564,34 @@ static int uddf_fill_sample(struct sample *sample, const char *name, int len, ch 0; } +static void eventtime(char *buffer, void *_duration) +{ + duration_t *duration = _duration; + sampletime(buffer, duration); + if (sample) + duration->seconds += sample->time.seconds; +} + +static void try_to_fill_event(const char *name, char *buf) +{ + int len = strlen(name); + + start_match("event", name, buf); + if (MATCH(".event", utf8_string, &event.name)) + return; + if (MATCH(".name", utf8_string, &event.name)) + return; + if (MATCH(".time", eventtime, &event.time)) + return; + if (MATCH(".type", get_index, &event.type)) + return; + if (MATCH(".flags", get_index, &event.flags)) + return; + if (MATCH(".value", get_index, &event.value)) + return; + nonmatch("event", name, buf); +} + /* We're in samples - try to convert the random xml value to something useful */ static void try_to_fill_sample(struct sample *sample, const char *name, char *buf) { @@ -1051,7 +1085,7 @@ static void match_standard_cylinder(cylinder_type_t *type) return; cuft = type->size.mliter / 28317.0; - cuft *= type->workingpressure.mbar / 1013.25; + cuft *= to_ATM(type->workingpressure); psi = type->workingpressure.mbar / 68.95; switch (psi) { @@ -1106,7 +1140,7 @@ static void sanitize_cylinder_type(cylinder_type_t *type) if (input_units.volume == CUFT || import_source == SUUNTO) { volume_of_air = type->size.mliter * 28.317; /* milli-cu ft to milliliter */ - atm = type->workingpressure.mbar / 1013.25; /* working pressure in atm */ + atm = to_ATM(type->workingpressure); /* working pressure in atm */ volume = volume_of_air / atm; /* milliliters at 1 atm: "true size" */ type->size.mliter = volume + 0.5; } @@ -1137,11 +1171,15 @@ static void dive_end(void) static void event_start(void) { + memset(&event, 0, sizeof(event)); + event.active = 1; } static void event_end(void) { - event_index++; + if (event.name && strcmp(event.name, "surface") != 0) + add_event(dive, event.time.seconds, event.type, event.flags, event.value, event.name); + event.active = 0; } static void cylinder_start(void) @@ -1156,7 +1194,6 @@ static void cylinder_end(void) static void sample_start(void) { sample = prepare_sample(&dive); - event_index = 0; } static void sample_end(void) @@ -1176,6 +1213,10 @@ static void entry(const char *name, int size, const char *raw) return; memcpy(buf, raw, size); buf[size] = 0; + if (event.active) { + try_to_fill_event(name, buf); + return; + } if (sample) { try_to_fill_sample(sample, name, buf); return;