diff options
Diffstat (limited to 'kxsldbg/kxsldbgpart/libxsldbg/option_cmds.cpp')
-rw-r--r-- | kxsldbg/kxsldbgpart/libxsldbg/option_cmds.cpp | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/kxsldbg/kxsldbgpart/libxsldbg/option_cmds.cpp b/kxsldbg/kxsldbgpart/libxsldbg/option_cmds.cpp new file mode 100644 index 00000000..0bc54364 --- /dev/null +++ b/kxsldbg/kxsldbgpart/libxsldbg/option_cmds.cpp @@ -0,0 +1,299 @@ + +/*************************************************************************** + option_cmds.c - implementation for option + related commands + + ------------------- + begin : Fri Feb 1 2001 + copyright : (C) 2001 by Keith Isdale + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 "utils.h" +#include "options.h" +#include "xsldbgmsg.h" +#include "xsldbgthread.h" +#include "debugXSL.h" + + +/** + * xslDbgShellSetOption: + * @arg : Is valid, and in the format <NAME> <VALUE> + * + * Set the value of an option + * + * Returns 1 on success, + * 0 otherwise + */ +int +xslDbgShellSetOption(xmlChar * arg) +{ + int result = 0; + + if (!arg) { +#ifdef WITH_XSLDBG_DEBUG_PROCESS + xsltGenericError(xsltGenericErrorContext, + "Error: NULL argument provided\n"); +#endif + return result; + } + + if (xmlStrLen(arg) > 0) { + xmlChar *opts[2]; + long optValue; + long optID; + + + if (splitString(arg, 2, opts) == 2) { + bool invertOption = false; + optID = optionsGetOptionID(opts[0]); + if ((optID == -1) && (opts[0][0] == 'n') && (opts[0][1] == 'o')){ + optID = optionsGetOptionID(&opts[0][2]); + if (optID != -1){ + // invert the value the user provides + invertOption = true; + } + } + + if (optID >= OPTIONS_FIRST_INT_OPTIONID) { + if (optID <= OPTIONS_LAST_INT_OPTIONID) { + /* handle setting integer option */ + if ((xmlStrlen(opts[1]) == 0) || + !sscanf((char *) opts[1], "%ld", &optValue)) { + xsldbgGenericErrorFunc(i18n("Error: Unable to parse %1 as an option value.\n").arg(xsldbgText(opts[1]))); + } else { + if (invertOption) + optValue = !optValue; + result = optionsSetIntOption(OptionTypeEnum(optID), optValue); + } + } else { + /* handle setting a string option */ + result = optionsSetStringOption(OptionTypeEnum(optID), opts[1]); + + } + } else { + static xmlExternalEntityLoader xsldbgDefaultEntLoader = 0; + bool invertOption = false; + bool enableNet = false; + + if (!xsldbgDefaultEntLoader) + xsldbgDefaultEntLoader = xmlGetExternalEntityLoader(); + + if (xmlStrEqual(opts[0], (const xmlChar *)"nonet" )) + invertOption = true; + + if (xmlStrEqual(&opts[0][2*invertOption], (const xmlChar *)"net" )){ + if (sscanf((char *) opts[1], "%ld", &optValue)) { + if (invertOption) + optValue = !optValue; + if (optValue) + enableNet = true; + result = true; + if (enableNet) + xmlSetExternalEntityLoader(xsldbgDefaultEntLoader); + else + xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader); + }else{ + xsldbgGenericErrorFunc(i18n("Error: Unable to parse %1 as an option value.\n").arg(xsldbgText(opts[1]))); + } + } else + xsldbgGenericErrorFunc(i18n("Error: Unknown option name %1.\n").arg(xsldbgText(opts[0]))); + } + } else { + xsldbgGenericErrorFunc(i18n("Error: Missing arguments for the command %1.\n").arg("setoption")); + } + } else { + xsldbgGenericErrorFunc(i18n("Error: Missing arguments for the command %1.\n").arg("setoption")); + } + + return result; +} + + + +/** + * xslDbgShellOptions: + * + * Prints out values for user options + * + * Returns 1 on success, + * 0 otherwise + */ +int +xslDbgShellOptions(void) +{ + int result = 1; + int optionIndex; + const xmlChar *optionName, *optionValue; + + /* Print out the integer options and thier values */ + if (getThreadStatus() != XSLDBG_MSG_THREAD_RUN) { + for (optionIndex = OPTIONS_XINCLUDE; + optionIndex <= OPTIONS_VERBOSE; optionIndex++) { + /* skip any non-user options */ + optionName = optionsGetOptionName(OptionTypeEnum(optionIndex)); + if (optionName && (optionName[0] != '*')) { + xsldbgGenericErrorFunc(i18n("Option %1 = %2\n").arg(xsldbgText(optionName)).arg(optionsGetIntOption(OptionTypeEnum(optionIndex)))); + + } + } + /* Print out the string options and thier values */ + for (optionIndex = OPTIONS_OUTPUT_FILE_NAME; + optionIndex <= OPTIONS_DATA_FILE_NAME; optionIndex++) { + optionName = optionsGetOptionName(OptionTypeEnum(optionIndex)); + if (optionName && (optionName[0] != '*')) { + optionValue = optionsGetStringOption(OptionTypeEnum(optionIndex)); + if (optionValue) { + xsldbgGenericErrorFunc(i18n("Option %1 = \"%2\"\n").arg(xsldbgText(optionName)).arg((char*)optionValue)); + } else { + xsldbgGenericErrorFunc(i18n("Option %1 = \"\"\n").arg(xsldbgText(optionName))); + + } + } + + } + xsldbgGenericErrorFunc("\n"); + } else { + /* we are now notifying the application of the value of options */ + parameterItemPtr paramItem; + + notifyListStart(XSLDBG_MSG_INTOPTION_CHANGE); + /* send the integer options and their values */ + for (optionIndex = OPTIONS_XINCLUDE; + optionIndex <= OPTIONS_VERBOSE; optionIndex++) { + /* skip any non-user options */ + optionName = optionsGetOptionName(OptionTypeEnum(optionIndex)); + if (optionName && (optionName[0] != '*')) { + paramItem = optionsParamItemNew(optionName, 0L); + if (!paramItem) { + notifyListSend(); /* send what ever we've got so far */ + return 0; /* out of memory */ + } + paramItem->intValue = optionsGetIntOption(OptionTypeEnum(optionIndex)); + notifyListQueue(paramItem); /* this will be free later */ + } + } + + notifyListSend(); + notifyListStart(XSLDBG_MSG_STRINGOPTION_CHANGE); + /* Send the string options and thier values */ + for (optionIndex = OPTIONS_OUTPUT_FILE_NAME; + optionIndex <= OPTIONS_DATA_FILE_NAME; optionIndex++) { + optionName = optionsGetOptionName(OptionTypeEnum(optionIndex)); + if (optionName && (optionName[0] != '*')) { + paramItem = + optionsParamItemNew(optionName, + optionsGetStringOption + (OptionTypeEnum(optionIndex))); + if (!paramItem) { + notifyListSend(); /* send what ever we've got so far */ + return 0; /* out of memory */ + } else + notifyListQueue(paramItem); /* this will be freed later */ + } + } + notifyListSend(); + } + + return result; +} + + + /** + * xslDbgShellShowWatches: + * @styleCtxt: the current stylesheet context + * @ctxt: The current shell context + * @showWarnings : If 1 then showWarning messages, + * otherwise do not show warning messages + * + * Print the current watches and their values + * + * Returns 1 on success, + * 0 otherwise + */ + int xslDbgShellShowWatches(xsltTransformContextPtr styleCtxt, + xmlShellCtxtPtr ctx,int showWarnings) +{ + int result = 0, counter; + xmlChar* watchExpression; + if ((showWarnings == 1) && (arrayListCount(optionsGetWatchList()) == 0)){ + xsldbgGenericErrorFunc(i18n("\tNo expression watches set.\n")); + } + for ( counter = 0; + counter < arrayListCount(optionsGetWatchList()); + counter++){ + watchExpression = (xmlChar*)arrayListGet(optionsGetWatchList(), counter); + if (watchExpression){ + xsldbgGenericErrorFunc(i18n(" WatchExpression %1 ").arg(counter + 1)); + result = xslDbgShellCat(styleCtxt, ctx, watchExpression); + }else + break; + } + + return result; +} + + + /** + * xslDbgShellAddWatch: + * @arg : A valid xPath of expression to watch the value of + * + * Add expression to list of expressions to watch value of + * + * Returns 1 on success, + * 0 otherwise + */ + int xslDbgShellAddWatch(xmlChar* arg) +{ + int result = 0; + if (arg){ + trimString(arg); + result = optionsAddWatch(arg); + if (!result) + xsldbgGenericErrorFunc(i18n("Error: Unable to add watch expression \"%1\". It already has been added or it cannot be watched.\n").arg(xsldbgText(arg))); + } + return result; +} + + /** + * xslDbgShellDeleteWatch: + * @arg : A watch ID to remove or "*" to remove all watches + * + * Delete a given watch ID from our list of expressions to watch + * + * Returns 1 on success, + * 0 otherwise + */ + int xslDbgShellDeleteWatch(xmlChar* arg) +{ + int result = 0; + long watchID; + if (arg){ + trimString(arg); + if (arg[0] == '*') { + arrayListEmpty(optionsGetWatchList()); + }else if ((xmlStrlen(arg) == 0) || + !sscanf((char *) arg, "%ld", &watchID)) { + xsldbgGenericErrorFunc(i18n("Error: Unable to parse %1 as a watchID.\n").arg(xsldbgText(arg))); + return result; + } else { + result = optionsRemoveWatch(watchID); + if (!result) + xsldbgGenericErrorFunc(i18n("Error: Watch expression %1 does not exist.\n").arg(watchID)); + } + } + return result; +} + + + |