summaryrefslogtreecommitdiffstats
path: root/parse-xml.c
diff options
context:
space:
mode:
Diffstat (limited to 'parse-xml.c')
-rw-r--r--parse-xml.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/parse-xml.c b/parse-xml.c
index ddf93a4b1..bc4d4c546 100644
--- a/parse-xml.c
+++ b/parse-xml.c
@@ -3,6 +3,7 @@
#include <string.h>
#include <stdlib.h>
#include <errno.h>
+#include <unistd.h>
#define __USE_XOPEN
#include <time.h>
#include <libxml/parser.h>
@@ -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);