revamped the mechanism to hook a debuger to use a callback setup function,
authorDaniel Veillard <veillard@src.gnome.org>
Fri, 30 Nov 2001 12:01:25 +0000 (12:01 +0000)
committerDaniel Veillard <veillard@src.gnome.org>
Fri, 30 Nov 2001 12:01:25 +0000 (12:01 +0000)
* libxslt/attributes.c libxslt/transform.c libxslt/xsltutils.c
  libxslt/xsltutils.h: revamped the mechanism to hook a debuger
  to use a callback setup function, deprecating libxsltbreakpoint
* xsltproc/Makefile.am configure.in breakpoint/Makefile.am: removing
  dependancies on libxsltbreakpoint
Daniel

ChangeLog
breakpoint/Makefile.am
configure.in
libxslt/attributes.c
libxslt/transform.c
libxslt/xsltutils.c
libxslt/xsltutils.h
xsltproc/Makefile.am

index 83b51f9c27f8e2d2d9a7072911c5a949661b2e8b..0308119b6bad4cdfbed25a6339962ce40d27f08b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Fri Nov 30 12:59:05 CET 2001 Daniel Veillard <daniel@veillard.com>
+
+       * libxslt/attributes.c libxslt/transform.c libxslt/xsltutils.c
+         libxslt/xsltutils.h: revamped the mechanism to hook a debuger
+         to use a callback setup function, deprecating libxsltbreakpoint
+       * xsltproc/Makefile.am configure.in breakpoint/Makefile.am: removing
+         dependancies on libxsltbreakpoint
+
 Thu Nov 29 09:52:38 CET 2001 Daniel Veillard <daniel@veillard.com>
 
         Build patch from  Peter Williams  <peterw@ximian.com>
index d7c79667a047aa9d47387459ad80ae0c9000144d..a233281c783cf707c2b14b5d781e44d989554067 100644 (file)
@@ -15,7 +15,7 @@ libxsltbreakpoint_la_SOURCES =        \
 
 
 libxsltbreakpoint_la_LIBADD = @LIBXML_LIBS@
-libxsltbreakpoint_la_LDFLAGS = -version-info @LIBXSLT_VERSION_INFO@
+libxsltbreakpoint_la_LDFLAGS = -version-info @LIBXSLTBREAK_VERSION_INFO@
 
 man_MANS = #breakpoint.4
 
index 3f0c2466dd5f58707165c39ea76d1f81c2652c3a..cd38f190e6570997a424e5687e72e1c654fc4305 100644 (file)
@@ -42,6 +42,30 @@ AC_SUBST(LIBEXSLT_VERSION)
 AC_SUBST(LIBEXSLT_VERSION_INFO)
 AC_SUBST(LIBEXSLT_VERSION_NUMBER)
 
+dnl
+dnl libxsltbreakpoint is a compatibility obsoleted library
+dnl it's blocked at 1.0.8 and should be removed in default build in the
+dnl future
+dnl
+
+LIBXSLTBREAK_MAJOR_VERSION=1
+LIBXSLTBREAK_MINOR_VERSION=0
+LIBXSLTBREAK_MICRO_VERSION=8
+
+LIBXSLTBREAK_VERSION=$LIBXSLTBREAK_MAJOR_VERSION.$LIBXSLTBREAK_MINOR_VERSION.$LIBXSLTBREAK_MICRO_VERSION
+LIBXSLTBREAK_VERSION_INFO=`expr $LIBXSLTBREAK_MAJOR_VERSION + $LIBXSLTBREAK_MINOR_VERSION`:$LIBXSLTBREAK_MICRO_VERSION:$LIBXSLTBREAK_MINOR_VERSION
+
+LIBXSLTBREAK_VERSION_NUMBER=`expr $LIBXSLTBREAK_MAJOR_VERSION \* 10000 + $LIBXSLTBREAK_MINOR_VERSION \* 100 + $LIBXSLTBREAK_MICRO_VERSION`
+
+AC_SUBST(LIBXSLTBREAK_MAJOR_VERSION)
+AC_SUBST(LIBXSLTBREAK_MINOR_VERSION)
+AC_SUBST(LIBXSLTBREAK_MICRO_VERSION)
+AC_SUBST(LIBXSLTBREAK_VERSION)
+AC_SUBST(LIBXSLTBREAK_VERSION_INFO)
+AC_SUBST(LIBXSLTBREAK_VERSION_NUMBER)
+
+
+
 
 VERSION=${LIBXSLT_VERSION}
 
@@ -136,7 +160,7 @@ AC_SUBST(WITH_MEM_DEBUG)
 dnl 
 dnl Is debugger support requested
 dnl
-AC_ARG_WITH(with_debugger, [  --with-debugger        Add the debugging module (off)])
+AC_ARG_WITH(with_debugger, [  --with-debugger        Add the debugging support (on)])
 if test "$with_debugger" = "no" ; then
     echo Disabling debugger
     WITH_DEBUGGER=0
@@ -260,13 +284,8 @@ case ${host} in
 esac
 
 XSLT_INCLUDEDIR='-I${includedir}'
