]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Make the xslt style sheet finding search a set of possible paths
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 5 Nov 2011 20:51:37 +0000 (13:51 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 5 Nov 2011 20:51:37 +0000 (13:51 -0700)
This allows us to install the xslt files in multiple places.  Right now
the path defaults to the subsurface xslt install directory, the relative
directory "xslt" and the current working directory.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
parse-xml.c

index ddf93a4b1ad58ff45fdc4790dfe5d5ad005f82dd..bc4d4c54661aeb1db4d2462e49625ce8b5997174 100644 (file)
@@ -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);