*/
#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
#include <libgdome/gdome.h>
#include <libxslt/xsltconfig.h>
#include <libxslt/xslt.h>
// From now on no Gdome internal should be used directly.
+ /******************************/
+ /* XSLT stylesheet Processing */
+ /******************************/
+
xsltStylesheetPtr processStylesheet(GdomeDocument* style)
{
xmlDocPtr style_copy;
return xsltParseStylesheetDoc(style_copy);
}
-GdomeDocument* applyStylesheet(GdomeDocument* source, xsltStylesheetPtr style_libxslt, const char** params)
+ /*******************************/
+ /* XSLT stylesheet Application */
+ /*******************************/
+
+GdomeDocument* applyStylesheet(GdomeDocument* source, xsltStylesheetPtr
+ style_libxslt, const char** params)
{
xmlDocPtr source_libxml;
xmlDocPtr output_libxml;
xsltSetGenericDebugFunc(NULL, NULL);
- output_libxml = xsltApplyStylesheet(style_libxslt,
- source_libxml,
- params);
+ output_libxml = xsltApplyStylesheet(style_libxslt, source_libxml,
+ params);
if (output_libxml == NULL) return NULL;
return gdome_of_libxml(output_libxml);
}
-/***************** serialization functions *****************/
+ /******************/
+ /* Results Output */
+ /******************/
-int saveResultToFilename (const char* name,
- GdomeDocument* result,
- xsltStylesheetPtr style_libxslt,
- int compression)
+int saveResultToFilename (const char* name, GdomeDocument* result,
+ xsltStylesheetPtr style_libxslt, int compression)
{
xmlDocPtr result_libxml;
xsltSetGenericDebugFunc(NULL, NULL);
- return xsltSaveResultToFilename(name,
- result_libxml,
- style_libxslt,
- compression);
+ return xsltSaveResultToFilename(name, result_libxml,
+ style_libxslt, compression);
}
-int saveResultToFile (FILE* file,
- GdomeDocument* result,
- xsltStylesheetPtr style_libxslt)
+int saveResultToFile (FILE* file, GdomeDocument* result,
+ xsltStylesheetPtr style_libxslt)
{
xmlDocPtr result_libxml;
xsltSetGenericDebugFunc(NULL, NULL);
- return xsltSaveResultToFile(file,
- result_libxml,
- style_libxslt);
+ return xsltSaveResultToFile(file, result_libxml, style_libxslt);
}
-int saveResultToFd (int fd,
- GdomeDocument* result,
- xsltStylesheetPtr style_libxslt)
+int saveResultToFd (int fd, GdomeDocument* result, xsltStylesheetPtr
+ style_libxslt)
{
xmlDocPtr result_libxml;
xsltSetGenericDebugFunc(NULL, NULL);
- return xsltSaveResultToFd(fd,
- result_libxml,
- style_libxslt);
+ return xsltSaveResultToFd(fd, result_libxml, style_libxslt);
+}
+
+ /**********************************************/
+ /* Error and Debugging Callbacks Registration */
+ /**********************************************/
+
+ /* max size of a single message passed to callbacks */
+#define MAX_MSG_SIZE 1024
+#define TRUNCATED_MSG "... TRUNCATED ..."
+#define TRUNCATED_MSG_LEN strlen(TRUNCATED_MSG)
+
+ /* ERROR callbacks */
+
+ /* user provided error callback, needs a string input */
+static gdomeXsltMsgCallback errorUserCallback = NULL;
+
+ /* libxslt like error callback, ignore context, builds a string
+ * input for user provided error callback and invoke it */
+void gdomeXsltErrorCallback (void *ctx, const char *msg, ...) {
+ va_list args;
+ char buf[MAX_MSG_SIZE];
+
+ if (errorUserCallback == NULL)
+ return;
+
+ va_start(args, msg);
+ if (vsnprintf(buf, MAX_MSG_SIZE, msg, args) > MAX_MSG_SIZE - 1)
+ { /* message truncated; write TRUNCATED_MSG on it */
+ strncpy(buf+(strlen(buf) - TRUNCATED_MSG_LEN),
+ TRUNCATED_MSG, TRUNCATED_MSG_LEN);
+ }
+ va_end(args);
+
+ (*errorUserCallback) (buf);
+
+ return;
+}
+
+ /* set user provided error callback */
+void setErrorCallback (gdomeXsltMsgCallback callback)
+{
+ errorUserCallback = callback;
+ xsltSetGenericErrorFunc(NULL,
+ (callback == NULL ? NULL : gdomeXsltErrorCallback));
+
+ return;
+}
+
+ /* DEBUG callbacks */
+
+ /* user provided debug callback, needs a string input */
+static gdomeXsltMsgCallback debugUserCallback = NULL;
+
+ /* libxslt like debug callback, ignore context, builds a string
+ * input for user provided debug callback and invoke it */
+void gdomeXsltDebugCallback (void *ctx, const char *msg, ...) {
+ va_list args;
+ char buf[MAX_MSG_SIZE];
+
+ if (debugUserCallback == NULL)
+ return;
+
+ va_start(args, msg);
+ if (vsnprintf(buf, MAX_MSG_SIZE, msg, args) > MAX_MSG_SIZE - 1)
+ { /* message truncated; write TRUNCATED_MSG on it */
+ strncpy(buf+(strlen(buf) - TRUNCATED_MSG_LEN),
+ TRUNCATED_MSG, TRUNCATED_MSG_LEN);
+ }
+ va_end(args);
+
+ (*debugUserCallback) (buf);
+
+ return;
+}
+
+ /* set user provided debug callback */
+void setDebugCallback (gdomeXsltMsgCallback callback)
+{
+ debugUserCallback = callback;
+ xsltSetGenericDebugFunc(NULL,
+ (callback == NULL ? NULL : gdomeXsltDebugCallback));
+
+ return;
}