diff --git a/src/debug.cpp b/src/debug.cpp index 034ae5b298..e13e58ec3f 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -167,21 +167,23 @@ void SetDebugString(const char *s, void (*error_func)(const char *)) char *end; const char *t; - /* global debugging level? */ + /* Store planned changes into map during parse */ + std::map new_levels; + + /* Global debugging level? */ if (*s >= '0' && *s <= '9') { const DebugLevel *i; v = strtoul(s, &end, 0); s = end; - for (i = debug_level; i != endof(debug_level); ++i) *i->level = v; + for (i = debug_level; i != endof(debug_level); ++i) { + new_levels[i->name] = v; + } } - /* individual levels */ + /* Individual levels */ for (;;) { - const DebugLevel *i; - int *p; - /* skip delimiters */ while (*s == ' ' || *s == ',' || *s == '\t') s++; if (*s == '\0') break; @@ -190,10 +192,10 @@ void SetDebugString(const char *s, void (*error_func)(const char *)) while (*s >= 'a' && *s <= 'z') s++; /* check debugging levels */ - p = nullptr; - for (i = debug_level; i != endof(debug_level); ++i) { + const DebugLevel *found = nullptr; + for (const DebugLevel *i = debug_level; i != endof(debug_level); ++i) { if (s == t + strlen(i->name) && strncmp(t, i->name, s - t) == 0) { - p = i->level; + found = i; break; } } @@ -201,14 +203,22 @@ void SetDebugString(const char *s, void (*error_func)(const char *)) if (*s == '=') s++; v = strtoul(s, &end, 0); s = end; - if (p != nullptr) { - *p = v; + if (found != nullptr) { + new_levels[found->name] = v; } else { std::string error_string = fmt::format("Unknown debug level '{}'", std::string(t, s - t)); error_func(error_string.c_str()); return; } } + + /* Apply the changes after parse is successful */ + for (const DebugLevel *i = debug_level; i != endof(debug_level); ++i) { + const auto &nl = new_levels.find(i->name); + if (nl != new_levels.end()) { + *i->level = nl->second; + } + } } /**