/** * breakPointIsPresent: * @url: Non-null, non-empty file name that has been loaded by * debugger * @lineNumber: @lineNumber >= 0 and is available in @url * * Determine if there is a break point at file and line number specified * * Returns 1 if successful, * 0 otherwise */ int breakPointIsPresent(const xmlChar * url, long lineNumber) { int result = 0; if (!url || (lineNumber == -1)) return result; result = (breakPointGet(url, lineNumber) != NULL); return result; }
/** * debugHandleDebugger: * @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 debugXSLBreak function */ void debugHandleDebugger(xmlNodePtr cur, xmlNodePtr node, xsltTemplatePtr templ, xsltTransformContextPtr ctxt) { if (!cur && !node) { xsldbgGenericErrorFunc(i18n("Error: XSLT source and XML data are empty. Cannot enter the debugger.\n")); } else { if (optionsGetIntOption(OPTIONS_GDB)){ int doValidation = 0; switch(xsldbgValidateBreakpoints){ case BREAKPOINTS_ARE_VALID: if (!filesGetStylesheet() || !filesGetMainDoc()) { xsldbgValidateBreakpoints = BREAKPOINTS_NEED_VALIDATION; doValidation = 1; } break; case BREAKPOINTS_NEED_VALIDATION: if (filesGetStylesheet() && filesGetMainDoc() && templ){ xsldbgValidateBreakpoints = BREAKPOINTS_BEING_VALIDATED; doValidation = 1; } break; case BREAKPOINTS_BEING_VALIDATED: /*should never be in the state for any length of time */ #ifdef WITH_XSLDBG_DEBUG_BREAKPOINTS xsltGenericError(xsltGenericErrorContext, "Error: Unexpected breakpoint validation state %d", xsldbgValidateBreakpoints); #endif break; } if (doValidation){ /* breakpoints will either be marked as orphaned or not as needed */ xsldbgValidateBreakpoints = BREAKPOINTS_BEING_VALIDATED; walkBreakPoints((xmlHashScanner) xslDbgShellValidateBreakPoint, ctxt); if (filesGetStylesheet() && filesGetMainDoc() && templ){ xsldbgValidateBreakpoints = BREAKPOINTS_ARE_VALID; }else{ xsldbgValidateBreakpoints = BREAKPOINTS_NEED_VALIDATION; } } } switch (xslDebugStatus) { /* A temparary stopping point */ case DEBUG_WALK: case DEBUG_TRACE: /* only allow breakpoints at xml elements */ if (xmlGetLineNo(cur) != -1) debugXSLBreak(cur, node, templ, ctxt); break; case DEBUG_STOP: xslDebugStatus = DEBUG_CONT; /* only allow breakpoints at xml elements */ if (xmlGetLineNo(cur) != -1) debugXSLBreak(cur, node, templ, ctxt); break; case DEBUG_STEP: /* only allow breakpoints at xml elements */ if (xmlGetLineNo(cur) != -1) debugXSLBreak(cur, node, templ, ctxt); break; case DEBUG_CONT: { breakPointPtr breakPtr = NULL; xmlChar *baseUri = NULL; if (cur) { breakPtr = breakPointGet(cur->doc->URL, xmlGetLineNo(cur)); if (breakPtr && (breakPtr->flags & BREAKPOINT_ENABLED) ){ debugXSLBreak(cur, node, templ, ctxt); return; } } if (node) { baseUri = filesGetBaseUri(node); if (baseUri != NULL) { breakPtr = breakPointGet(baseUri, xmlGetLineNo(node)); } else { breakPtr = breakPointGet(node->doc->URL, xmlGetLineNo(node)); } if (breakPtr) { if (breakPtr->flags & BREAKPOINT_ENABLED) { debugXSLBreak(cur, node, templ, ctxt); } } if (baseUri) xmlFree(baseUri); } } break; } } }