X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=parse-xml.c;h=bc4d4c54661aeb1db4d2462e49625ce8b5997174;hb=4cff1f5b90217365d13ab2e2d5ff09b35590aab3;hp=1b0c4498507be702ab88054ff98497ef0fbb0991;hpb=04f372f8aa5b4f9ba462e0e93b76f3dde6af00f1;p=ext%2Fsubsurface.git diff --git a/parse-xml.c b/parse-xml.c index 1b0c449..bc4d4c5 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -3,10 +3,14 @@ #include #include #include +#include #define __USE_XOPEN #include #include #include +#ifdef XSLT +#include +#endif #include "dive.h" #include "uemis.h" @@ -425,7 +429,7 @@ static void water_pressure(char *buffer, void *_depth) if (!val.fp) break; /* cbar to atm */ - atm = (val.fp / 100) / 1.01325; + atm = bar_to_atm(val.fp * 10); /* * atm to cm. Why not mm? The precision just isn't * there. @@ -783,8 +787,14 @@ static void uemis_ts(char *buffer, void *_when) struct tm tm; time_t *when = _when; - strptime(buffer, "%Y-%m-%dT%H:%M:%S", &tm); + memset(&tm, 0, sizeof(tm)); + sscanf(buffer,"%d-%d-%dT%d:%d:%d", + &tm.tm_year, &tm.tm_mon, &tm.tm_mday, + &tm.tm_hour, &tm.tm_min, &tm.tm_sec); + tm.tm_mon -= 1; + tm.tm_year -= 1900; *when = utc_mktime(&tm); + } static void uemis_duration(char *buffer, void *_duration) @@ -1116,9 +1126,9 @@ static void match_standard_cylinder(cylinder_type_t *type) if (type->description) return; - cuft = type->size.mliter / 28317.0; + cuft = ml_to_cuft(type->size.mliter); cuft *= to_ATM(type->workingpressure); - psi = type->workingpressure.mbar / 68.95; + psi = to_PSI(type->workingpressure); switch (psi) { case 2300 ... 2500: /* 2400 psi: LP tank */ @@ -1171,7 +1181,8 @@ static void sanitize_cylinder_type(cylinder_type_t *type) return; if (input_units.volume == CUFT || import_source == SUUNTO) { - volume_of_air = type->size.mliter * 28.317; /* milli-cu ft to milliliter */ + /* confusing - we don't really start from ml but millicuft !*/ + volume_of_air = cuft_to_l(type->size.mliter); 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; @@ -1459,6 +1470,9 @@ void parse_xml_file(const char *filename, GError **error) set_filename(filename); reset_all(); dive_start(); +#ifdef XSLT + doc = test_xslt_transforms(doc); +#endif traverse(xmlDocGetRootElement(doc)); dive_end(); xmlFreeDoc(doc); @@ -1469,3 +1483,70 @@ void parse_xml_init(void) { LIBXML_TEST_VERSION } + +#ifdef XSLT + +/* Maybe we'll want a environment variable that can override this.. */ +static const char *xslt_path = XSLT ":xslt:."; + +static xsltStylesheetPtr try_get_stylesheet(const char *path, int len, const char *name) +{ + xsltStylesheetPtr ret; + int namelen = strlen(name); + char *filename = malloc(len+1+namelen+1); + + if (!filename) + return NULL; + + memcpy(filename, path, len); + filename[len] = G_DIR_SEPARATOR; + memcpy(filename + len + 1, name, namelen+1); + + ret = NULL; + if (!access(filename, R_OK)) + ret = xsltParseStylesheetFile(filename); + free(filename); + + return ret; +} + +static xsltStylesheetPtr get_stylesheet(const char *name) +{ + const char *path = xslt_path, *next; + + do { + int len; + xsltStylesheetPtr ret; + + next = strchr(path, ':'); + len = strlen(path); + if (next) { + len = next - path; + next++; + } + ret = try_get_stylesheet(path, len, name); + if (ret) + return ret; + } while ((path = next) != NULL); + + return NULL; +} + +xmlDoc *test_xslt_transforms(xmlDoc *doc) +{ + xmlDoc *transformed; + xsltStylesheetPtr xslt = NULL; + xmlNode *root_element = xmlDocGetRootElement(doc); + if (strcasecmp(root_element->name, "JDiveLog") == 0) { + xmlSubstituteEntitiesDefault(1); + xslt = get_stylesheet("jdivelog2subsurface.xslt"); + if (xslt == NULL) + return doc; + transformed = xsltApplyStylesheet(xslt, doc, NULL); + xmlFreeDoc(doc); + xsltFreeStylesheet(xslt); + return transformed; + } + return doc; +} +#endif