X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2FDEVEL%2Fgdome_xslt%2FC%2Fgdome_xslt%2Fgdome_xslt.c;h=232f14b12b7e4945965ae1775f50a78058efb6ca;hb=4167cea65ca58897d1a3dbb81ff95de5074700cc;hp=d3163a4fab29781118b896dc4a8bd357897b9093;hpb=0474bcec6d3bb8972eec0964a34872712122f340;p=helm.git diff --git a/helm/DEVEL/gdome_xslt/C/gdome_xslt/gdome_xslt.c b/helm/DEVEL/gdome_xslt/C/gdome_xslt/gdome_xslt.c index d3163a4fa..232f14b12 100644 --- a/helm/DEVEL/gdome_xslt/C/gdome_xslt/gdome_xslt.c +++ b/helm/DEVEL/gdome_xslt/C/gdome_xslt/gdome_xslt.c @@ -5,7 +5,9 @@ * The code is largely based on the code of T.J. Mather's XML::GDOME::XSLT * Perl module (http://kobesearch.cpan.org/search?dist=XML-GDOME-XSLT) * - * Copyright (C) 2002 Claudio Sacerdoti Coen + * Copyright (C) 2002: + * Claudio Sacerdoti Coen + * Stefano Zacchiroli * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,16 +23,19 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * For more information, please send an email to + * For more information, please send an email to {sacerdot,zack}@cs.unibo.it */ #include -#include +#include +#include +#include #include #include #include #include #include +#include "gdome_xslt.h" // Begin of Gdome internals exposed typedef struct _Gdome_xml_Document Gdome_xml_Document; @@ -61,6 +66,10 @@ GdomeDocument* gdome_of_libxml(xmlDocPtr n) // From now on no Gdome internal should be used directly. + /******************************/ + /* XSLT stylesheet Processing */ + /******************************/ + xsltStylesheetPtr processStylesheet(GdomeDocument* style) { xmlDocPtr style_copy; @@ -78,7 +87,12 @@ xsltStylesheetPtr processStylesheet(GdomeDocument* style) 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; @@ -88,11 +102,138 @@ GdomeDocument* applyStylesheet(GdomeDocument* source, xsltStylesheetPtr style_li 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); } + + /******************/ + /* 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; +} +