aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/util.cpp92
-rw-r--r--common/util.h6
-rw-r--r--engines/scumm/debugger.cpp28
-rw-r--r--gui/debugger.cpp6
4 files changed, 77 insertions, 55 deletions
diff --git a/common/util.cpp b/common/util.cpp
index 700ea97701..6f0fdcb233 100644
--- a/common/util.cpp
+++ b/common/util.cpp
@@ -394,18 +394,40 @@ const char *getRenderModeDescription(RenderMode id) {
#pragma mark -
-static Array<EngineDebugLevel> gDebugLevels;
-static uint32 gDebugLevelsEnabled = 0;
+namespace {
+
+DebugLevelContainer gDebugLevels;
+uint32 gDebugLevelsEnabled = 0;
+
+struct DebugLevelSort {
+ bool operator()(const EngineDebugLevel &l, const EngineDebugLevel &r) {
+ return (l.option.compareToIgnoreCase(r.option) < 0);
+ }
+};
+
+struct DebugLevelSearch {
+ const String &_option;
+
+ DebugLevelSearch(const String &option) : _option(option) {}
+
+ bool operator()(const EngineDebugLevel &l) {
+ return _option.equalsIgnoreCase(l.option);
+ }
+};
+
+}
bool addSpecialDebugLevel(uint32 level, const String &option, const String &description) {
- for (uint i = 0; i < gDebugLevels.size(); ++i) {
- if (!scumm_stricmp(option.c_str(), gDebugLevels[i].option.c_str())) {
- warning("Declared engine debug level '%s' again", option.c_str());
- gDebugLevels[i] = EngineDebugLevel(level, option, description);
- return true;
- }
+ DebugLevelContainer::iterator i = find_if(gDebugLevels.begin(), gDebugLevels.end(), DebugLevelSearch(option));
+
+ if (i != gDebugLevels.end()) {
+ warning("Declared engine debug level '%s' again", option.c_str());
+ *i = EngineDebugLevel(level, option, description);
+ } else {
+ gDebugLevels.push_back(EngineDebugLevel(level, option, description));
+ sort(gDebugLevels.begin(), gDebugLevels.end(), DebugLevelSort());
}
- gDebugLevels.push_back(EngineDebugLevel(level, option, description));
+
return true;
}
@@ -415,43 +437,43 @@ void clearAllSpecialDebugLevels() {
}
bool enableSpecialDebugLevel(const String &option) {
- for (uint i = 0; i < gDebugLevels.size(); ++i) {
- if (!scumm_stricmp(option.c_str(), gDebugLevels[i].option.c_str())) {
- gDebugLevelsEnabled |= gDebugLevels[i].level;
- gDebugLevels[i].enabled = true;
- return true;
- }
+ DebugLevelContainer::iterator i = find_if(gDebugLevels.begin(), gDebugLevels.end(), DebugLevelSearch(option));
+
+ if (i != gDebugLevels.end()) {
+ gDebugLevelsEnabled |= i->level;
+ i->enabled = true;
+
+ return true;
+ } else {
+ return false;
}
- return false;
}
void enableSpecialDebugLevelList(const String &option) {
- uint start = 0;
- uint end = 0;
-
- const char *str = option.c_str();
- for (end = start + 1; end <= option.size(); ++end) {
- if (str[end] == ',' || end == option.size()) {
- if (!enableSpecialDebugLevel(Common::String(&str[start], end-start))) {
- warning("Engine does not support debug level '%s'", Common::String(&str[start], end-start).c_str());
- }
- start = end + 1;
- }
+ StringTokenizer tokenizer(option, " ,");
+ String token;
+
+ while (!tokenizer.empty()) {
+ token = tokenizer.nextToken();
+ if (!enableSpecialDebugLevel(token))
+ warning("Engine does not support debug level '%s'", token.c_str());
}
}
bool disableSpecialDebugLevel(const String &option) {
- for (uint i = 0; i < gDebugLevels.size(); ++i) {
- if (!scumm_stricmp(option.c_str(), gDebugLevels[i].option.c_str())) {
- gDebugLevelsEnabled &= ~gDebugLevels[i].level;
- gDebugLevels[i].enabled = false;
- return true;
- }
+ DebugLevelContainer::iterator i = find_if(gDebugLevels.begin(), gDebugLevels.end(), DebugLevelSearch(option));
+
+ if (i != gDebugLevels.end()) {
+ gDebugLevelsEnabled &= ~i->level;
+ i->enabled = false;
+
+ return true;
+ } else {
+ return false;
}
- return false;
}
-const Array<EngineDebugLevel> &listSpecialDebugLevels() {
+const DebugLevelContainer &listSpecialDebugLevels() {
return gDebugLevels;
}
diff --git a/common/util.h b/common/util.h
index 1f680d28c1..c23513596c 100644
--- a/common/util.h
+++ b/common/util.h
@@ -27,7 +27,7 @@
#include "common/scummsys.h"
#include "common/str.h"
-#include "common/array.h"
+#include "common/list.h"
#ifdef MIN
#undef MIN
@@ -308,11 +308,13 @@ void enableSpecialDebugLevelList(const String &option);
*/
bool disableSpecialDebugLevel(const String &option);
+typedef List<EngineDebugLevel> DebugLevelContainer;
+
/**
* Lists all debug levels
* @return returns a arry with all debug levels
*/
-const Array<EngineDebugLevel> &listSpecialDebugLevels();
+const DebugLevelContainer &listSpecialDebugLevels();
/**
* Return the active debug flag mask (i.e. all active debug flags ORed
diff --git a/engines/scumm/debugger.cpp b/engines/scumm/debugger.cpp
index 954e400c2c..9f9115e207 100644
--- a/engines/scumm/debugger.cpp
+++ b/engines/scumm/debugger.cpp
@@ -498,25 +498,24 @@ bool ScummDebugger::Cmd_Object(int argc, const char **argv) {
}
bool ScummDebugger::Cmd_Debug(int argc, const char **argv) {
- Common::Array<Common::EngineDebugLevel> lvls = Common::listSpecialDebugLevels();
+ const Common::DebugLevelContainer &lvls = Common::listSpecialDebugLevels();
bool setFlag = false; // Remove or add debug channel?
if ((argc == 1) && (Common::getEnabledSpecialDebugLevels() == 0)) {
DebugPrintf("No debug flags are enabled\n");
DebugPrintf("Available Channels: ");
- for (uint i = 0; i < lvls.size(); i++) {
- DebugPrintf("%s, ", lvls[i].option.c_str());
+ for (Common::DebugLevelContainer::iterator i = lvls.begin(); i != lvls.end(); ++i) {
+ DebugPrintf("%s, ", i->option.c_str());
}
DebugPrintf("\n");
return true;
}
if ((argc == 1) && (Common::getEnabledSpecialDebugLevels() > 0)) {
- for (uint i = 0; i < lvls.size(); i++) {
- if (lvls[i].enabled)
- DebugPrintf("%s - %s\n", lvls[i].option.c_str(),
- lvls[i].description.c_str());
+ for (Common::DebugLevelContainer::iterator i = lvls.begin(); i != lvls.end(); ++i) {
+ if (i->enabled)
+ DebugPrintf("%s - %s\n", i->option.c_str(), i->description.c_str());
}
return true;
}
@@ -529,25 +528,24 @@ bool ScummDebugger::Cmd_Debug(int argc, const char **argv) {
} else {
DebugPrintf("Syntax: Debug +CHANNEL, or Debug -CHANNEL\n");
DebugPrintf("Available Channels: ");
- for (uint i = 0; i < lvls.size(); i++) {
- DebugPrintf("%s, ", lvls[i].option.c_str());
- DebugPrintf("\n");
+ for (Common::DebugLevelContainer::iterator i = lvls.begin(); i != lvls.end(); ++i) {
+ DebugPrintf("%s\n", i->option.c_str());
}
}
// Identify flag
const char *realFlag = argv[1] + 1;
- for (uint i = 0; i < lvls.size(); i++) {
- if ((scumm_stricmp(lvls[i].option.c_str(), realFlag)) == 0) {
+ for (Common::DebugLevelContainer::iterator i = lvls.begin(); i != lvls.end(); ++i) {
+ if (i->option.equalsIgnoreCase(realFlag)) {
if (setFlag) {
- enableSpecialDebugLevel(lvls[i].option);
+ enableSpecialDebugLevel(i->option);
DebugPrintf("Enable ");
} else {
- disableSpecialDebugLevel(lvls[i].option);
+ disableSpecialDebugLevel(i->option);
DebugPrintf("Disable ");
}
- DebugPrintf("%s\n", lvls[i].description.c_str());
+ DebugPrintf("%s\n", i->description.c_str());
return true;
}
}
diff --git a/gui/debugger.cpp b/gui/debugger.cpp
index 99aebe9b62..87abe854be 100644
--- a/gui/debugger.cpp
+++ b/gui/debugger.cpp
@@ -406,7 +406,7 @@ bool Debugger::Cmd_Help(int argc, const char **argv) {
}
bool Debugger::Cmd_DebugFlagsList(int argc, const char **argv) {
- const Common::Array<Common::EngineDebugLevel> &debugLevels = Common::listSpecialDebugLevels();
+ const Common::DebugLevelContainer &debugLevels = Common::listSpecialDebugLevels();
DebugPrintf("Engine debug levels:\n");
DebugPrintf("--------------------\n");
@@ -414,8 +414,8 @@ bool Debugger::Cmd_DebugFlagsList(int argc, const char **argv) {
DebugPrintf("No engine debug levels\n");
return true;
}
- for (uint i = 0; i < debugLevels.size(); ++i) {
- DebugPrintf("'%s' - Description: %s\n", debugLevels[i].option.c_str(), debugLevels[i].description.c_str());
+ for (Common::DebugLevelContainer::const_iterator i = debugLevels.begin(); i != debugLevels.end(); ++i) {
+ DebugPrintf("'%s' - Description: %s\n", i->option.c_str(), i->description.c_str());
}
DebugPrintf("\n");
return true;