X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=parse-xml.c;h=d6fc953a7cbc075bd2317ee24ce8c61314b03aea;hb=77a903a6bb26d60e1736f7d5c118b598916b37f2;hp=2877e3a9966781f368d009564cb6700570c3e670;hpb=4d10bc017ad683ffa3e7e399b9bcb9dcf524d964;p=ext%2Fsubsurface.git diff --git a/parse-xml.c b/parse-xml.c index 2877e3a..d6fc953 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -39,6 +39,65 @@ void record_dive(struct dive *dive) dive_table.nr = nr+1; } +static void delete_dive_renumber(struct dive **dives, int i, int nr) +{ + struct dive *dive = dives[i]; + int number = dive->number, j; + + if (!number) + return; + + /* + * Check that all numbered dives after the deleted + * ones are consecutive, return without renumbering + * if that is not the case. + */ + for (j = i+1; j < nr; j++) { + struct dive *next = dives[j]; + if (!next->number) + break; + number++; + if (next->number != number) + return; + } + + /* + * Ok, we hit the end of the dives or a unnumbered + * dive - renumber. + */ + for (j = i+1 ; j < nr; j++) { + struct dive *next = dives[j]; + if (!next->number) + break; + next->number--; + } +} + +/* + * Remove a dive from the dive_table array + */ +void delete_dive(struct dive *dive) +{ + int nr = dive_table.nr, i; + struct dive **dives = dive_table.dives; + + /* + * Stupid. We know the dive table is sorted by date, + * we could do a binary lookup. Sue me. + */ + for (i = 0; i < nr; i++) { + struct dive *d = dives[i]; + if (d != dive) + continue; + /* should we re-number? */ + delete_dive_renumber(dives, i, nr); + memmove(dives+i, dives+i+1, sizeof(struct dive *)*(nr-i-1)); + dives[nr] = NULL; + dive_table.nr = nr-1; + break; + } +} + static void start_match(const char *type, const char *name, char *buffer) { if (verbose > 2) @@ -76,6 +135,7 @@ struct units input_units; * 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. + * And kg instead of g. */ const struct units SI_units = { .length = METERS, @@ -105,7 +165,7 @@ static struct { const char *name; } cur_event; static struct tm cur_tm; -static int cur_cylinder_index; +static int cur_cylinder_index, cur_ws_index; static enum import_source { UNKNOWN, @@ -298,6 +358,27 @@ static void depth(char *buffer, void *_depth) free(buffer); } +static void weight(char *buffer, void *_weight) +{ + weight_t *weight = _weight; + union int_or_float val; + + switch (integer_or_float(buffer, &val)) { + case FLOAT: + switch (input_units.weight) { + case KG: + weight->grams = val.fp * 1000 + 0.5; + break; + case LBS: + weight->grams = val.fp * 453.6 + 0.5; + break; + } + break; + default: + printf("Strange depth reading %s\n", buffer); + } +} + static void temperature(char *buffer, void *_temperature) { temperature_t *temperature = _temperature; @@ -566,6 +647,7 @@ static int uddf_fill_sample(struct sample *sample, const char *name, int len, ch return MATCH(".divetime", sampletime, &sample->time) || MATCH(".depth", depth, &sample->depth) || MATCH(".temperature", temperature, &sample->temperature) || + MATCH(".tankpressure", pressure, &sample->cylinderpressure) || 0; } @@ -1036,7 +1118,12 @@ static void try_to_fill_dive(struct dive **divep, const char *name, char *buf) return; if (MATCH(".cylinder.end", pressure, &dive->cylinder[cur_cylinder_index].end)) return; - + if (MATCH(".weightsystem.description", utf8_string, &dive->weightsystem[cur_ws_index].description)) + return; + if (MATCH(".weightsystem.weight", weight, &dive->weightsystem[cur_ws_index].weight)) + return; + if (MATCH("weight", weight, &dive->weightsystem[cur_ws_index].weight)) + return; if (MATCH(".o2", gasmix, &dive->cylinder[cur_cylinder_index].gasmix.o2)) return; if (MATCH(".n2", gasmix_nitrogen, &dive->cylinder[cur_cylinder_index].gasmix)) @@ -1068,6 +1155,7 @@ static void dive_end(void) record_dive(cur_dive); cur_dive = NULL; cur_cylinder_index = 0; + cur_ws_index = 0; } static void event_start(void) @@ -1094,6 +1182,15 @@ static void cylinder_end(void) cur_cylinder_index++; } +static void ws_start(void) +{ +} + +static void ws_end(void) +{ + cur_ws_index++; +} + static void sample_start(void) { cur_sample = prepare_sample(&cur_dive); @@ -1256,6 +1353,7 @@ static struct nesting { { "event", event_start, event_end }, { "gasmix", cylinder_start, cylinder_end }, { "cylinder", cylinder_start, cylinder_end }, + { "weightsystem", ws_start, ws_end }, { "P", sample_start, sample_end }, /* Import type recognition */ @@ -1365,7 +1463,11 @@ static xsltStylesheetPtr try_get_stylesheet(const char *path, int len, const cha static xsltStylesheetPtr get_stylesheet(const char *name) { - const char *path = xslt_path, *next; + const char *path, *next; + + path = getenv("SUBSURFACE_XSLT_PATH"); + if (!path) + path = xslt_path; do { int len;