diff options
Diffstat (limited to 'kxsldbg/kxsldbgpart/libxsldbg/nodeview_cmds.cpp')
| -rw-r--r-- | kxsldbg/kxsldbgpart/libxsldbg/nodeview_cmds.cpp | 609 |
1 files changed, 0 insertions, 609 deletions
diff --git a/kxsldbg/kxsldbgpart/libxsldbg/nodeview_cmds.cpp b/kxsldbg/kxsldbgpart/libxsldbg/nodeview_cmds.cpp deleted file mode 100644 index 5fcbef00..00000000 --- a/kxsldbg/kxsldbgpart/libxsldbg/nodeview_cmds.cpp +++ /dev/null @@ -1,609 +0,0 @@ - -/*************************************************************************** - nodeview_cmds.c - node viewing 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 <libxml/xpathInternals.h> -#include <libxml/HTMLparser.h> -#include <libxml/HTMLtree.h> -#include <ctype.h> /* for isspace*/ -#include "debugXSL.h" -#include "arraylist.h" -#include "breakpoint.h" -#include "xsldbgmsg.h" -#include "xsldbgthread.h" /* for getThreadStatus */ -#include "files.h" -#include "options.h" - - -/* ----------------------------------------- - Private function declarations for nodeview_cmds.c - -------------------------------------------*/ -static xmlChar nodeViewBuffer[500]; -static int printVariableValue = 0; - -/* - * xslDbgShellPrintNames: - * Print a name of variable found by scanning variable table - * It is used by print_variable function. - * @payload : not used - * @data : not used - * @name : the variable name - */ -void *xslDbgShellPrintNames(void *payload, - void *data, xmlChar * name); - -/** - * xslDbgCatToFile: - * @node : Is valid - * @file : Is valid - * - * Send the results of cat command in @node to @file - */ -static void xslDbgCatToFile(xmlNodePtr node, FILE * file); - - -/** - * printXPathObject: - * @item : XPath object to print - * @xPath : The XPath used to find item - * - * Print an XPath object - * - * Returns 1 on success, - * 0 otherwise - */ -static int printXPathObject(xmlXPathObjectPtr item, xmlChar* xPath); - -/* ------------------------------------- - End private functions ----------------------------------------*/ - - -/** - * xslDbgShellPrintList: - * @ctxt: The current shell context - * @arg: What xpath to display and in UTF-8 - * @dir: If 1 print in dir mode?, - * otherwise ls mode - * - * Print list of nodes in either ls or dir format - * - * Returns 1 on success, - * 0 otherwise - */ -int -xslDbgShellPrintList(xmlShellCtxtPtr ctxt, xmlChar * arg, int dir) -{ - xmlXPathObjectPtr list; - int result = 0; - - if (!ctxt || !arg) { -#ifdef WITH_XSLDBG_DEBUG_PROCESS - xsltGenericError(xsltGenericErrorContext, - "Error: NULL arguments provided\n"); -#endif - return result; - } - - if (arg[0] == 0) { - if (dir) - xmlShellDir(ctxt, NULL, ctxt->node, NULL); - else - xmlShellList(ctxt, NULL, ctxt->node, NULL); - result = 1; /*assume that this worked */ - } else { - ctxt->pctxt->node = ctxt->node; - ctxt->pctxt->node = ctxt->node; - if (!xmlXPathNsLookup(ctxt->pctxt, (xmlChar *) "xsl")) - xmlXPathRegisterNs(ctxt->pctxt, (xmlChar *) "xsl", - XSLT_NAMESPACE); - list = xmlXPathEval(arg, ctxt->pctxt); - if (list != NULL) { - switch (list->type) { - case XPATH_NODESET:{ - int indx; - - for (indx = 0; - indx < list->nodesetval->nodeNr; indx++) { - if (dir) - xmlShellList(ctxt, NULL, - list->nodesetval-> - nodeTab[indx], NULL); - else - xmlShellList(ctxt, NULL, - list->nodesetval-> - nodeTab[indx], NULL); - } - result = 1; - break; - } - default: - xmlShellPrintXPathError(list->type, (char *) arg); - } - xmlXPathFreeObject(list); - } else { - xsldbgGenericErrorFunc(i18n("Error: XPath %1 results in an empty Node Set.\n").arg(xsldbgText(arg))); - } - ctxt->pctxt->node = NULL; - } - return result; -} - - - -/** - * xslDbgCatToFile: - * @node : Is valid - * @file : Is valid - * - * Send the results of cat command in @node to @file - */ -void -xslDbgCatToFile(xmlNodePtr node, FILE * file) -{ - if (!node || !file) - return; - - /* assume that HTML usage is enabled */ - if (node->doc->type == XML_HTML_DOCUMENT_NODE) { - if (node->type == XML_HTML_DOCUMENT_NODE) - htmlDocDump(file, (htmlDocPtr) node); - else - htmlNodeDumpFile(file, node->doc, node); - } else if (node->type == XML_DOCUMENT_NODE) { - /* turn off encoding for the moment and just dump UTF-8 - * which will be converted by xsldbgGeneralErrorFunc */ - xmlDocPtr doc = (xmlDocPtr) node; - const xmlChar *encoding = doc->encoding; - - if (encoding) { - xsldbgGenericErrorFunc(i18n("Information: Temporarily setting document's encoding to UTF-8. Previously was %1.\n").arg(xsldbgText(encoding))); - } - doc->encoding = (xmlChar *) "UTF-8"; - xmlDocDump(file, (xmlDocPtr) node); - doc->encoding = encoding; - } else { - xmlElemDump(file, node->doc, node); - } -} - - -/** - * printXPathObject: - * @item : XPath object to print - * @xPath : The XPath used to find item - * - * Print an XPath object - * - * Returns 1 on success, - * 0 otherwise - */ - -static int -printXPathObject(xmlXPathObjectPtr item, xmlChar* xPath){ - int result = 0; - if (item){ - switch (item->type) { - case XPATH_BOOLEAN: - xsltGenericError(xsltGenericErrorContext, - "= %s\n%s\n", xPath, - xmlBoolToText(item->boolval)); - result = 1; - break; - - case XPATH_NUMBER: - xsltGenericError(xsltGenericErrorContext, - "= %s\n%0g\n", xPath, item->floatval); - result = 1; - break; - - /* case XPATH_NODESET:*/ - default:{ - /* We may need to convert this XPath to a string, - plus ensure that we print required the number of - lines of text */ - int indx; - - const char *fileName = filesTempFileName(0); - FILE *file = NULL; - - if (!fileName) - break; - file = fopen(fileName, "w+"); - if (!file) { - xsldbgGenericErrorFunc(i18n("Error: Unable to save temporary results to %1.\n").arg(xsldbgText(fileName))); - break; - } else { - fprintf(file, "= %s\n", xPath); - switch(item->type){ - - case XPATH_NODESET: - if (item->nodesetval){ - for (indx = 0; - indx < item->nodesetval->nodeNr; indx++){ - xslDbgCatToFile(item->nodesetval-> - nodeTab[indx], file); - } - } else { - xsldbgGenericErrorFunc(i18n("Error: XPath %1 results in an empty Node Set.\n").arg(xsldbgText(xPath))); - } - break; - - case XPATH_STRING: - if (item->stringval) - fprintf(file, "\'%s\'", item->stringval); - else - fprintf(file, "%s", i18n("NULL string value supplied.").utf8().data()); - break; - - default:{ - xmlXPathObjectPtr tempObj = - xmlXPathObjectCopy(item); - if (tempObj) - tempObj = xmlXPathConvertString(tempObj); - if (tempObj && tempObj->stringval){ - fprintf(file, "%s", tempObj->stringval); - }else{ - fprintf(file, "%s", i18n("Unable to convert XPath to string.").utf8().data()); - } - if (tempObj) - xmlXPathFreeObject(tempObj); - } - break; - fprintf(file,"\n"); - - } /* inner switch statement */ - if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) { - fclose(file); - file = NULL; - /* send the data to application */ - notifyXsldbgApp(XSLDBG_MSG_FILEOUT, fileName); - } else { - int lineCount = 0, gdbModeEnabled = 0; - - /* save the value of option to speed things up - * a bit */ - gdbModeEnabled = - optionsGetIntOption(OPTIONS_GDB); - rewind(file); - - /* when gdb mode is enable then only print the first - * GDB_LINES_TO_PRINT lines */ - while (!feof(file)) { - if (fgets - ((char *) nodeViewBuffer, sizeof(nodeViewBuffer), - file)) - xsltGenericError - (xsltGenericErrorContext, "%s", - nodeViewBuffer); - if (gdbModeEnabled) { - lineCount++; - /* there is an overhead of two lines - * when print expression values */ - if (lineCount == - GDB_LINES_TO_PRINT + 2) { - xsltGenericError - (xsltGenericErrorContext, - "..."); - break; - } - } - } - xsltGenericError - (xsltGenericErrorContext, "\n"); - } - if (file) - fclose(file); - result = 1; - break; - } - } - } - } - return result; -} - - -/** - * xslDbgShellCat: - * @styleCtxt: the current stylesheet context - * @ctxt: The current shell context - * @arg: The xpath to print (in UTF-8) - * - * Print the result of an xpath expression. This can include variables - * if styleCtxt is not NULL - * - * Returns 1 on success, - * 0 otherwise - */ - -int -xslDbgShellCat(xsltTransformContextPtr styleCtxt, xmlShellCtxtPtr ctxt, - xmlChar * arg) -{ - xmlXPathObjectPtr list; - int result = 0; - static const char * QUIET_STR = "-q"; - bool silenceCtxtErrors = false; - - if ((arg == NULL) || (xmlStrLen(arg) == 0)) - arg = (xmlChar *) "."; - - /* Do we quietly ingore style context errors */ - if (strncasecmp((char*)arg, QUIET_STR, strlen(QUIET_STR))== 0){ - silenceCtxtErrors = true; - arg = arg + strlen(QUIET_STR); - while (isspace(*arg)){ - arg++; - } - } - - if (!styleCtxt || !ctxt || !ctxt->node) { - if (!(!xsldbgReachedFirstTemplate && silenceCtxtErrors)) - xsldbgGenericErrorFunc(i18n("Warning: Unable to print expression. No stylesheet was properly loaded.\n")); - return 0; - } - - if ((arg == NULL) || (xmlStrLen(arg) == 0)) - arg = (xmlChar *) "."; - - ctxt->pctxt->node = ctxt->node; - if (!styleCtxt) { - list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt); - } else { - xmlNodePtr savenode = styleCtxt->xpathCtxt->node; - - ctxt->pctxt->node = ctxt->node; - styleCtxt->xpathCtxt->node = ctxt->node; - if (!xmlXPathNsLookup(styleCtxt->xpathCtxt, (xmlChar *) "xsl")) - xmlXPathRegisterNs(styleCtxt->xpathCtxt, (xmlChar *) "xsl", - XSLT_NAMESPACE); - list = xmlXPathEval((xmlChar *) arg, styleCtxt->xpathCtxt); - styleCtxt->xpathCtxt->node = savenode; - } - if (list != NULL) { - result = printXPathObject(list, arg); - xmlXPathFreeObject(list); - } else { - xsldbgGenericErrorFunc(i18n("Error: XPath %1 results in an empty Node Set.\n").arg(xsldbgText(arg))); - } - ctxt->pctxt->node = NULL; - return result; -} - -/* only used by xslDbgPrintNames and xslDbgPrintVariable cound number of variables */ -static int varCount; - -/* - * xslDbgShellPrintNames: - * Print a name of variable found by scanning variable table - * It is used by print_variable function. - * @payload : Global variable of type xsltStackElemPtr - * @data : not used - * @name : the variable name - */ -void * -xslDbgShellPrintNames(void *payload, - void *data, xmlChar * name) -{ - Q_UNUSED(payload); - Q_UNUSED(data); - if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) { - notifyListQueue(payload); - } else if (payload && name) { - xmlChar * fullQualifiedName = nodeViewBuffer; - xsltStackElemPtr item = (xsltStackElemPtr)payload; - if (item->nameURI == NULL){ - snprintf((char*)fullQualifiedName, sizeof(nodeViewBuffer), "$%s", item->name); - }else{ - snprintf((char*)fullQualifiedName, sizeof(nodeViewBuffer), "$%s:%s", - item->nameURI, item->name); - } - if (printVariableValue == 0){ - xsldbgGenericErrorFunc(i18n(" Global %1\n").arg(xsldbgText(fullQualifiedName))); - }else{ - if (item->computed == 1){ - xsldbgGenericErrorFunc(i18n(" Global ")); - printXPathObject(item->value, fullQualifiedName); - }else if (item->tree){ - xsldbgGenericErrorFunc(i18n(" Global = %1\n").arg(xsldbgText(fullQualifiedName))); - xslDbgCatToFile(item->tree, stderr); - }else if (item->select){ - xsldbgGenericErrorFunc(i18n(" Global = %1\n%2").arg(xsldbgText(fullQualifiedName)).arg(xsldbgText(item->select))); - }else{ - /* can't find a value give only a variable name an error message */ - xsldbgGenericErrorFunc(i18n(" Global = %1\n%2").arg(xsldbgText(fullQualifiedName)).arg(i18n("Warning: No value assigned to variable.\n"))); - } - xsltGenericError(xsltGenericErrorContext, "\n\032\032\n"); - } - varCount++; - } - return NULL; -} - - - -/** - * xslDbgShellPrintVariable: - * @styleCtxt: The current stylesheet context - * @arg: The name of variable to look for '$' prefix is optional and in UTF-8 - * @type: A valid VariableTypeEnum - * - * Print the value variable specified by args. - * - * Returns 1 on success, - * 0 otherwise - */ -int -xslDbgShellPrintVariable(xsltTransformContextPtr styleCtxt, xmlChar * arg, - VariableTypeEnum type) -{ - int result = 0; - /* command argument to include both name and its value */ - static const char * FULLNAME_STR = "-f"; - /* Quietly exit if an invalid stylesheet is provided */ - static const char * QUIET_STR = "-q"; - bool silenceCtxtErrors = false; - - if (!arg) { -#ifdef WITH_XSLDBG_DEBUG_PROCESS - xsltGenericError(xsltGenericErrorContext, - "Error: NULL argument provided\n"); -#endif - return result; - } - - varCount = 0; - /* Do we quietly ingore style context errors */ - if (strncasecmp((char*)arg, QUIET_STR, strlen(QUIET_STR))== 0){ - silenceCtxtErrors = true; - arg = arg + strlen(QUIET_STR); - while (isspace(*arg)){ - arg++; - } - } - - if (!styleCtxt) { - if (!(!xsldbgReachedFirstTemplate && silenceCtxtErrors)) - xsldbgGenericErrorFunc(i18n("Error: Debugger has no files loaded or libxslt has not reached a template.\nTry reloading files or taking more steps.\n")); - return result; - } - - /* Do we include the name as well as its value */ - if (strncasecmp((char*)arg, FULLNAME_STR, strlen(FULLNAME_STR))== 0){ - printVariableValue = 1; - arg = arg + strlen(FULLNAME_STR); - while (isspace(*arg)){ - arg++; - } - } - if (arg[0] == 0) { - /* list variables of type requested */ - if (type == DEBUG_GLOBAL_VAR) { - if (styleCtxt->globalVars) { - if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) { - notifyListStart(XSLDBG_MSG_GLOBALVAR_CHANGED); - /* list global variables */ - xmlHashScan(styleCtxt->globalVars, - (xmlHashScanner) xslDbgShellPrintNames, - NULL); - notifyListSend(); - } else - /* list global variables */ - xmlHashScan(styleCtxt->globalVars, - (xmlHashScanner) xslDbgShellPrintNames, - NULL); - result = 1; - /* ensure that the locals follow imediately after the - * globals when in gdb mode */ - if (optionsGetIntOption(OPTIONS_GDB) == 0) - xsltGenericError(xsltGenericErrorContext, "\n"); - } else { - if (getThreadStatus() != XSLDBG_MSG_THREAD_RUN) { - /* Don't show this message when running as a thread as it - * is annoying */ - xsldbgGenericErrorFunc(i18n("Error: Libxslt has not initialized variables yet; try stepping to a template.\n")); - } else { - /* send an empty list */ - notifyListStart(XSLDBG_MSG_GLOBALVAR_CHANGED); - notifyListSend(); - result = 1; - } - } - } else { - /* list local variables */ - if (styleCtxt->varsNr && styleCtxt->varsTab) { - if (getThreadStatus() == XSLDBG_MSG_THREAD_RUN) { - notifyListStart(XSLDBG_MSG_LOCALVAR_CHANGED); - for (int i = styleCtxt->varsNr; i > styleCtxt->varsBase; i--) { - xsltStackElemPtr item = styleCtxt->varsTab[i-1]; - while (item) { - notifyListQueue(item); - item = item->next; - } - } - notifyListSend(); - } else { - xmlChar * fullQualifiedName = nodeViewBuffer; - for (int i = styleCtxt->varsNr; i > styleCtxt->varsBase; i--) { - xsltStackElemPtr item = styleCtxt->varsTab[i-1]; - while (item) { - if (item->name) { - if (item->nameURI == NULL){ - snprintf((char*)fullQualifiedName, sizeof(nodeViewBuffer), "$%s", - item->name); - }else{ - - snprintf((char*)fullQualifiedName, sizeof(nodeViewBuffer), "$%s:%s", - item->nameURI, item->name); - } - if (printVariableValue == 0){ - xsldbgGenericErrorFunc(i18n(" Local %1").arg(xsldbgText(fullQualifiedName))); - }else{ - if (item->computed == 1){ - xsldbgGenericErrorFunc(i18n(" Local ")); - printXPathObject(item->value, fullQualifiedName); - }else if (item->tree){ - xsldbgGenericErrorFunc(i18n(" Local = %1\n").arg(xsldbgText(fullQualifiedName))); - xslDbgCatToFile(item->tree, stderr); - }else if (item->select){ - xsldbgGenericErrorFunc(i18n(" Local = %1\n%2").arg(xsldbgText(fullQualifiedName)).arg(xsldbgText(item->select))); - }else{ - /* can't find a value give only a variable name and an error */ - xsldbgGenericErrorFunc(i18n(" Local = %1\n%2").arg(xsldbgText(fullQualifiedName)).arg(i18n("Warning: No value assigned to variable.\n"))); - } - } - xsltGenericError(xsltGenericErrorContext, "\n\032\032\n"); - } - item = item->next; - } - } - } - result = 1; - xsltGenericError(xsltGenericErrorContext, "\n"); - } else { - if (getThreadStatus() != XSLDBG_MSG_THREAD_RUN) { - /* Don't show this message when running as a thread as it - * is annoying */ - xsldbgGenericErrorFunc(i18n("Error: Libxslt has not initialized variables yet; try stepping past the xsl:param elements in the template.\n")); - } else { - /* send an empty list */ - notifyListStart(XSLDBG_MSG_LOCALVAR_CHANGED); - notifyListSend(); - result = 1; - } - } - } - } else { - /* Display the value of variable */ - if (arg[0] == '$') { - printXPathObject(xmlXPathEval(arg, styleCtxt->xpathCtxt), arg); - xsltGenericError(xsltGenericErrorContext, "\032\032\n"); - } else { - xmlStrCpy(nodeViewBuffer, "$"); - xmlStrCat(nodeViewBuffer, arg); - printXPathObject(xmlXPathEval((xmlChar*)nodeViewBuffer,styleCtxt->xpathCtxt), - (xmlChar*)nodeViewBuffer); - xsltGenericError(xsltGenericErrorContext, "\032\032\n"); - } - - } - - printVariableValue = 0; - return result; -} |
