+
+#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, *next;
+
+ path = getenv("SUBSURFACE_XSLT_PATH");
+ if (!path)
+ path = xslt_path;
+
+ 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;
+}
+
+static struct xslt_files {
+ const char *root;
+ const char *file;
+} xslt_files[] = {
+ { "SUUNTO", "SuuntoSDM.xslt" },
+ { "JDiveLog", "jdivelog2subsurface.xslt" },
+ { NULL, }
+};
+
+xmlDoc *test_xslt_transforms(xmlDoc *doc)
+{
+ struct xslt_files *info = xslt_files;
+ xmlDoc *transformed;
+ xsltStylesheetPtr xslt = NULL;
+ xmlNode *root_element = xmlDocGetRootElement(doc);
+
+ while ((info->root) && (strcasecmp(root_element->name, info->root) != 0)) {
+ info++;
+ }
+
+ if (info->root) {
+ xmlSubstituteEntitiesDefault(1);
+ xslt = get_stylesheet(info->file);
+ if (xslt == NULL)
+ return doc;
+ transformed = xsltApplyStylesheet(xslt, doc, NULL);
+ xmlFreeDoc(doc);
+ xsltFreeStylesheet(xslt);
+ return transformed;
+ }
+ return doc;
+}
+#endif