X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=parse-xml.c;fp=parse-xml.c;h=bc4d4c54661aeb1db4d2462e49625ce8b5997174;hb=6fa702bcbd95d909bfe4d17a0039005caabab141;hp=ddf93a4b1ad58ff45fdc4790dfe5d5ad005f82dd;hpb=350462949d2dc205355e5c94ccaacf83a0775257;p=ext%2Fsubsurface.git diff --git a/parse-xml.c b/parse-xml.c index ddf93a4..bc4d4c5 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -3,6 +3,7 @@ #include #include #include +#include #define __USE_XOPEN #include #include @@ -1484,6 +1485,53 @@ void parse_xml_init(void) } #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; @@ -1491,7 +1539,7 @@ xmlDoc *test_xslt_transforms(xmlDoc *doc) xmlNode *root_element = xmlDocGetRootElement(doc); if (strcasecmp(root_element->name, "JDiveLog") == 0) { xmlSubstituteEntitiesDefault(1); - xslt = xsltParseStylesheetFile(XSLT G_DIR_SEPARATOR_S "jdivelog2subsurface.xslt"); + xslt = get_stylesheet("jdivelog2subsurface.xslt"); if (xslt == NULL) return doc; transformed = xsltApplyStylesheet(xslt, doc, NULL);