X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fdebug.cpp;h=bff9bf415a993a2cda8768a869f243884de52107;hb=8d640dc77608bedddb5b00982c23665584f52d21;hp=2e1c7ab1d91822f88829fb7d99cba0d6916faf47;hpb=cfc37ecf8e3ad35b573ee711063d968a12333e6a;p=lyx.git diff --git a/src/support/debug.cpp b/src/support/debug.cpp index 2e1c7ab1d9..bff9bf415a 100644 --- a/src/support/debug.cpp +++ b/src/support/debug.cpp @@ -3,46 +3,43 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes * \author Jean-Marc Lasgouttes + * \author Pavel Sanda * * Full author contact details are available in file CREDITS. */ #include -#include "support/debug.h" - #include "support/convert.h" +#include "support/debug.h" +#include "support/FileName.h" #include "support/gettext.h" #include "support/lstrings.h" -#include "support/FileName.h" +#include "support/ProgressInterface.h" +#include "support/regex.h" #include #include -using std::setw; -using std::string; -using std::ostream; +using namespace std; +using namespace lyx::support; namespace lyx { -using support::ascii_lowercase; -using support::bformat; -using support::isStrInt; - namespace { -struct ErrorItem { +struct DebugErrorItem { Debug::Type level; char const * name; char const * desc; }; -ErrorItem errorTags[] = { - { Debug::NONE, "none", N_("No debugging message")}, +DebugErrorItem errorTags[] = { + { Debug::NONE, "none", N_("No debugging messages")}, { Debug::INFO, "info", N_("General information")}, { Debug::INIT, "init", N_("Program initialisation")}, { Debug::KEY, "key", N_("Keyboard events handling")}, @@ -56,18 +53,24 @@ ErrorItem errorTags[] = { { Debug::TCLASS, "tclass", N_("Textclass files reading")}, { Debug::LYXVC, "lyxvc", N_("Version control")}, { Debug::LYXSERVER, "lyxserver", N_("External control interface")}, - { Debug::ROFF, "roff", N_("Keep *roff temporary files")}, + { Debug::UNDO, "undo", N_("Undo/Redo mechanism")}, { Debug::ACTION, "action", N_("User commands")}, - { Debug::LYXLEX, "lyxlex", N_("The LyX Lexxer")}, + { Debug::LYXLEX, "lyxlex", N_("The LyX Lexer")}, { Debug::DEPEND, "depend", N_("Dependency information")}, { Debug::INSETS, "insets", N_("LyX Insets")}, { Debug::FILES, "files", N_("Files used by LyX")}, { Debug::WORKAREA, "workarea", N_("Workarea events")}, - { Debug::INSETTEXT, "insettext", N_("Insettext/tabular messages")}, + { Debug::CLIPBOARD, "clipboard", N_("Clipboard handling")}, { Debug::GRAPHICS, "graphics", N_("Graphics conversion and loading")}, { Debug::CHANGES, "changes", N_("Change tracking")}, { Debug::EXTERNAL, "external", N_("External template/inset messages")}, { Debug::PAINTING, "painting", N_("RowPainter profiling")}, + { Debug::SCROLLING, "scrolling", N_("Scrolling debugging")}, + { Debug::MACROS, "macros", N_("Math macros")}, + { Debug::RTL, "rtl", N_("RTL/Bidi")}, + { Debug::LOCALE, "locale", N_("Locale/Internationalisation")}, + { Debug::SELECTION, "selection", N_("Selection copy/paste mechanism")}, + { Debug::FIND, "find", N_("Find and replace mechanism")}, { Debug::DEBUG, "debug", N_("Developers' general debug messages")}, { Debug::ANY, "any", N_("All debugging messages")} }; @@ -78,6 +81,40 @@ int const numErrorTags = sizeof(errorTags)/sizeof(errorTags[0]); } // namespace anon +int Debug::levelCount() +{ + return numErrorTags; +} + + +Debug::Type Debug::value(int idx) +{ + if (idx > 0 && idx < numErrorTags) + return errorTags[idx].level; + return Debug::NONE; +} + + +string const Debug::description(Debug::Type val) +{ + for (int i = 0 ; i < numErrorTags ; ++i) { + if (errorTags[i].level == val) + return errorTags[i].desc; + } + return "unknown level"; +} + + +string const Debug::name(Debug::Type val) +{ + for (int i = 0 ; i < numErrorTags ; ++i) { + if (errorTags[i].level == val) + return errorTags[i].name; + } + return "unknown level"; +} + + Debug::Type Debug::value(string const & val) { Type l = Debug::NONE; @@ -108,10 +145,10 @@ Debug::Type Debug::value(string const & val) void Debug::showLevel(ostream & os, Debug::Type level) { // Show what features are traced - for (int i = 0; i != numErrorTags; ++i) { + for (int i = 0; i < numErrorTags; ++i) { if (errorTags[i].level != Debug::ANY - && errorTags[i].level != Debug::NONE - && errorTags[i].level & level) { + && errorTags[i].level != Debug::NONE + && errorTags[i].level & level) { // avoid to_utf8(_(...)) re-entrance problem docstring const s = _(errorTags[i].desc); os << to_utf8(bformat(_("Debugging `%1$s' (%2$s)"), @@ -147,47 +184,88 @@ void LyXErr::enable() bool LyXErr::debugging(Debug::Type t) const { - return (dt & t); + return (dt_ & t); } void LyXErr::endl() { - if (enabled_) + if (enabled_) { stream() << std::endl; + if (second_enabled_) + secondStream() << std::endl; + } +} + + +char const * LyXErr::stripName(char const * n) +{ + string const name = n; + // find the last occurence of /src/ in name + static const regex re("[\\/]src[\\/]"); + string::const_iterator const begin = name.begin(); + string::const_iterator it = begin; + string::const_iterator const end = name.end(); + smatch results; + while (regex_search(it, end, results, re)) { + it = results[0].second; + } + return n + std::distance(begin, it); +} + + +// It seems not possible to instantiate operator template out of class body +template +LyXErr & toStream(LyXErr & l, T t) +{ + if (l.enabled()){ + l.stream() << t; + if (l.secondEnabled()) { + l.secondStream() << t; + ProgressInterface::instance()->lyxerrFlush(); + } + } + return l; } LyXErr & operator<<(LyXErr & l, void const * t) -{ if (l.enabled()) l.stream() << t; return l; } +{ return toStream(l, t); } LyXErr & operator<<(LyXErr & l, char const * t) -{ if (l.enabled()) l.stream() << t; return l; } +{ return toStream(l, t); } LyXErr & operator<<(LyXErr & l, char t) -{ if (l.enabled()) l.stream() << t; return l; } +{ return toStream(l, t); } LyXErr & operator<<(LyXErr & l, int t) -{ if (l.enabled()) l.stream() << t; return l; } +{ return toStream(l, t); } LyXErr & operator<<(LyXErr & l, unsigned int t) -{ if (l.enabled()) l.stream() << t; return l; } +{ return toStream(l, t); } LyXErr & operator<<(LyXErr & l, long t) -{ if (l.enabled()) l.stream() << t; return l; } +{ return toStream(l, t); } LyXErr & operator<<(LyXErr & l, unsigned long t) -{ if (l.enabled()) l.stream() << t; return l; } +{ return toStream(l, t); } +#ifdef LYX_USE_LONG_LONG +LyXErr & operator<<(LyXErr & l, long long t) +{ return toStream(l, t); } +LyXErr & operator<<(LyXErr & l, unsigned long long t) +{ return toStream(l, t); } +#endif LyXErr & operator<<(LyXErr & l, double t) -{ if (l.enabled()) l.stream() << t; return l; } -LyXErr & operator<<(LyXErr & l, std::string const & t) -{ if (l.enabled()) l.stream() << t; return l; } +{ return toStream(l, t); } +LyXErr & operator<<(LyXErr & l, string const & t) +{ return toStream(l, t); } LyXErr & operator<<(LyXErr & l, docstring const & t) -{ if (l.enabled()) l.stream() << to_utf8(t); return l; } -LyXErr & operator<<(LyXErr & l, support::FileName const & t) -{ if (l.enabled()) l.stream() << t; return l; } -LyXErr & operator<<(LyXErr & l, std::ostream &(*t)(std::ostream &)) -{ if (l.enabled()) l.stream() << t; return l; } -LyXErr & operator<<(LyXErr & l, std::ios_base &(*t)(std::ios_base &)) -{ if (l.enabled()) l.stream() << t; return l; } +{ return toStream(l, to_utf8(t)); } +LyXErr & operator<<(LyXErr & l, FileName const & t) +{ return toStream(l, t); } +LyXErr & operator<<(LyXErr & l, ostream &(*t)(ostream &)) +{ return toStream(l, t); } +LyXErr & operator<<(LyXErr & l, ios_base &(*t)(ios_base &)) +{ return toStream(l, t); } // The global instance LyXErr lyxerr; + } // namespace lyx