]> matita.cs.unibo.it Git - helm.git/commitdiff
added support for setting debug and error callbacks
authorStefano Zacchiroli <zack@upsilon.cc>
Thu, 13 Mar 2003 21:45:37 +0000 (21:45 +0000)
committerStefano Zacchiroli <zack@upsilon.cc>
Thu, 13 Mar 2003 21:45:37 +0000 (21:45 +0000)
helm/DEVEL/gdome_xslt/C/gdome_xslt/gdome_xslt.c
helm/DEVEL/gdome_xslt/C/gdome_xslt/gdome_xslt.h
helm/DEVEL/gdome_xslt/ocaml/gdome_xslt/gdome_xslt.ml
helm/DEVEL/gdome_xslt/ocaml/gdome_xslt/gdome_xslt.mli
helm/DEVEL/gdome_xslt/ocaml/gdome_xslt/i_gdome_xslt.ml
helm/DEVEL/gdome_xslt/ocaml/gdome_xslt/ml_gdome_xslt.c
helm/DEVEL/gdome_xslt/ocaml/gdome_xslt/ml_gdome_xslt.h

index 87d3d4324ae85c1d2c159068a6af94b9896b9b3c..2c34f9cb5512c36fae056f7ccf800e14822320d1 100644 (file)
@@ -27,6 +27,8 @@
  */
 
 #include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
 #include <libgdome/gdome.h>
 #include <libxslt/xsltconfig.h>
 #include <libxslt/xslt.h>
@@ -152,3 +154,86 @@ int saveResultToFd (int fd, GdomeDocument* result, xsltStylesheetPtr
        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;
+}
+
index 685c7afb44fa65acfa2814d8ac0b41e461d25717..383208770f57e6fc03721a3e273aebb5ad1ac8ba 100644 (file)
 extern "C" {
 #endif /* __cplusplus */
 
+       /******************************/
+       /* XSLT stylesheet Processing */
+       /******************************/
+
 xsltStylesheetPtr      processStylesheet       (GdomeDocument* style);
 
+
+       /*******************************/
+       /* XSLT stylesheet Application */
+       /*******************************/
+
 GdomeDocument*                 applyStylesheet         (GdomeDocument* source,
                                                 xsltStylesheetPtr style_libxslt,
                                                 const char** params);
 
+       /******************/
+       /* Results Output */
+       /******************/
+
 int                    saveResultToFilename    (const char* name,
                                                 GdomeDocument* result,
                                                 xsltStylesheetPtr style_libxslt,
@@ -57,6 +70,16 @@ int                  saveResultToFile        (FILE* file,
 int                    saveResultToFd          (int fd,
                                                 GdomeDocument* result,
                                                 xsltStylesheetPtr style_libxslt);
+
+       /**********************************************/
+       /* Error and Debugging Callbacks Registration */
+       /**********************************************/
+
+typedef                        void(*gdomeXsltMsgCallback)(const char *);
+
+void                   setErrorCallback        (gdomeXsltMsgCallback callback);
+void                   setDebugCallback        (gdomeXsltMsgCallback callback);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index aa05777ab5d8d20a3bc985089dd789f3d7d47469..b64a006b4c312baace2ea2a7cd5a05e01412abf0 100644 (file)
@@ -44,3 +44,16 @@ let saveResultToChannel ~outchan ~result ~stylesheet =
     ~stylesheet
 ;;
 
+let setErrorCallback = function
+  | None -> I_gdome_xslt.disableErrorCallback ()
+  | Some (callback: string -> unit) ->
+      Callback.register "error_callback" callback;
+      I_gdome_xslt.enableErrorCallback ()
+;;
+let setDebugCallback = function
+  | None -> I_gdome_xslt.disableDebugCallback ()
+  | Some (callback: string -> unit) ->
+      Callback.register "debug_callback" callback;
+      I_gdome_xslt.enableDebugCallback ()
+;;
+
index 3c7c232ec044b236b7e1c7eb8a69f644266992ca..8115457f33778299e86c1c2bbcb842284d8a57cc 100644 (file)
@@ -49,3 +49,11 @@ val saveResultToChannel:
   stylesheet: I_gdome_xslt.processed_stylesheet ->
     unit
 
+(** set error callback, that is a function invoked each time an error message is
+generated. If None is passed, libxslt default error callback is used *)
+val setErrorCallback: (string -> unit) option -> unit
+
+(** set debug callback, that is a function invoked each time a debugging message
+is generated. If None is passed, libxslt default error callback is used *)
+val setDebugCallback: (string -> unit) option -> unit
+
index 92f74da39c74ecfb6d8d339f6d6fbc07af0ad945..6f686c482d7224771714e8ded072f126e9037401 100644 (file)
@@ -51,3 +51,8 @@ external saveResultToChannel:
     unit
   = "ml_saveResultToChannel"
 
+external enableErrorCallback  :  unit -> unit = "ml_enableErrorCallback"
+external disableErrorCallback :  unit -> unit = "ml_disableErrorCallback"
+external enableDebugCallback  :  unit -> unit = "ml_enableDebugCallback"
+external disableDebugCallback :  unit -> unit = "ml_disableDebugCallback"
+
index b6330868f99077805710a162459e80d38938a921..bc2854a9b890066fec49d49aae7986d3d7248d22 100644 (file)
@@ -30,6 +30,7 @@
 #include <caml/memory.h>
 #include <caml/custom.h>
 #include <caml/callback.h>
+#include <caml/mlvalues.h>
 
 #include <libxslt/xsltconfig.h>
 #include <libxslt/imports.h>
@@ -141,3 +142,43 @@ value ml_saveResultToChannel(value channel,
        CAMLreturn0;
 }
 
+       /* error callback handling */
+
+static void ml_gdomeXsltErrorCallback(const char *msg) {
+       callback(*caml_named_value("error_callback"), copy_string(msg));
+
+       return;
+}
+
+value ml_enableErrorCallback(value unit) {
+       CAMLparam1(unit);
+       setErrorCallback(ml_gdomeXsltErrorCallback);
+       CAMLreturn(Val_unit);
+}
+
+value ml_disableErrorCallback(value unit) {
+       CAMLparam1(unit);
+       setErrorCallback(NULL);
+       CAMLreturn(Val_unit);
+}
+
+       /* debug callback handling */
+
+static void ml_gdomeXsltDebugCallback(const char *msg) {
+       callback(*caml_named_value("debug_callback"), copy_string(msg));
+
+       return;
+}
+
+value ml_enableDebugCallback(value unit) {
+       CAMLparam1(unit);
+       setDebugCallback(ml_gdomeXsltDebugCallback);
+       CAMLreturn(Val_unit);
+}
+
+value ml_disableDebugCallback(value unit) {
+       CAMLparam1(unit);
+       setDebugCallback(NULL);
+       CAMLreturn(Val_unit);
+}
+
index 974ad7d1438693ef0980d2fdff0efa7a469738a1..a173bc97fc02a350c48f7b08447b9aa838fcfd6f 100644 (file)
@@ -33,3 +33,8 @@ value ml_applyStylesheet(value source, value style, value params);
 
 value ml_saveResultToChannel(value channel, value result, value stylesheet);
 
+value ml_enableErrorCallback(value unit);
+value ml_disableErrorCallback(value unit);
+value ml_enableDebugCallback(value unit);
+value ml_disableDebugCallback(value unit);
+