-if test "${WITH_DEBUGGER}" = "1" ; then
-       XSLT_LIBS="-lxslt -lxsltbreakpoint $LIBXML_LIBS $M_LIBS"
-       EXTRA_LIBS='$(top_builddir)/breakpoint/libxsltbreakpoint.la'" $LIBXML_LIBS $M_LIBS"
-else
-       XSLT_LIBS="-lxslt $LIBXML_LIBS $M_LIBS"
-       EXTRA_LIBS="$LIBXML_LIBS $M_LIBS"
-fi
+XSLT_LIBS="-lxslt $LIBXML_LIBS $M_LIBS"
+EXTRA_LIBS="$LIBXML_LIBS $M_LIBS"
 
 AC_SUBST(XSLT_LIBDIR)
 AC_SUBST(XSLT_INCLUDEDIR)
index c245c31b8f5e0f2b0751a583cba7510211fadead..1bfcc2e6131636e5237933a0e2582c50918c1ee8 100644 (file)
@@ -46,9 +46,6 @@
 #include "imports.h"
 #include "transform.h"
 
-#ifdef WITH_DEBUGGER
-#include "../breakpoint/breakpoint.h"
-#endif
 #ifdef WITH_XSLT_DEBUG
 #define WITH_XSLT_DEBUG_ATTRIBUTES
 #endif
