1 /*
   2  * Summary: set of utilities for the XSLT engine
   3  * Description: interfaces for the utilities module of the XSLT engine.
   4  *              things like message handling, profiling, and other
   5  *              generally useful routines.
   6  *
   7  * Copy: See Copyright for the status of this software.
   8  *
   9  * Author: Daniel Veillard
  10  */
  11 
  12 #ifndef __XML_XSLTUTILS_H__
  13 #define __XML_XSLTUTILS_H__
  14 
  15 #include <libxslt/xsltconfig.h>
  16 #ifdef HAVE_STDARG_H
  17 #include <stdarg.h>
  18 #endif
  19 #include <libxml/xpath.h>
  20 #include <libxml/dict.h>
  21 #include <libxml/xmlerror.h>
  22 #include "xsltexports.h"
  23 #include "xsltInternals.h"
  24 
  25 #ifdef __cplusplus
  26 extern "C" {
  27 #endif
  28 
  29 /**
  30  * XSLT_TODO:
  31  *
  32  * Macro to flag unimplemented blocks.
  33  */
  34 #define XSLT_TODO                           \
  35     xsltGenericError(xsltGenericErrorContext,               \
  36         "Unimplemented block at %s:%d\n",               \
  37             __FILE__, __LINE__);
  38 
  39 /**
  40  * XSLT_STRANGE:
  41  *
  42  * Macro to flag that a problem was detected internally.
  43  */
  44 #define XSLT_STRANGE                            \
  45     xsltGenericError(xsltGenericErrorContext,               \
  46         "Internal error at %s:%d\n",                \
  47             __FILE__, __LINE__);
  48 
  49 /**
  50  * IS_XSLT_ELEM:
  51  *
  52  * Checks that the element pertains to XSLT namespace.
  53  */
  54 #define IS_XSLT_ELEM(n)                         \
  55     (((n) != NULL) && ((n)->type == XML_ELEMENT_NODE) &&                \
  56      ((n)->ns != NULL) && (xmlStrEqual((n)->ns->href, XSLT_NAMESPACE)))
  57 
  58 /**
  59  * IS_XSLT_NAME:
  60  *
  61  * Checks the value of an element in XSLT namespace.
  62  */
  63 #define IS_XSLT_NAME(n, val)                        \
  64     (xmlStrEqual((n)->name, (const xmlChar *) (val)))
  65 
  66 /**
  67  * IS_XSLT_REAL_NODE:
  68  *
  69  * Check that a node is a 'real' one: document, element, text or attribute.
  70  */
  71 #define IS_XSLT_REAL_NODE(n)                        \
  72     (((n) != NULL) &&                           \
  73      (((n)->type == XML_ELEMENT_NODE) ||                \
  74       ((n)->type == XML_TEXT_NODE) ||                   \
  75       ((n)->type == XML_CDATA_SECTION_NODE) ||              \
  76       ((n)->type == XML_ATTRIBUTE_NODE) ||              \
  77       ((n)->type == XML_DOCUMENT_NODE) ||               \
  78       ((n)->type == XML_HTML_DOCUMENT_NODE) ||              \
  79       ((n)->type == XML_COMMENT_NODE) ||                \
  80       ((n)->type == XML_PI_NODE)))
  81 
  82 /*
  83  * Our own version of namespaced atributes lookup.
  84  */
  85 XSLTPUBFUN xmlChar * XSLTCALL
  86         xsltGetNsProp   (xmlNodePtr node,
  87                  const xmlChar *name,
  88                  const xmlChar *nameSpace);
  89 XSLTPUBFUN const xmlChar * XSLTCALL
  90         xsltGetCNsProp  (xsltStylesheetPtr style,
  91                  xmlNodePtr node,
  92                  const xmlChar *name,
  93                  const xmlChar *nameSpace);
  94 XSLTPUBFUN int XSLTCALL
  95         xsltGetUTF8Char (const unsigned char *utf,
  96                  int *len);
  97 
  98 /*
  99  * XSLT Debug Tracing Tracing Types
 100  */
 101 typedef enum {
 102     XSLT_TRACE_ALL =        -1,
 103     XSLT_TRACE_NONE =       0,
 104     XSLT_TRACE_COPY_TEXT =      1<<0,
 105     XSLT_TRACE_PROCESS_NODE =   1<<1,
 106     XSLT_TRACE_APPLY_TEMPLATE = 1<<2,
 107     XSLT_TRACE_COPY =       1<<3,
 108     XSLT_TRACE_COMMENT =        1<<4,
 109     XSLT_TRACE_PI =         1<<5,
 110     XSLT_TRACE_COPY_OF =        1<<6,
 111     XSLT_TRACE_VALUE_OF =       1<<7,
 112     XSLT_TRACE_CALL_TEMPLATE =  1<<8,
 113     XSLT_TRACE_APPLY_TEMPLATES =    1<<9,
 114     XSLT_TRACE_CHOOSE =     1<<10,
 115     XSLT_TRACE_IF =         1<<11,
 116     XSLT_TRACE_FOR_EACH =       1<<12,
 117     XSLT_TRACE_STRIP_SPACES =   1<<13,
 118     XSLT_TRACE_TEMPLATES =      1<<14,
 119     XSLT_TRACE_KEYS =       1<<15,
 120     XSLT_TRACE_VARIABLES =      1<<16
 121 } xsltDebugTraceCodes;
 122 
 123 /**
 124  * XSLT_TRACE:
 125  *
 126  * Control the type of xsl debugtrace messages emitted.
 127  */
 128 #define XSLT_TRACE(ctxt,code,call)  \
 129     if (ctxt->traceCode && (*(ctxt->traceCode) & code)) \
 130         call
 131 
 132 XSLTPUBFUN void XSLTCALL
 133         xsltDebugSetDefaultTrace(xsltDebugTraceCodes val);
 134 XSLTPUBFUN xsltDebugTraceCodes XSLTCALL
 135         xsltDebugGetDefaultTrace(void);
 136 
 137 /*
 138  * XSLT specific error and debug reporting functions.
 139  */
 140 XSLTPUBVAR xmlGenericErrorFunc xsltGenericError;
 141 XSLTPUBVAR void *xsltGenericErrorContext;
 142 XSLTPUBVAR xmlGenericErrorFunc xsltGenericDebug;
 143 XSLTPUBVAR void *xsltGenericDebugContext;
 144 
 145 XSLTPUBFUN void XSLTCALL
 146         xsltPrintErrorContext       (xsltTransformContextPtr ctxt,
 147                                              xsltStylesheetPtr style,
 148                          xmlNodePtr node);
 149 XSLTPUBFUN void XSLTCALL
 150         xsltMessage         (xsltTransformContextPtr ctxt,
 151                          xmlNodePtr node,
 152                          xmlNodePtr inst);
 153 XSLTPUBFUN void XSLTCALL
 154         xsltSetGenericErrorFunc     (void *ctx,
 155                          xmlGenericErrorFunc handler);
 156 XSLTPUBFUN void XSLTCALL
 157         xsltSetGenericDebugFunc     (void *ctx,
 158                          xmlGenericErrorFunc handler);
 159 XSLTPUBFUN void XSLTCALL
 160         xsltSetTransformErrorFunc   (xsltTransformContextPtr ctxt,
 161                          void *ctx,
 162                          xmlGenericErrorFunc handler);
 163 XSLTPUBFUN void XSLTCALL
 164         xsltTransformError      (xsltTransformContextPtr ctxt,
 165                          xsltStylesheetPtr style,
 166                          xmlNodePtr node,
 167                          const char *msg,
 168                          ...);
 169 
 170 XSLTPUBFUN int XSLTCALL
 171         xsltSetCtxtParseOptions     (xsltTransformContextPtr ctxt,
 172                          int options);
 173 /*
 174  * Sorting.
 175  */
 176 
 177 XSLTPUBFUN void XSLTCALL
 178         xsltDocumentSortFunction    (xmlNodeSetPtr list);
 179 XSLTPUBFUN void XSLTCALL
 180         xsltSetSortFunc         (xsltSortFunc handler);
 181 XSLTPUBFUN void XSLTCALL
 182         xsltSetCtxtSortFunc     (xsltTransformContextPtr ctxt,
 183                          xsltSortFunc handler);
 184 XSLTPUBFUN void XSLTCALL
 185         xsltDefaultSortFunction     (xsltTransformContextPtr ctxt,
 186                          xmlNodePtr *sorts,
 187                          int nbsorts);
 188 XSLTPUBFUN void XSLTCALL
 189         xsltDoSortFunction      (xsltTransformContextPtr ctxt,
 190                          xmlNodePtr * sorts,
 191                          int nbsorts);
 192 XSLTPUBFUN xmlXPathObjectPtr * XSLTCALL
 193         xsltComputeSortResult       (xsltTransformContextPtr ctxt,
 194                          xmlNodePtr sort);
 195 
 196 /*
 197  * QNames handling.
 198  */
 199 
 200 XSLTPUBFUN const xmlChar * XSLTCALL
 201         xsltSplitQName          (xmlDictPtr dict,
 202                          const xmlChar *name,
 203                          const xmlChar **prefix);
 204 XSLTPUBFUN const xmlChar * XSLTCALL
 205         xsltGetQNameURI         (xmlNodePtr node,
 206                          xmlChar **name);
 207 
 208 XSLTPUBFUN const xmlChar * XSLTCALL
 209         xsltGetQNameURI2        (xsltStylesheetPtr style,
 210                          xmlNodePtr node,
 211                          const xmlChar **name);
 212 
 213 /*
 214  * Output, reuse libxml I/O buffers.
 215  */
 216 XSLTPUBFUN int XSLTCALL
 217         xsltSaveResultTo        (xmlOutputBufferPtr buf,
 218                          xmlDocPtr result,
 219                          xsltStylesheetPtr style);
 220 XSLTPUBFUN int XSLTCALL
 221         xsltSaveResultToFilename    (const char *URI,
 222                          xmlDocPtr result,
 223                          xsltStylesheetPtr style,
 224                          int compression);
 225 XSLTPUBFUN int XSLTCALL
 226         xsltSaveResultToFile        (FILE *file,
 227                          xmlDocPtr result,
 228                          xsltStylesheetPtr style);
 229 XSLTPUBFUN int XSLTCALL
 230         xsltSaveResultToFd      (int fd,
 231                          xmlDocPtr result,
 232                          xsltStylesheetPtr style);
 233 XSLTPUBFUN int XSLTCALL
 234         xsltSaveResultToString          (xmlChar **doc_txt_ptr,
 235                                                  int * doc_txt_len,
 236                                                  xmlDocPtr result,
 237                                                  xsltStylesheetPtr style);
 238 
 239 /*
 240  * XPath interface
 241  */
 242 XSLTPUBFUN xmlXPathCompExprPtr XSLTCALL
 243         xsltXPathCompile        (xsltStylesheetPtr style,
 244                          const xmlChar *str);
 245 XSLTPUBFUN xmlXPathCompExprPtr XSLTCALL
 246         xsltXPathCompileFlags       (xsltStylesheetPtr style,
 247                          const xmlChar *str,
 248                          int flags);
 249 
 250 /*
 251  * Profiling.
 252  */
 253 XSLTPUBFUN void XSLTCALL
 254         xsltSaveProfiling       (xsltTransformContextPtr ctxt,
 255                          FILE *output);
 256 XSLTPUBFUN xmlDocPtr XSLTCALL
 257         xsltGetProfileInformation   (xsltTransformContextPtr ctxt);
 258 
 259 XSLTPUBFUN long XSLTCALL
 260         xsltTimestamp           (void);
 261 XSLTPUBFUN void XSLTCALL
 262         xsltCalibrateAdjust     (long delta);
 263 
 264 /**
 265  * XSLT_TIMESTAMP_TICS_PER_SEC:
 266  *
 267  * Sampling precision for profiling
 268  */
 269 #define XSLT_TIMESTAMP_TICS_PER_SEC 100000l
 270 
 271 /*
 272  * Hooks for the debugger.
 273  */
 274 
 275 typedef enum {
 276     XSLT_DEBUG_NONE = 0, /* no debugging allowed */
 277     XSLT_DEBUG_INIT,
 278     XSLT_DEBUG_STEP,
 279     XSLT_DEBUG_STEPOUT,
 280     XSLT_DEBUG_NEXT,
 281     XSLT_DEBUG_STOP,
 282     XSLT_DEBUG_CONT,
 283     XSLT_DEBUG_RUN,
 284     XSLT_DEBUG_RUN_RESTART,
 285     XSLT_DEBUG_QUIT
 286 } xsltDebugStatusCodes;
 287 
 288 XSLTPUBVAR int xslDebugStatus;
 289 
 290 typedef void (*xsltHandleDebuggerCallback) (xmlNodePtr cur, xmlNodePtr node,
 291             xsltTemplatePtr templ, xsltTransformContextPtr ctxt);
 292 typedef int (*xsltAddCallCallback) (xsltTemplatePtr templ, xmlNodePtr source);
 293 typedef void (*xsltDropCallCallback) (void);
 294 
 295 XSLTPUBFUN void XSLTCALL
 296         xsltSetDebuggerStatus       (int value);
 297 XSLTPUBFUN int XSLTCALL
 298         xsltGetDebuggerStatus       (void);
 299 XSLTPUBFUN int XSLTCALL
 300         xsltSetDebuggerCallbacks    (int no, void *block);
 301 XSLTPUBFUN int XSLTCALL
 302         xslAddCall          (xsltTemplatePtr templ,
 303                          xmlNodePtr source);
 304 XSLTPUBFUN void XSLTCALL
 305         xslDropCall         (void);
 306 
 307 #ifdef __cplusplus
 308 }
 309 #endif
 310 
 311 #endif /* __XML_XSLTUTILS_H__ */
 312 
 313