+
+ /******************/
+ /* Results Output */
+ /******************/
+
+int saveResultToFilename (const char* name, GdomeDocument* result,
+ xsltStylesheetPtr style_libxslt, int compression)
+{
+ xmlDocPtr result_libxml;
+
+ if (result == NULL) return -1;
+ result_libxml = libxml_of_gdome(result);
+
+ xsltSetGenericDebugFunc(NULL, NULL);
+
+ return xsltSaveResultToFilename(name, result_libxml,
+ style_libxslt, compression);
+}
+
+int saveResultToFile (FILE* file, GdomeDocument* result,
+ xsltStylesheetPtr style_libxslt)
+{
+ xmlDocPtr result_libxml;
+
+ if (result == NULL) return -1;
+ result_libxml = libxml_of_gdome(result);
+
+ xsltSetGenericDebugFunc(NULL, NULL);
+
+ return xsltSaveResultToFile(file, result_libxml, style_libxslt);
+}
+
+int saveResultToFd (int fd, GdomeDocument* result, xsltStylesheetPtr
+ style_libxslt)
+{
+ xmlDocPtr result_libxml;
+
+ if (result == NULL) return -1;
+ result_libxml = libxml_of_gdome(result);
+
+ xsltSetGenericDebugFunc(NULL, NULL);
+
+ 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;
+}
+