@@ -383,7 +380,9 @@ error:
  */
 static void
 xsltAttributeInternal(xsltTransformContextPtr ctxt, xmlNodePtr node,
-             xmlNodePtr inst, xsltStylePreCompPtr comp, int fromset) {
+                      xmlNodePtr inst, xsltStylePreCompPtr comp,
+                      int fromset)
+{
     xmlChar *prop = NULL;
     xmlChar *ncname = NULL, *name, *namespace;
     xmlChar *prefix = NULL;
@@ -394,105 +393,108 @@ xsltAttributeInternal(xsltTransformContextPtr ctxt, xmlNodePtr node,
 
 
     if (ctxt->insert == NULL)
-       return;
+        return;
     if (comp == NULL) {
-       xsltPrintErrorContext(ctxt, NULL, inst);
-       xsltGenericError(xsltGenericErrorContext,
-            "xsl:attribute : compilation failed\n");
-       return;
+        xsltPrintErrorContext(ctxt, NULL, inst);
+        xsltGenericError(xsltGenericErrorContext,
+                         "xsl:attribute : compilation failed\n");
+        return;
     }
 
-    if ((ctxt == NULL) || (node == NULL) || (inst == NULL) || (comp == NULL))
-       return;
+    if ((ctxt == NULL) || (node == NULL) || (inst == NULL)
+        || (comp == NULL))
+        return;
     if (!comp->has_name) {
-       return;
+        return;
     }
     if (ctxt->insert->children != NULL) {
-       xsltPrintErrorContext(ctxt, NULL, inst);
-       xsltGenericError(xsltGenericErrorContext,
-            "xsl:attribute : node already has children\n");
-       return;
+        xsltPrintErrorContext(ctxt, NULL, inst);
+        xsltGenericError(xsltGenericErrorContext,
+                         "xsl:attribute : node already has children\n");
+        return;
     }
-
 #ifdef WITH_DEBUGGER
-     /* --- break point code --- */
-     if (xslDebugStatus != DEBUG_NONE) {
-       xslHandleDebugger(inst, node, NULL, ctxt);
-     }
+    if (xslDebugStatus != XSLT_DEBUG_NONE) {
+        xslHandleDebugger(inst, node, NULL, ctxt);
+    }
 #endif
 
     if (comp->name == NULL) {
-       prop = xsltEvalAttrValueTemplate(ctxt, inst, (const xmlChar *)"name",
-                                        XSLT_NAMESPACE);
-       if (prop == NULL) {
-           xsltPrintErrorContext(ctxt, NULL, inst);
-           xsltGenericError(xsltGenericErrorContext,
-                "xsl:attribute : name is missing\n");
-           goto error;
-       }
-       name = prop;
+        prop =
+            xsltEvalAttrValueTemplate(ctxt, inst, (const xmlChar *) "name",
+                                      XSLT_NAMESPACE);
+        if (prop == NULL) {
+            xsltPrintErrorContext(ctxt, NULL, inst);
+            xsltGenericError(xsltGenericErrorContext,
+                             "xsl:attribute : name is missing\n");
+            goto error;
+        }
+        name = prop;
     } else {
-       name = comp->name;
+        name = comp->name;
     }
 
     ncname = xmlSplitQName2(name, &prefix);
     if (ncname == NULL) {
-       prefix = NULL;
+        prefix = NULL;
     } else {
-       name = ncname;
+        name = ncname;
     }
-    if (!xmlStrncasecmp(prefix, (xmlChar *)"xml", 3)) {
+    if (!xmlStrncasecmp(prefix, (xmlChar *) "xml", 3)) {
 #ifdef WITH_XSLT_DEBUG_PARSING
-       xsltGenericDebug(xsltGenericDebugContext,
-            "xsltAttribute: xml prefix forbidden\n");
+        xsltGenericDebug(xsltGenericDebugContext,
+                         "xsltAttribute: xml prefix forbidden\n");
 #endif
-       goto error;
+        goto error;
     }
     if ((comp->ns == NULL) && (comp->has_ns)) {
-       namespace = xsltEvalAttrValueTemplate(ctxt, inst,
-               (const xmlChar *)"namespace", XSLT_NAMESPACE);
-       if (namespace != NULL) {
-           ns = xsltGetSpecialNamespace(ctxt, inst, namespace, prefix,
-                                        ctxt->insert);
-           xmlFree(namespace);
-       } else {
-           if (prefix != NULL) {
-               ns = xmlSearchNs(inst->doc, inst, prefix);
-               if (ns == NULL) {
-                   xsltPrintErrorContext(ctxt, NULL, inst);
-                   xsltGenericError(xsltGenericErrorContext,
-                       "xsl:attribute : no namespace bound to prefix %s\n", prefix);
-               } else {
-                   ns = xsltGetNamespace(ctxt, inst, ns, ctxt->insert);
-               }
-           }
-       }
+        namespace = xsltEvalAttrValueTemplate(ctxt, inst,
+                                              (const xmlChar *)
+                                              "namespace", XSLT_NAMESPACE);
+        if (namespace != NULL) {
+            ns = xsltGetSpecialNamespace(ctxt, inst, namespace, prefix,
+                                         ctxt->insert);
+            xmlFree(namespace);
+        } else {
+            if (prefix != NULL) {
+                ns = xmlSearchNs(inst->doc, inst, prefix);
+                if (ns == NULL) {
+                    xsltPrintErrorContext(ctxt, NULL, inst);
+                    xsltGenericError(xsltGenericErrorContext,
+                                     "xsl:attribute : no namespace bound to prefix %s\n",
+                                     prefix);
+                } else {
+                    ns = xsltGetNamespace(ctxt, inst, ns, ctxt->insert);
+                }
+            }
+        }
     } else if (comp->ns != NULL) {
-       ns = xsltGetSpecialNamespace(ctxt, inst, comp->ns, prefix,
-                                    ctxt->insert);
+        ns = xsltGetSpecialNamespace(ctxt, inst, comp->ns, prefix,
+                                     ctxt->insert);
     }
 
     if ((fromset) && (ns != NULL))
-       URL = ns->href;
+        URL = ns->href;
     if ((fromset == 0) || (!xmlHasNsProp(ctxt->insert, name, URL))) {
-       value = xsltEvalTemplateString(ctxt, node, inst);
-       if (value == NULL) {
-           if (ns) {
-               attr = xmlSetNsProp(ctxt->insert, ns, name, 
-                                   (const xmlChar *)"");
-           } else {
-               attr = xmlSetProp(ctxt->insert, name, (const xmlChar *)"");
-           }
-       } else {
-           if (ns) {
-               attr = xmlSetNsProp(ctxt->insert, ns, name, value);
-           } else {
-               attr = xmlSetProp(ctxt->insert, name, value);
-           }
-       }
+        value = xsltEvalTemplateString(ctxt, node, inst);
+        if (value == NULL) {
+            if (ns) {
+                attr = xmlSetNsProp(ctxt->insert, ns, name,
+                                    (const xmlChar *) "");
+            } else {
+                attr =
+                    xmlSetProp(ctxt->insert, name, (const xmlChar *) "");
+            }
+        } else {
+            if (ns) {
+                attr = xmlSetNsProp(ctxt->insert, ns, name, value);
+            } else {
+                attr = xmlSetProp(ctxt->insert, name, value);
+            }
+        }
     }
 
-error:
+  error:
     if (prop != NULL)
         xmlFree(prop);
     if (ncname != NULL)
@@ -530,7 +532,9 @@ xsltAttribute(xsltTransformContextPtr ctxt, xmlNodePtr node,
 
 void
 xsltApplyAttributeSet(xsltTransformContextPtr ctxt, xmlNodePtr node,
-                     xmlNodePtr inst ATTRIBUTE_UNUSED, xmlChar *attributes) {
+                      xmlNodePtr inst ATTRIBUTE_UNUSED,
+                      xmlChar * attributes)
+{
     xmlChar *ncname = NULL;
     xmlChar *prefix = NULL;
     xmlChar *attrib, *endattr;
@@ -538,57 +542,61 @@ xsltApplyAttributeSet(xsltTransformContextPtr ctxt, xmlNodePtr node,
     xsltStylesheetPtr style;
 
     if (attributes == NULL) {
-       return;
+        return;
     }
 
     attrib = attributes;
     while (*attrib != 0) {
-       while (IS_BLANK(*attrib)) attrib++;
-       if (*attrib == 0)
-           break;
+        while (IS_BLANK(*attrib))
+            attrib++;
+        if (*attrib == 0)
+            break;
         endattr = attrib;
-       while ((*endattr != 0) && (!IS_BLANK(*endattr))) endattr++;
-       attrib = xmlStrndup(attrib, endattr - attrib);
-       if (attrib) {
+        while ((*endattr != 0) && (!IS_BLANK(*endattr)))
+            endattr++;
+        attrib = xmlStrndup(attrib, endattr - attrib);
+        if (attrib) {
 #ifdef WITH_XSLT_DEBUG_ATTRIBUTES
-           xsltGenericDebug(xsltGenericDebugContext,
-               "apply attribute set %s\n", attrib);
+            xsltGenericDebug(xsltGenericDebugContext,
+                             "apply attribute set %s\n", attrib);
 #endif
-           ncname = xmlSplitQName2(attrib, &prefix);
-           if (ncname == NULL) {
-               ncname = attrib;
-               attrib = NULL;
-               prefix = NULL;
-           }
-
-           style = ctxt->style;
+            ncname = xmlSplitQName2(attrib, &prefix);
+            if (ncname == NULL) {
+                ncname = attrib;
+                attrib = NULL;
+                prefix = NULL;
+            }
+
+            style = ctxt->style;
 #ifdef WITH_DEBUGGER
-           /* --- break point code --- */
-           if (style && (xslDebugStatus != DEBUG_NONE)) {
-             values = xmlHashLookup2(style->attributeSets, ncname, prefix);
-             if (values)       
-               xslHandleDebugger(values->attr->parent, node, NULL, ctxt);      
-           }
+            if (style && (xslDebugStatus != XSLT_DEBUG_NONE)) {
+                values =
+                    xmlHashLookup2(style->attributeSets, ncname, prefix);
+                if (values)
+                    xslHandleDebugger(values->attr->parent, node, NULL,
+                                      ctxt);
+            }
 #endif
-           while (style != NULL) {
-               values = xmlHashLookup2(style->attributeSets, ncname, prefix);
-               while (values != NULL) {
-                   if (values->attr != NULL) {
-                       xsltAttributeInternal(ctxt, node, values->attr,
-                                             values->attr->_private, 1);
-                   }
-                   values = values->next;
-               }
-               style = xsltNextImport(style);
-           }
-           if (attrib != NULL)
-               xmlFree(attrib);
-           if (ncname != NULL)
-               xmlFree(ncname);
-           if (prefix != NULL)
-               xmlFree(prefix);
-       }
-       attrib = endattr;
+            while (style != NULL) {
+                values =
+                    xmlHashLookup2(style->attributeSets, ncname, prefix);
+                while (values != NULL) {
+                    if (values->attr != NULL) {
+                        xsltAttributeInternal(ctxt, node, values->attr,
+                                              values->attr->_private, 1);
+                    }
+                    values = values->next;
+                }
+                style = xsltNextImport(style);
+            }
+            if (attrib != NULL)
+                xmlFree(attrib);
+            if (ncname != NULL)
+                xmlFree(ncname);
+            if (prefix != NULL)
+                xmlFree(prefix);
+        }
+        attrib = endattr;
     }
 }
 
index 6707576bc615ef568f9cefc7ff856df2403fbc3e..1ca922ccb41bafed27cfcb25f365573d58830017 100644 (file)
@@ -61,11 +61,6 @@ static int xsltGetHTMLIDs(const xmlChar *version, const xmlChar **publicID,
                          const xmlChar **systemID);
 #endif
 
-#ifdef WITH_DEBUGGER
-#include "../breakpoint/breakpoint.h"
-int xslDebugStatus;
-#endif
-
 int xsltMaxDepth = 5000;
 
 /*
@@ -1016,24 +1011,6 @@ xsltProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
 }
 
 
-/**
- * xslHandleDebugger:
- * @cur : source node being executed
- * @node : data node being processed
- * @templ : temlate that applies to node
- * @ctxt : the xslt transform context 
- * 
- * If either cur or node are a breakpoint, or xslDebugStatus in state 
- *   where debugging must occcur at this time then transfer control
- *   to the xslDebugBreak function
- */
-void
-xslHandleDebugger(xmlNodePtr cur ATTRIBUTE_UNUSED, xmlNodePtr node ATTRIBUTE_UNUSED,
-                  xsltTemplatePtr templ ATTRIBUTE_UNUSED, xsltTransformContextPtr ctxt ATTRIBUTE_UNUSED)
-{
-
-}
-
 /**
  * xsltApplyOneTemplate:
  * @ctxt:  a XSLT process context
@@ -1049,7 +1026,7 @@ xslHandleDebugger(xmlNodePtr cur ATTRIBUTE_UNUSED, xmlNodePtr node ATTRIBUTE_UNU
 void
 xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
                      xmlNodePtr list, xsltTemplatePtr templ,
-                    xsltStackElemPtr params)
+                     xsltStackElemPtr params)
 {
     xmlNodePtr cur = NULL, insert, copy = NULL;
     xmlNodePtr oldInsert;
@@ -1064,8 +1041,7 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
     long start = 0;
 
 #ifdef WITH_DEBUGGER
-    /* --- break point code --- */
-    if (xslDebugStatus != DEBUG_NONE) {
+    if (xslDebugStatus != XSLT_DEBUG_NONE) {
         if (templ) {
             addCallResult = xslAddCall(templ, templ->elem);
         } else {
@@ -1074,8 +1050,8 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
 
         switch (xslDebugStatus) {
 
-            case DEBUG_RUN_RESTART:
-            case DEBUG_QUIT:
+            case XSLT_DEBUG_RUN_RESTART:
+            case XSLT_DEBUG_QUIT:
                 if (addCallResult)
                     xslDropCall();
                 return;
@@ -1084,11 +1060,10 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
         if (templ)
             xslHandleDebugger(templ->elem, node, templ, ctxt);
         else if (list)
-         xslHandleDebugger(list, node, templ, ctxt);
-       else if (ctxt->inst)
-         xslHandleDebugger(ctxt->inst, node, templ, ctxt);
+            xslHandleDebugger(list, node, templ, ctxt);
+        else if (ctxt->inst)
+            xslHandleDebugger(ctxt->inst, node, templ, ctxt);
     }
-    /*  -- end --- */
 #endif
 
     if ((ctxt == NULL) || (list == NULL))
@@ -1096,7 +1071,7 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
     CHECK_STOPPED;
 
     if (ctxt->templNr >= xsltMaxDepth) {
-       xsltPrintErrorContext(ctxt, NULL, list);
+        xsltPrintErrorContext(ctxt, NULL, list);
         xsltGenericError(xsltGenericErrorContext,
                          "xsltApplyOneTemplate: loop found ???\n");
         xsltGenericError(xsltGenericErrorContext,
@@ -1112,21 +1087,20 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
     oldInst = ctxt->inst;
     oldCurrent = ctxt->node;
     varsPush(ctxt, params);
-    oldBase = ctxt->varsBase; /* only needed if templ != NULL */
+    oldBase = ctxt->varsBase;   /* only needed if templ != NULL */
     if (templ != NULL) {
-       ctxt->varsBase = ctxt->varsNr - 1;
+        ctxt->varsBase = ctxt->varsNr - 1;
         ctxt->node = node;
-       if (ctxt->profile) {
-           templ->nbCalls++;
-           start = xsltTimestamp();
-           profPush(ctxt, 0);
-       }
-       templPush(ctxt, templ);
+        if (ctxt->profile) {
+            templ->nbCalls++;
+            start = xsltTimestamp();
+            profPush(ctxt, 0);
+        }
+        templPush(ctxt, templ);
 #ifdef WITH_XSLT_DEBUG_PROCESS
-       if (templ->name != NULL)
-           xsltGenericDebug(xsltGenericDebugContext,
-                            "applying template '%s'\n",
-                            templ->name);
+        if (templ->name != NULL)
+            xsltGenericDebug(xsltGenericDebugContext,
+                             "applying template '%s'\n", templ->name);
 #endif
     }
 
@@ -1137,14 +1111,12 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
     while (cur != NULL) {
         ctxt->inst = cur;
 #ifdef WITH_DEBUGGER
-        /* --- break point code --- */
         switch (xslDebugStatus) {
-            case DEBUG_RUN_RESTART:
-            case DEBUG_QUIT:
+            case XSLT_DEBUG_RUN_RESTART:
+            case XSLT_DEBUG_QUIT:
                 break;
 
         }
-        /* --- end  --- */
 #endif
         /*
          * test, we must have a valid insertion point
@@ -1154,10 +1126,10 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
             xsltGenericDebug(xsltGenericDebugContext,
                              "xsltApplyOneTemplate: insert == NULL !\n");
 #endif
-           goto error;
+            goto error;
         }
 #ifdef WITH_DEBUGGER
-        if (xslDebugStatus != DEBUG_NONE)
+        if (xslDebugStatus != XSLT_DEBUG_NONE)
             xslHandleDebugger(cur, node, templ, ctxt);
 #endif
 
@@ -1171,16 +1143,16 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
                 if (IS_XSLT_NAME(cur, "message")) {
                     xsltMessage(ctxt, node, cur);
                 } else {
-                   /*
-                    * That's an error try to apply one of the fallback cases
-                    */
-                   ctxt->insert = insert;
-                   if (!xsltApplyFallbacks(ctxt, node, cur)) {
-                       xsltGenericError(xsltGenericDebugContext,
-                                "xsltApplyOneTemplate: %s was not compiled\n",
-                                     cur->name);
-                   }
-                   ctxt->insert = oldInsert;
+                    /*
+                     * That's an error try to apply one of the fallback cases
+                     */
+                    ctxt->insert = insert;
+                    if (!xsltApplyFallbacks(ctxt, node, cur)) {
+                        xsltGenericError(xsltGenericDebugContext,
+                                         "xsltApplyOneTemplate: %s was not compiled\n",
+                                         cur->name);
+                    }
+                    ctxt->insert = oldInsert;
                 }
                 goto skip_children;
             }
@@ -1219,14 +1191,14 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
                                  cur->content);
             else if (cur->name == xmlStringTextNoenc)
                 xsltGenericDebug(xsltGenericDebugContext,
-                             "xsltApplyOneTemplate: copy unescaped text %s\n",
+                                 "xsltApplyOneTemplate: copy unescaped text %s\n",
                                  cur->content);
             else
                 xsltGenericDebug(xsltGenericDebugContext,
                                  "xsltApplyOneTemplate: copy text %s\n",
                                  cur->content);
 #endif
-           xsltCopyText(ctxt, insert, cur);
+            xsltCopyText(ctxt, insert, cur);
         } else if ((cur->type == XML_ELEMENT_NODE) &&
                    (cur->ns != NULL) && (cur->_private != NULL)) {
             xsltTransformFunction function;
@@ -1234,11 +1206,11 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
             /*
              * Flagged as an extension element
              */
-           if (cur->_private == xsltExtMarker)
-               function = (xsltTransformFunction)
-                   xsltExtElementLookup(ctxt, cur->name, cur->ns->href);
-           else
-               function = ((xsltElemPreCompPtr)cur->_private)->func;
+            if (cur->_private == xsltExtMarker)
+                function = (xsltTransformFunction)
+                    xsltExtElementLookup(ctxt, cur->name, cur->ns->href);
+            else
+                function = ((xsltElemPreCompPtr) cur->_private)->func;
 
             if (function == NULL) {
                 xmlNodePtr child;
@@ -1246,7 +1218,7 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
 
 #ifdef WITH_XSLT_DEBUG_PROCESS
                 xsltGenericDebug(xsltGenericDebugContext,
-                                "xsltApplyOneTemplate: unknown extension %s\n",
+                                 "xsltApplyOneTemplate: unknown extension %s\n",
                                  cur->name);
 #endif
                 /*
@@ -1258,21 +1230,21 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
                         (IS_XSLT_NAME(child, "fallback"))) {
                         found = 1;
                         xsltApplyOneTemplate(ctxt, node, child->children,
-                                            NULL, NULL);
+                                             NULL, NULL);
                     }
                     child = child->next;
                 }
 
                 if (!found) {
-                   xsltPrintErrorContext(ctxt, NULL, cur);
+                    xsltPrintErrorContext(ctxt, NULL, cur);
                     xsltGenericError(xsltGenericErrorContext,
-                         "xsltApplyOneTemplate: failed to find extension %s\n",
+                                     "xsltApplyOneTemplate: failed to find extension %s\n",
                                      cur->name);
                 }
             } else {
 #ifdef WITH_XSLT_DEBUG_PROCESS
                 xsltGenericDebug(xsltGenericDebugContext,
-                              "xsltApplyOneTemplate: extension construct %s\n",
+                                 "xsltApplyOneTemplate: extension construct %s\n",
                                  cur->name);
 #endif
 
@@ -1295,41 +1267,42 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
                 attrs = xsltAttrListTemplateProcess(ctxt, copy,
                                                     cur->properties);
             }
-           /*
-            * Add extra namespaces inherited from the current template
-            * if we are in the first level children
-            */
-           if ((oldInsert == insert) && (ctxt->templ != NULL) &&
-               (ctxt->templ->inheritedNs != NULL)) {
-               int i;
-               xmlNsPtr ns, ret;
-
-               for (i = 0;i < ctxt->templ->inheritedNsNr;i++) {
-                   ns = ctxt->templ->inheritedNs[i];
-                   if (ctxt->style->nsAliases != NULL) {
-                       const xmlChar *URI;
-                       URI = (const xmlChar *)
-                               xmlHashLookup(ctxt->style->nsAliases,
-                                             ns->href);
-                       if (URI == NULL) {
-                           ret = xmlSearchNs(copy->doc, copy, ns->prefix);
-                           if ((ret == NULL) ||
-                               (!xmlStrEqual(ret->href, ns->href)))
-                               xmlNewNs(copy, ns->href, ns->prefix);
-                       } else if (!xmlStrEqual(URI, XSLT_NAMESPACE)) {
-                           ret = xmlSearchNs(copy->doc, copy, ns->prefix);
-                           if ((ret == NULL) ||
-                               (!xmlStrEqual(ret->href, URI)))
-                               xmlNewNs(copy, URI, ns->prefix);
-                       }
-                   } else {
-                       ret = xmlSearchNs(copy->doc, copy, ns->prefix);
-                       if ((ret == NULL) ||
-                           (!xmlStrEqual(ret->href, ns->href)))
-                           xmlNewNs(copy, ns->href, ns->prefix);
-                   }
-               }
-           }
+            /*
+             * Add extra namespaces inherited from the current template
+             * if we are in the first level children
+             */
+            if ((oldInsert == insert) && (ctxt->templ != NULL) &&
+                (ctxt->templ->inheritedNs != NULL)) {
+                int i;
+                xmlNsPtr ns, ret;
+
+                for (i = 0; i < ctxt->templ->inheritedNsNr; i++) {
+                    ns = ctxt->templ->inheritedNs[i];
+                    if (ctxt->style->nsAliases != NULL) {
+                        const xmlChar *URI;
+
+                        URI = (const xmlChar *)
+                            xmlHashLookup(ctxt->style->nsAliases,
+                                          ns->href);
+                        if (URI == NULL) {
+                            ret = xmlSearchNs(copy->doc, copy, ns->prefix);
+                            if ((ret == NULL) ||
+                                (!xmlStrEqual(ret->href, ns->href)))
+                                xmlNewNs(copy, ns->href, ns->prefix);
+                        } else if (!xmlStrEqual(URI, XSLT_NAMESPACE)) {
+                            ret = xmlSearchNs(copy->doc, copy, ns->prefix);
+                            if ((ret == NULL) ||
+                                (!xmlStrEqual(ret->href, URI)))
+                                xmlNewNs(copy, URI, ns->prefix);
+                        }
+                    } else {
+                        ret = xmlSearchNs(copy->doc, copy, ns->prefix);
+                        if ((ret == NULL) ||
+                            (!xmlStrEqual(ret->href, ns->href)))
+                            xmlNewNs(copy, ns->href, ns->prefix);
+                    }
+                }
+            }
         }
 
         /*
@@ -1364,58 +1337,58 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
             }
         } while (cur != NULL);
     }
-error:
+  error:
     ctxt->node = oldCurrent;
     ctxt->inst = oldInst;
     ctxt->insert = oldInsert;
     if (params == NULL)
-       xsltFreeStackElemList(varsPop(ctxt));
+        xsltFreeStackElemList(varsPop(ctxt));
     else {
-       xsltStackElemPtr p, tmp = varsPop(ctxt);
-       if (tmp != params) {
-           p = tmp;
-           while ((p != NULL) && (p->next != params))
-               p = p->next;
-           if (p == NULL) {
-               xsltFreeStackElemList(tmp);
-           } else {
-               p->next = NULL;
-               xsltFreeStackElemList(tmp);
-           }
-       }
+        xsltStackElemPtr p, tmp = varsPop(ctxt);
+
+        if (tmp != params) {
+            p = tmp;
+            while ((p != NULL) && (p->next != params))
+                p = p->next;
+            if (p == NULL) {
+                xsltFreeStackElemList(tmp);
+            } else {
+                p->next = NULL;
+                xsltFreeStackElemList(tmp);
+            }
+        }
     }
     if (templ != NULL) {
-       ctxt->varsBase = oldBase;
-       templPop(ctxt);
-       if (ctxt->profile) {
-           long spent, child, total, end;
-           
-           end = xsltTimestamp(); 
-           child = profPop(ctxt);
-           total = end - start;
-           spent = total - child;
-           if (spent <= 0) {
-               /*
-                * Not possible unless the original calibration failed
-                * we can try to corret it on the fly.
-                */
-               xsltCalibrateAdjust(spent);
-               spent = 0;
-           }
+        ctxt->varsBase = oldBase;
+        templPop(ctxt);
+        if (ctxt->profile) {
+            long spent, child, total, end;
+
+            end = xsltTimestamp();
+            child = profPop(ctxt);
+            total = end - start;
+            spent = total - child;
+            if (spent <= 0) {
+                /*
+                 * Not possible unless the original calibration failed
+                 * we can try to corret it on the fly.
+                 */
+                xsltCalibrateAdjust(spent);
+                spent = 0;
+            }
 
-           templ->time += spent;
-           if (ctxt->profNr > 0)
-               ctxt->profTab[ctxt->profNr - 1] += total;
-       }
+            templ->time += spent;
+            if (ctxt->profNr > 0)
+                ctxt->profTab[ctxt->profNr - 1] += total;
+        }
     }
 #ifdef WITH_DEBUGGER
-    if (xslDebugStatus != DEBUG_NONE && addCallResult) {
+    if ((xslDebugStatus != XSLT_DEBUG_NONE) && (addCallResult)) {
         xslDropCall();
     }
 #endif
 }
 
-
 /************************************************************************
  *                                                                     *
  *                 XSLT-1.1 extensions                                 *
@@ -2522,7 +2495,7 @@ xsltCallTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node,
     cur = inst->children;
     while (cur != NULL) {
 #ifdef WITH_DEBUGGER
-        if (xslDebugStatus != DEBUG_NONE)
+        if (xslDebugStatus != XSLT_DEBUG_NONE)
             xslHandleDebugger(cur, node, comp->templ, ctxt);
 #endif
        if (ctxt->state == XSLT_STATE_STOPPED) break;
@@ -2722,7 +2695,7 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
     cur = inst->children;
     while (cur!=NULL) {
 #ifdef WITH_DEBUGGER
-        if (xslDebugStatus != DEBUG_NONE)
+        if (xslDebugStatus != XSLT_DEBUG_NONE)
             xslHandleDebugger(cur, node, comp->templ, ctxt);
 #endif
         if (ctxt->state == XSLT_STATE_STOPPED) break;
@@ -2856,7 +2829,7 @@ xsltChoose(xsltTransformContextPtr ctxt, xmlNodePtr node,
 
 
 #ifdef WITH_DEBUGGER
-        if (xslDebugStatus != DEBUG_NONE)
+        if (xslDebugStatus != XSLT_DEBUG_NONE)
             xslHandleDebugger(when, node, comp->templ, ctxt);
 #endif
 
@@ -2912,7 +2885,7 @@ xsltChoose(xsltTransformContextPtr ctxt, xmlNodePtr node,
     }
     if (IS_XSLT_ELEM(replacement) && (IS_XSLT_NAME(replacement, "otherwise"))) {
 #ifdef WITH_DEBUGGER
-        if (xslDebugStatus != DEBUG_NONE)
+        if (xslDebugStatus != XSLT_DEBUG_NONE)
             xslHandleDebugger(replacement, node, comp->templ, ctxt);
 #endif
 
@@ -3101,7 +3074,7 @@ xsltForEach(xsltTransformContextPtr ctxt, xmlNodePtr node,
            sorts[nbsorts++] = replacement;
        }
 #ifdef WITH_DEBUGGER
-        if (xslDebugStatus != DEBUG_NONE)
+        if (xslDebugStatus != XSLT_DEBUG_NONE)
             xslHandleDebugger(replacement, node, NULL, ctxt);
 #endif
        replacement = replacement->next;
index 0b8100695e35e23787b065a4a549855d7c0dbe61..61c748ba5c8859e2c5a691d6423cc1a627b663a9 100644 (file)
@@ -32,6 +32,7 @@
 #include "templates.h"
 #include "xsltInternals.h"
 #include "imports.h"
+#include "transform.h"
 
 /* gettimeofday on Windows ??? */
 #ifdef WIN32
@@ -1246,3 +1247,103 @@ xsltSaveProfiling(xsltTransformContextPtr ctxt, FILE *output) {
     xmlFree(templates);
 }
 
+/************************************************************************
+ *                                                                     *
+ *             Hooks for the debugger                                  *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ * There is currently only 3 debugging callback defined
+ * Debugger callbacks are disabled by default
+ */
+#define XSLT_CALLBACK_NUMBER 3
+
+typedef struct _xsltDebuggerCallbacks xsltDebuggerCallbacks;
+typedef xsltDebuggerCallbacks *xsltDebuggerCallbacksPtr;
+struct _xsltDebuggerCallbacks {
+    xsltHandleDebuggerCallback handler;
+    xsltAddCallCallback add;
+    xsltDropCallCallback drop;
+};
+
+static xsltDebuggerCallbacks xsltDebuggerCurrentCallbacks = {
+    NULL, /* handler */
+    NULL, /* add */
+    NULL  /* drop */
+};
+
+int xslDebugStatus;
+
+/**
+ * xslSetDebuggerCallbacks:
+ * @no : number of callbacks
+ * @block : the block of callbacks
+ * 
+ * This function allow to plug a debugger into the XSLT library
+ * @block points to a block of memory containing the address of @no 
+ * callback routines.
+ *
+ * Returns 0 in case of success and -1 in case of error
+ */
+int
+xsltSetDebuggerCallbacks(int no, void *block)
+{
+    xsltDebuggerCallbacksPtr callbacks;
+
+    if ((block == NULL) || (no != 1))
+       return(-1);
+
+    callbacks = (xsltDebuggerCallbacksPtr) block;
+    xsltDebuggerCurrentCallbacks.handler = callbacks->handler;
+    return(0);
+}
+
+/**
+ * xslHandleDebugger:
+ * @cur : source node being executed
+ * @node : data node being processed
+ * @templ : temlate that applies to node
+ * @ctxt : the xslt transform context 
+ * 
+ * If either cur or node are a breakpoint, or xslDebugStatus in state 
+ *   where debugging must occcur at this time then transfer control
+ *   to the xslDebugBreak function
+ */
+void
+xslHandleDebugger(xmlNodePtr cur, xmlNodePtr node, xsltTemplatePtr templ,
+                 xsltTransformContextPtr ctxt)
+{
+    if (xsltDebuggerCurrentCallbacks.handler != NULL)
+       xsltDebuggerCurrentCallbacks.handler(cur, node, templ, ctxt);
+}
+
+/**
+ * xslAddCall:
+ * @templ : current template being applied
+ * @source : the source node being processed
+ *
+ * Add template "call" to call stack
+ * Returns : 1 on sucess 0 otherwise an error may be printed if 
+ *            WITH_XSLT_DEBUG_BREAKPOINTS is defined
+ */
+int
+xslAddCall(xsltTemplatePtr templ, xmlNodePtr source)
+{
+    if (xsltDebuggerCurrentCallbacks.add != NULL)
+       return(xsltDebuggerCurrentCallbacks.add(templ, source));
+    return(0);
+}
+
+/**
+ * xslDropCall :
+ *
+ * Drop the topmost item off the call stack
+ */
+void
+xslDropCall(void)
+{
+    if (xsltDebuggerCurrentCallbacks.drop != NULL)
+       xsltDebuggerCurrentCallbacks.drop();
+}
+
index 70cdc90526065231d823b620fb3d79d5c04d0975..4513f4f605363584d7f85ab1666cb6276a21e853 100644 (file)
@@ -154,6 +154,35 @@ void               xsltCalibrateAdjust             (long delta);
 
 #define XSLT_TIMESTAMP_TICS_PER_SEC 100000l
 
+/*
+ * Hooks for the debugger
+ */
+
+typedef enum {
+    XSLT_DEBUG_NONE = 0, /* no debugging allowed */
+    XSLT_DEBUG_INIT,
+    XSLT_DEBUG_STEP,
+    XSLT_DEBUG_STEPOUT,
+    XSLT_DEBUG_NEXT,
+    XSLT_DEBUG_STOP,
+    XSLT_DEBUG_CONT,
+    XSLT_DEBUG_RUN,
+    XSLT_DEBUG_RUN_RESTART,
+    XSLT_DEBUG_QUIT
+} xsltDebugStatusCodes;
+
+LIBXSLT_PUBLIC extern int xslDebugStatus;
+
+typedef void (*xsltHandleDebuggerCallback) (xmlNodePtr cur, xmlNodePtr node,
+                       xsltTemplatePtr templ, xsltTransformContextPtr ctxt);
+typedef int (*xsltAddCallCallback) (xsltTemplatePtr templ, xmlNodePtr source);
+typedef void (*xsltDropCallCallback) (void);
+
+int            xsltSetDebuggerCallbacks        (int no, void *block);
+int            xslAddCall                      (xsltTemplatePtr templ,
+                                                xmlNodePtr source);
+void           xslDropCall                     (void);
+
 #ifdef __cplusplus
 }
 #endif
index b92f42a67ba5516d92b24c90f3be21100cda725b..931a47862f29c08d2e7d206a69b8ab027b41f05a 100644 (file)
@@ -11,22 +11,9 @@ xsltproc_LDFLAGS =
 xsltproc_DEPENDENCIES = $(DEPS)
 xsltproc_LDADD = $(LDADDS)
 
-if WITH_DEBUGGER
 DEPS = $(top_builddir)/libxslt/libxslt.la \
-       $(top_builddir)/breakpoint/libxsltbreakpoint.la \
        $(top_builddir)/libexslt/libexslt.la 
-else
-DEPS = $(top_builddir)/libxslt/libxslt.la \
-       $(top_builddir)/libexslt/libexslt.la 
-endif
 
-if WITH_DEBUGGER
-LDADDS = $(top_builddir)/libxslt/libxslt.la \
-         $(top_builddir)/libexslt/libexslt.la \
-       $(top_builddir)/breakpoint/libxsltbreakpoint.la \
-       @LIBXML_LIBS@ $(EXTRA_LIBS)
-else
 LDADDS = $(top_builddir)/libxslt/libxslt.la \
          $(top_builddir)/libexslt/libexslt.la \
        @LIBXML_LIBS@ $(EXTRA_LIBS)
-endif