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; }
/** * xslDbgShellOutput: * @arg : Is valid, either a local file name which will be expanded * if needed, or a "file://" protocol URI * * Set the output file name to use * * Returns 1 on success, * 0 otherwise */ int xslDbgShellOutput(const xmlChar *arg) { int result = 0; if (arg && (xmlStrLen(arg) > 0)){ if (!xmlStrnCmp(arg, "file:/", 6)){ /* convert URI to local file name */ xmlChar *outputFileName = filesURItoFileName(arg); if (outputFileName){ optionsSetStringOption(OPTIONS_OUTPUT_FILE_NAME, outputFileName); notifyXsldbgApp(XSLDBG_MSG_FILE_CHANGED, 0L); xmlFree(outputFileName); result = 1; } } else if (xmlStrEqual(arg, (xmlChar*)"-")) { optionsSetStringOption(OPTIONS_OUTPUT_FILE_NAME, NULL); notifyXsldbgApp(XSLDBG_MSG_FILE_CHANGED, 0L); result = 1; } else if (!xmlStrnCmp(arg, "ftp://", 6) || !xmlStrnCmp(arg, "http://", 7)){ xsldbgGenericErrorFunc(i18n("Error: Invalid arguments for the command %1.\n").arg("output")); return 0; } else { /* assume that we were provided a local file name * that may need expanding */ xmlChar *expandedName = filesExpandName(arg); // The output file must not be the same as our SOURCE or DATA file if (expandedName && (!xmlStrEqual(optionsGetStringOption(OPTIONS_SOURCE_FILE_NAME), expandedName)) && (!xmlStrEqual(optionsGetStringOption(OPTIONS_DATA_FILE_NAME), expandedName)) ){ optionsSetStringOption(OPTIONS_OUTPUT_FILE_NAME, expandedName); notifyXsldbgApp(XSLDBG_MSG_FILE_CHANGED, 0L); xmlFree(expandedName); result = 1; }else{ xsldbgGenericErrorFunc(i18n("Error: Invalid arguments for the command %1.\n").arg("output")); } } } else { xsldbgGenericErrorFunc(i18n("Error: Missing arguments for the command %1.\n").arg("output")); } return result; }
/** * xslDbgShellDelParam: * @arg: A single white space trimmed parameter number to look for * * Delet a libxslt parameter to be sent to libxslt later on * * Returns 1 if able to delete parameter @name, * 0 otherwise */ int xslDbgShellDelParam(xmlChar * arg) { int result = 0; static const char *errorPrompt = I18N_NOOP("Failed to delete parameter"); long paramId; xmlChar *opts[2]; if (!arg) { xsldbgGenericErrorFunc(i18n("Error: Invalid arguments for the command %1.\n").arg("delparam")); }else{ if (xmlStrLen(arg) > 0) { if (splitString(arg, 1, opts) == 1) { if ((xmlStrlen(opts[0]) == 0) || !sscanf((char *) opts[0], "%ld", ¶mId)) { xsldbgGenericErrorFunc(i18n("Error: Unable to parse %1 as a line number.\n").arg(xsldbgText(opts[0]))); } else { result = arrayListDelete(optionsGetParamItemList(), paramId); if (!result) xsldbgGenericErrorFunc(i18n("Error: Unable to find parameter %1.\n").arg(paramId)); } } else { xsldbgGenericErrorFunc(i18n("Error: Invalid arguments for the command %1.\n").arg("delparam")); } } else { /* Delete all parameters */ arrayListEmpty(optionsGetParamItemList()); result = 1; } } if (!result) xsldbgGenericErrorFunc(QString("Error: %1\n").arg(i18n(errorPrompt))); else xsldbgGenericErrorFunc("\n"); return result; }
/** * xslDbgShellAddParam: * @arg: A string comprised of two words separated by * one or more spaces which are in UTF-8 * * Add a libxslt parameter to be sent to libxslt later on * * Returns 1 on success, * 0 otherwise */ int xslDbgShellAddParam(xmlChar * arg) { int result = 0; parameterItemPtr paramItem = NULL; static const char *errorPrompt = I18N_NOOP("Failed to add parameter"); xmlChar *opts[2]; if (!arg) { xsldbgGenericErrorFunc(i18n("Error: Invalid arguments for the command %1.\n").arg("addparam")); }else{ if ((xmlStrLen(arg) > 1) && splitString(arg, 2, opts) == 2) { int count; for (count = 0; count < arrayListCount(optionsGetParamItemList()); count++){ paramItem = (parameterItemPtr)arrayListGet(optionsGetParamItemList(), count); if (paramItem != NULL){ if (xmlStrCmp(opts[0], paramItem->name) == 0){ /* parameter exist just update its value */ if (paramItem->value) xmlFree(paramItem->value); paramItem->value = xmlStrdup(opts[1]); return 1; } } } paramItem = optionsParamItemNew(opts[0], opts[1]); result = arrayListAdd(optionsGetParamItemList(), paramItem); } else { xsldbgGenericErrorFunc(i18n("Error: Invalid arguments for the command %1.\n").arg("addparam")); } } if (!result) xsldbgGenericErrorFunc(QString("Error: %1\n").arg(i18n(errorPrompt))); else { xsldbgGenericErrorFunc("\n"); } return result; }
int xslDbgShellSetVariable(xsltTransformContextPtr styleCtxt, xmlChar * arg) { int result = 0, showUsage = 0; xmlChar *name, *nameURI, *selectExpr, *opts[3]; if (!styleCtxt) { xsldbgGenericErrorFunc(i18n("Error: Stylesheet is not valid.\n")); return result; } if (!arg) { #ifdef WITH_XSLDBG_DEBUG_PROCESS xsltGenericError(xsltGenericErrorContext, "Error: NULL argument provided\n"); #endif return result; } if (xmlStrLen(arg) > 1) { if (splitString(arg, 2, opts) == 2) { nameURI = NULL; /* ignore any "$" prefix as user probably didn't mean that "$" is part of variable name*/ if (*opts[0] =='$'){ opts[0] = opts[0] + 1; } name = xmlSplitQName2(opts[0], &nameURI); if (name == NULL) name = xmlStrdup(opts[0]); selectExpr = xmlStrdup(opts[1]); if (name && selectExpr) { xsltStackElemPtr def = NULL; if (styleCtxt->varsBase) { /* try finding varaible in stack */ xsltStackElemPtr item = styleCtxt->varsTab[styleCtxt->varsBase]; while (item) { if ((xmlStrCmp(name, item->name) == 0) && (item->nameURI == NULL || (xmlStrCmp(name, item->nameURI) == 0))) { def = item; break; } item = item->next; } } if (def == NULL) def = (xsltStackElemPtr) xmlHashLookup2(styleCtxt->globalVars, name, nameURI); if (def != NULL) { if (def->select) { /* we've found the variable so change it */ xmlFree((void*)def->select); def->select = selectExpr; if (def->comp->comp) xmlXPathFreeCompExpr(def->comp->comp); def->comp->comp = xmlXPathCompile(def->select); if (def->value) xmlXPathFreeObject(def->value); def->value = xmlXPathEval(def->select, styleCtxt->xpathCtxt); result = 1; } else { xmlFree(selectExpr); xsldbgGenericErrorFunc(i18n("Error: Cannot change a variable that does not use the select attribute.\n")); } } else xsldbgGenericErrorFunc(i18n("Error: Variable %1 was not found.\n").arg(xsldbgText(name))); xmlFree(name); } else xsldbgGenericErrorFunc(i18n("Error: Out of memory.\n")); } else { showUsage = 1; } if (showUsage == 1) xsldbgGenericErrorFunc(i18n("Error: Invalid arguments to command %1.\n").arg("set")); } return result; }
/** * 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) + QString("\n")); xsldbgGenericErrorFunc(i18n("\tTotal of %n XSLT template printed", "\tTotal of %n XSLT templates printed", printedTemplateCount) + QString("\n")); } } result = 1; return result; }