/*************************************************************************** template_cmds.c - template commands for xsldbg ------------------- begin : Wed Nov 21 2001 copyright : (C) 2001 by Keith Isdale email : k_isdale@tpg.com.au ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "xsldbg.h" #include "debugXSL.h" #include "files.h" #include "utils.h" #include "xsldbgmsg.h" #include "xsldbgthread.h" /* for getThreadStatus */ static int printCounter; /* Dangerous name think of a better one */ /* ----------------------------------------- Private function declarations for files.c -------------------------------------------*/ /** * xslDbgShellPrintStylesheetsHelper: * @payload :valid xxsltStylesheetPtr * @data : not used * name : not used * * Print out the stylesheet name from the stylesheet given to * us via walkStylesheets */ void xslDbgShellPrintStylesheetsHelper(void *payload, void *data, xmlChar * name); /** * xslDbgShellPrintStylesheetsHelper2: * @payload :valid xmlNodePtr of included stylesheet * @data : not used * name : not used * * Print out the stylesheet name from the stylesheet given to * us via walkIncludes */ void xslDbgShellPrintStylesheetsHelper2(void *payload, void *data, xmlChar * name); /** * printTemplateHelper: * @templ: Is valid * @verbose: Either 1 or 0 * @templateCount: Is valid * @count: Is valid * @templateName: template name to print and in UTF-8, may be NULL * * This display the templates in the same order as they are in the * stylesheet. If verbose is 1 then print more information * For each template found @templateCount is increased * For each printed template @printCount is increased */ void printTemplateHelper(xsltTemplatePtr templ, int verbose, int *templateCount, int *count, xmlChar * templateName); /* ------------------------------------- End private functions ---------------------------------------*/ /** * printTemplateHelper: * @templ: Is valid * @verbose: Either 1 or 0 * @templateCount: Is valid * @count: Is valid * @templateName: template name to print, may be NULL * * This display the templates in the same order as they are in the * stylesheet. If verbose is 1 then print more information * For each template found @templateCount is increased * For each printed template @printCount is increased */ void printTemplateHelper(xsltTemplatePtr templ, int verbose, int *templateCount, int *count, xmlChar * templateName) { xmlChar *name, *defaultUrl = (xmlChar *) ""; const xmlChar *url; if (!templ) return; *templateCount = *templateCount + 1; printTemplateHelper(templ->next, verbose, templateCount, count, templateName); if (templ->elem && templ->elem->doc && templ->elem->doc->URL) { url = templ->elem->doc->URL; } else { url = defaultUrl; } if (templ->match) name = xmlStrdup(templ->match); else name = fullTQName(templ->nameURI, templ->name); if (name) { if (templateName && (xmlStrcmp(templateName, name) != 0)) { /* search for template name supplied failed */ /* empty */ } else { xmlChar *modeTemp = NULL; *count = *count + 1; if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) { notifyListQueue(templ); } else { modeTemp = fullTQName(templ->modeURI, templ->mode); if (verbose) xsldbgGenericErrorFunc(i18n(" template: \"%1\" mode: \"%2\" in file \"%3\" at line %4\n").arg(xsldbgText(name)).arg(xsldbgText(modeTemp)).arg(xsldbgUrl(url)).arg(xmlGetLineNo(templ->elem))); else xsldbgGenericErrorFunc(TQString("\"%s\" ").arg(xsldbgText(name))); if (modeTemp) xmlFree(modeTemp); } } xmlFree(name); } } /** * xslDbgShellPrintTemplateNames: * @styleCtxt: Is valid * @ctxt: Not used * @arg: Not used * @verbose: If 1 then print extra messages about templates found, * otherwise print normal messages only * @allFiles: If 1 then look for all templates in stylsheets found in * @styleCtxt * otherwise look in the stylesheet found by * debugXSLBreak function * * Print out the list of template names found that match critieria * * Returns 1 on success, * 0 otherwise */ int xslDbgShellPrintTemplateNames(xsltTransformContextPtr styleCtxt, xmlShellCtxtPtr ctxt, xmlChar * arg, int verbose, int allFiles) { Q_UNUSED(ctxt); int templateCount = 0, printedTemplateCount = 0; int result = 0; xsltStylesheetPtr curStyle; xsltTemplatePtr templ; if (xmlStrLen(arg) == 0) { arg = NULL; } else { allFiles = 1; /* make sure we find it if we can */ } if (!styleCtxt) { xsldbgGenericErrorFunc(i18n("Error: Stylesheet is not valid.\n")); return result; } if (allFiles) curStyle = styleCtxt->style; else { /* try to find files in the current stylesheet */ /* root copy is set to the stylesheet found by debugXSLBreak */ if (debugXSLGetTemplate()) curStyle = debugXSLGetTemplate()->style; else curStyle = NULL; } if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) { notifyListStart(XSLDBG_MSG_TEMPLATE_CHANGED); while (curStyle) { templ = curStyle->templates; /* print them out in the order their in the file */ printTemplateHelper(templ, verbose, &templateCount, &printedTemplateCount, arg); if (curStyle->next) curStyle = curStyle->next; else curStyle = curStyle->imports; } notifyListSend(); } else { xsltGenericError(xsltGenericErrorContext, "\n"); while (curStyle) { templ = curStyle->templates; /* print them out in the order their in the file */ printTemplateHelper(templ, verbose, &templateCount, &printedTemplateCount, arg); xsltGenericError(xsltGenericErrorContext, "\n"); if (curStyle->next) curStyle = curStyle->next; else curStyle = curStyle->imports; } if (templateCount == 0) { xsldbgGenericErrorFunc(i18n("\tNo XSLT templates found.\n")); } else { xsldbgGenericErrorFunc(i18n("\tTotal of %n XSLT template found", "\tTotal of %n XSLT templates found", templateCount) + TQString("\n")); xsldbgGenericErrorFunc(i18n("\tTotal of %n XSLT template printed", "\tTotal of %n XSLT templates printed", printedTemplateCount) + TQString("\n")); } } result = 1; return result; } /** * xslDbgShellPrintStylesheetsHelper: * @payload :valid xsltStylesheetPtr * @data : not used * name : not used * * Print out the stylesheet name from the stylesheet given to * us via walkStylesheets */ void xslDbgShellPrintStylesheetsHelper(void *payload, void *data, xmlChar * name) { Q_UNUSED(data); Q_UNUSED(name); xsltStylesheetPtr style = (xsltStylesheetPtr) payload; if (style && style->doc && style->doc->URL) { if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) notifyListQueue(payload); else /* display the URL of stylesheet */ xsldbgGenericErrorFunc(i18n(" Stylesheet %1\n").arg(xsldbgUrl(style->doc->URL))); printCounter++; } } /** * xslDbgShellPrintStylesheetsHelper2: * @payload :valid xmlNodePtr of included stylesheet * @data : not used * name : not used * * Print out the stylesheet name from the stylesheet given to * us via walkIncludes */ void xslDbgShellPrintStylesheetsHelper2(void *payload, void *data, xmlChar * name) { Q_UNUSED(data); Q_UNUSED(name); xmlNodePtr node = (xmlNodePtr) payload; if (node && node->doc && node->doc->URL) { if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) notifyListQueue(payload); else /* display the URL of stylesheet */ xsldbgGenericErrorFunc(i18n(" Stylesheet %1\n").arg(xsldbgUrl(node->doc->URL))); printCounter++; } } /** * xslDbgShellPrintStyleSheets: * @arg: The stylesheets of interests and in UTF-8, is NULL for all stylsheets * * Print stylesheets that can be found in loaded stylsheet * * Returns 1 on success, * 0 otherwise */ int xslDbgShellPrintStyleSheets(xmlChar * arg) { Q_UNUSED(arg); printCounter = 0; if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) { notifyListStart(XSLDBG_MSG_SOURCE_CHANGED); walkStylesheets((xmlHashScanner) xslDbgShellPrintStylesheetsHelper, NULL, filesGetStylesheet()); notifyListSend(); notifyListStart(XSLDBG_MSG_INCLUDED_SOURCE_CHANGED); walkIncludes((xmlHashScanner) xslDbgShellPrintStylesheetsHelper2, NULL, filesGetStylesheet()); notifyListSend(); } else { walkStylesheets((xmlHashScanner) xslDbgShellPrintStylesheetsHelper, NULL, filesGetStylesheet()); walkIncludes((xmlHashScanner) xslDbgShellPrintStylesheetsHelper2, NULL, filesGetStylesheet()); if (printCounter != 0) xsldbgGenericErrorFunc(i18n("\tTotal of %n XSLT stylesheet found.", "\tTotal of %n XSLT stylesheets found.", printCounter) + TQString("\n")); else /* strange but possible */ xsldbgGenericErrorFunc(i18n("\tNo XSLT stylesheets found.\n")); } return 1; /* always succeed */ }