From 3f7c89f3cebad6eb8fed091fd29dfd2a52ef378e Mon Sep 17 00:00:00 2001 From: nojhan Date: Fri, 20 Jan 2023 18:48:15 +0100 Subject: [PATCH] bump to v0.12 --- CMakeLists.txt | 2 +- docs/annotated.html | 2 +- docs/classclutchlog-members.html | 75 +- docs/classclutchlog.html | 34 +- docs/classclutchlog.js | 1 + docs/classclutchlog_1_1fmt-members.html | 2 +- docs/classclutchlog_1_1fmt.html | 12 +- docs/classes.html | 2 +- docs/clutchlog_8h.html | 10 +- docs/clutchlog_8h.js | 2 +- docs/clutchlog_8h_source.html | 1517 +++++++++-------- docs/clutchlog_logo.png | Bin 397834 -> 398317 bytes docs/clutchlog_logo.svg | 4 +- docs/dir_000001_000000.html | 2 +- .../dir_59425e443f801f1f2fd8bbe4959a3ccf.html | 2 +- .../dir_c318bd5cf14aaa5601e6029e0b5b4048.html | 2 +- docs/files.html | 2 +- docs/functions.html | 5 +- docs/functions_enum.html | 2 +- docs/functions_func.html | 2 +- docs/functions_rela.html | 2 +- docs/functions_vars.html | 5 +- docs/globals.html | 8 +- docs/globals_defs.html | 8 +- docs/graph_legend.html | 2 +- docs/group___default_config.html | 10 +- docs/group___default_config.js | 2 +- docs/group___formating.html | 2 +- docs/group___main.html | 2 +- docs/group___main.js | 11 +- docs/group___use_macros.html | 4 +- docs/index.html | 71 +- docs/modules.html | 2 +- docs/navtreedata.js | 19 +- docs/navtreeindex0.js | 82 +- docs/search/all_2.js | 8 +- docs/search/all_3.js | 11 +- docs/search/all_4.js | 16 +- docs/search/all_5.js | 2 +- docs/search/all_6.js | 16 +- docs/search/all_7.js | 4 +- docs/search/all_8.js | 6 +- docs/search/all_9.js | 2 +- docs/search/all_a.js | 2 +- docs/search/all_b.js | 8 +- docs/search/all_c.js | 6 +- docs/search/all_d.js | 2 +- docs/search/classes_0.js | 2 +- docs/search/classes_1.js | 2 +- docs/search/classes_2.js | 2 +- docs/search/defines_0.js | 6 +- docs/search/defines_1.js | 2 +- docs/search/enums_0.js | 2 +- docs/search/enums_1.js | 2 +- docs/search/enums_2.js | 2 +- docs/search/enums_3.js | 2 +- docs/search/files_0.js | 2 +- docs/search/functions_0.js | 2 +- docs/search/functions_1.js | 10 +- docs/search/functions_2.js | 14 +- docs/search/functions_3.js | 4 +- docs/search/functions_4.js | 2 +- docs/search/functions_5.js | 2 +- docs/search/functions_6.js | 6 +- docs/search/functions_7.js | 2 +- docs/search/groups_0.js | 2 +- docs/search/groups_1.js | 2 +- docs/search/groups_2.js | 2 +- docs/search/groups_3.js | 2 +- docs/search/pages_0.js | 2 +- docs/search/related_0.js | 2 +- docs/search/variables_0.js | 22 +- docs/search/variables_1.js | 2 +- docs/search/variables_2.js | 15 +- docs/search/variables_3.js | 2 +- docs/search/variables_4.js | 2 +- docs/search/variables_5.js | 4 +- docs/search/variables_6.js | 2 +- docs/structclutchlog_1_1scope__t-members.html | 2 +- docs/structclutchlog_1_1scope__t.html | 4 +- docs/t-assert_8cpp_source.html | 4 +- docs/t-color_8cpp_source.html | 12 +- docs/t-demo_8cpp_source.html | 6 +- docs/t-dump_8cpp_source.html | 4 +- docs/t-log_8cpp_source.html | 4 +- docs/t-one-line-if_8cpp_source.html | 2 +- 86 files changed, 1096 insertions(+), 1062 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d2be5f..90fce70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 3.10 FATAL_ERROR) project("clutchlog" - VERSION 0.11.1 + VERSION 0.12 DESCRIPTION "A logging system which targets versatile debugging") enable_language(CXX) # C++ diff --git a/docs/annotated.html b/docs/annotated.html index a0df3f9..6ccc27a 100644 --- a/docs/annotated.html +++ b/docs/annotated.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.11.1 +  0.12
diff --git a/docs/classclutchlog-members.html b/docs/classclutchlog-members.html index 3d10653..e2ac279 100644 --- a/docs/classclutchlog-members.html +++ b/docs/classclutchlog-members.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.11.1 +  0.12
@@ -110,42 +110,43 @@ $(document).ready(function(){initNavTree('classclutchlog.html',''); initResizabl default_formatclutchloginlineprotectedstatic default_hfill_charclutchloginlineprotectedstatic default_hfill_maxclutchloginlineprotectedstatic - default_strip_callsclutchloginlineprotectedstatic - dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) constclutchloginline - dump_default_formatclutchloginlineprotectedstatic - dump_default_sepclutchloginlineprotectedstatic - error enum value (defined in clutchlog)clutchlog - file(std::string file)clutchloginline - format(const std::string &format)clutchloginline - format() constclutchloginline - format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) constclutchloginline - format_comment(const std::string &format)clutchloginline - format_comment() constclutchloginline - func(std::string func)clutchloginline - info enum value (defined in clutchlog)clutchlog - level enum nameclutchlog - level_of(const std::string name)clutchloginline - levels() constclutchloginline - line(std::string line)clutchloginline - locate(const level &stage, const std::string &file, const std::string &func, const size_t line) constclutchloginline - location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")clutchloginline - log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) constclutchloginline - logger()clutchloginlinestatic - note enum value (defined in clutchlog)clutchlog - operator=(clutchlog const &)=delete (defined in clutchlog)clutchlog - out(std::ostream &out)clutchloginline - out()clutchloginline - progress enum value (defined in clutchlog)clutchlog - replace(const std::string &form, const std::string &mark, const std::string &tag) constclutchloginline - replace(const std::string &form, const std::string &mark, const size_t tag) constclutchloginline - style(level stage, FMT... styles)clutchloginline - style(level stage, fmt style)clutchloginline - style(level stage) constclutchloginline - threshold(level l)clutchloginline - threshold(const std::string &l)clutchloginline - threshold() constclutchloginline - warning enum value (defined in clutchlog)clutchlog - xdebug enum value (defined in clutchlog)clutchlog + default_hfill_minclutchloginlineprotectedstatic + default_strip_callsclutchloginlineprotectedstatic + dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) constclutchloginline + dump_default_formatclutchloginlineprotectedstatic + dump_default_sepclutchloginlineprotectedstatic + error enum value (defined in clutchlog)clutchlog + file(std::string file)clutchloginline + format(const std::string &format)clutchloginline + format() constclutchloginline + format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) constclutchloginline + format_comment(const std::string &format)clutchloginline + format_comment() constclutchloginline + func(std::string func)clutchloginline + info enum value (defined in clutchlog)clutchlog + level enum nameclutchlog + level_of(const std::string name)clutchloginline + levels() constclutchloginline + line(std::string line)clutchloginline + locate(const level &stage, const std::string &file, const std::string &func, const size_t line) constclutchloginline + location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")clutchloginline + log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) constclutchloginline + logger()clutchloginlinestatic + note enum value (defined in clutchlog)clutchlog + operator=(clutchlog const &)=delete (defined in clutchlog)clutchlog + out(std::ostream &out)clutchloginline + out()clutchloginline + progress enum value (defined in clutchlog)clutchlog + replace(const std::string &form, const std::string &mark, const std::string &tag) constclutchloginline + replace(const std::string &form, const std::string &mark, const size_t tag) constclutchloginline + style(level stage, FMT... styles)clutchloginline + style(level stage, fmt style)clutchloginline + style(level stage) constclutchloginline + threshold(level l)clutchloginline + threshold(const std::string &l)clutchloginline + threshold() constclutchloginline + warning enum value (defined in clutchlog)clutchlog + xdebug enum value (defined in clutchlog)clutchlog diff --git a/docs/classclutchlog.html b/docs/classclutchlog.html index c423188..4ea2c00 100644 --- a/docs/classclutchlog.html +++ b/docs/classclutchlog.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.11.1 +  0.12
@@ -226,13 +226,17 @@ static unsigned int  Number of call stack levels to remove from depth display by default.
 
-static char default_hfill_char = CLUTCHLOG_HFILL_MARK +static char default_hfill_char = CLUTCHLOG_DEFAULT_HFILL_MARK  Default character used as a filling for right-align the right part of messages with "{hfill}".
  -static size_t default_hfill_max = CLUTCHLOG_HFILL_MAX - Default maximum number of character used as a filling for right-align the right part of messages with "{hfill}".
+static size_t default_hfill_max = CLUTCHLOG_DEFAULT_HFILL_MAX + Default maximum width (number of characters) for which to fill for right-aligning the right part of messages (using "{hfill}").
  + +static size_t default_hfill_min = CLUTCHLOG_DEFAULT_HFILL_MIN + Default minimum width (number of characters) at which to fill for right-aligning the right part of messages (using "{hfill}").
+  @@ -346,7 +350,7 @@ void  diff --git a/docs/classclutchlog_1_1fmt.html b/docs/classclutchlog_1_1fmt.html index 4fc7db5..fe445ce 100644 --- a/docs/classclutchlog_1_1fmt.html +++ b/docs/classclutchlog_1_1fmt.html @@ -28,7 +28,7 @@ @@ -104,7 +104,7 @@ $(document).ready(function(){initNavTree('classclutchlog_1_1fmt.html',''); initR

Color and style formatter for ANSI terminal escape sequences.

Note
All styles may not be supported by a given terminal/operating system.
-

Definition at line 309 of file clutchlog.h.

+

Definition at line 314 of file clutchlog.h.

Classes

operator= (Get the logger instance.

-

Definition at line 291 of file clutchlog.h.

+

Definition at line 296 of file clutchlog.h.

@@ -377,11 +381,11 @@ void 
operator= (Return the log level tag corresponding to the given pre-configured name.

Note
This is case sensitive, see the pre-configured _level_word.
-

Definition at line 606 of file clutchlog.h.

+

Definition at line 618 of file clutchlog.h.

-

References _word_level.

+

References _word_level.

-

Referenced by threshold().

+

Referenced by threshold().

@@ -424,11 +428,11 @@ template<class ... FMT>

Set the style (color and typo) of the given log level.

This version accept style arguments as if they were passed to clutchlog::fmt.

-

Definition at line 640 of file clutchlog.h.

+

Definition at line 652 of file clutchlog.h.

-

References style().

+

References style().

-

Referenced by style().

+

Referenced by style().

@@ -476,9 +480,9 @@ template<class ... FMT>
log.replace("{greet} {world}", "\\{greet\\}", "hello");
// returns "hello {world}"
-

Definition at line 729 of file clutchlog.h.

+

Definition at line 741 of file clutchlog.h.

-

Referenced by dump(), format(), and replace().

+

Referenced by dump(), format(), and replace().

@@ -487,8 +491,8 @@ template<class ... FMT> -
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:891
-
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:291
+
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:903
+
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:296
clutchlog -  0.11.1 +  0.12
clutchlog -  0.11.1 +  0.12
@@ -243,9 +243,9 @@ Friends
std::cout << error("ERROR") << std::endl;
Note
A formatter called this way WILL output a reset escape code at the end.
-

Definition at line 406 of file clutchlog.h.

+

Definition at line 411 of file clutchlog.h.

-

References print_on().

+

References print_on().

@@ -290,7 +290,7 @@ Friends
std::cout << error << "ERROR" << end << std::endl;
Note
An formatter called this way will NOT output a reset escape code.
-

Definition at line 391 of file clutchlog.h.

+

Definition at line 396 of file clutchlog.h.

@@ -299,7 +299,7 @@ Friends -
Color and style formatter for ANSI terminal escape sequences.
Definition: clutchlog.h:309
+
Color and style formatter for ANSI terminal escape sequences.
Definition: clutchlog.h:314
diff --git a/docs/clutchlog_8h.html b/docs/clutchlog_8h.html index fe514a5..cef3212 100644 --- a/docs/clutchlog_8h.html +++ b/docs/clutchlog_8h.html @@ -28,7 +28,7 @@ @@ -190,10 +190,10 @@ Macros #define  - - - + + +

Public Member Functions

clutchlog -  0.11.1 +  0.12
clutchlog -  0.11.1 +  0.12
CLUTCHLOG_STRIP_CALLS   5
 Compile-time number of call stack levels to remove from depth display by default.
 
-#define CLUTCHLOG_HFILL_MARK   '.'
 Character used as a filling for right-align the right part of messages with "{hfill}".
 
+#define CLUTCHLOG_DEFAULT_HFILL_MARK   '.'
 Character used as a filling for right-align the right part of messages with "{hfill}".
 
diff --git a/docs/clutchlog_8h.js b/docs/clutchlog_8h.js index fdaabbb..05cb530 100644 --- a/docs/clutchlog_8h.js +++ b/docs/clutchlog_8h.js @@ -16,5 +16,5 @@ var clutchlog_8h = [ "CLUTCHDUMP_DEFAULT_SEP", "group___default_config.html#ga54d29e956575e1c731eab5406135c5df", null ], [ "CLUTCHLOG_DEFAULT_DEPTH_MARK", "group___default_config.html#ga45c4c964fad4ad1641d5c9c28c4645b9", null ], [ "CLUTCHLOG_STRIP_CALLS", "group___default_config.html#ga98f30d814d4913a8a7c93a8793f49adf", null ], - [ "CLUTCHLOG_HFILL_MARK", "group___default_config.html#gad5fbbacf74b8e4669b8f9efdfe81bd25", null ] + [ "CLUTCHLOG_DEFAULT_HFILL_MARK", "group___default_config.html#ga4eda0c1bfded5df89351b8ce8b9c2805", null ] ]; \ No newline at end of file diff --git a/docs/clutchlog_8h_source.html b/docs/clutchlog_8h_source.html index 72c011a..a58c8ef 100644 --- a/docs/clutchlog_8h_source.html +++ b/docs/clutchlog_8h_source.html @@ -28,7 +28,7 @@ Logo
clutchlog -  0.11.1 +  0.12
@@ -301,800 +301,811 @@ $(document).ready(function(){initNavTree('clutchlog_8h_source.html',''); initRes
254  #endif // CLUTCHLOG_STRIP_CALLS
255  static inline unsigned int default_strip_calls = CLUTCHLOG_STRIP_CALLS;
257 
-
258  #ifndef CLUTCHLOG_HFILL_MARK
-
259  #define CLUTCHLOG_HFILL_MARK '.'
-
261  #endif // CLUTCHLOG_HFILL_MARK
-
262  static inline char default_hfill_char = CLUTCHLOG_HFILL_MARK;
+
258  #ifndef CLUTCHLOG_DEFAULT_HFILL_MARK
+
259  #define CLUTCHLOG_DEFAULT_HFILL_MARK '.'
+
261  #endif // CLUTCHLOG_DEFAULT_HFILL_MARK
+
262  static inline char default_hfill_char = CLUTCHLOG_DEFAULT_HFILL_MARK;
264 
265 
266  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
-
267  #ifndef CLUTCHLOG_HFILL_MAX
-
268  #define CLUTCHLOG_HFILL_MAX 300
+
267  #ifndef CLUTCHLOG_DEFAULT_HFILL_MAX
+
268  #define CLUTCHLOG_DEFAULT_HFILL_MAX 300
269  #endif
-
270  #endif
-
271  static inline size_t default_hfill_max = CLUTCHLOG_HFILL_MAX;
-
273 
-
274  // NOTE: there is no CLUTCHLOG_HFILL_STYLE for defaulting,
-
275  // but you can still set `hfill_style(...)` on the logger singleton.
-
276  /* @} DefaultConfig */
-
277  /* @} */
+
270  #ifndef CLUTCHLOG_DEFAULT_HFILL_MIN
+
271  #define CLUTCHLOG_DEFAULT_HFILL_MIN 150
+
272  #endif
+
273  #endif
+
274  static inline size_t default_hfill_max = CLUTCHLOG_DEFAULT_HFILL_MAX;
+
277  static inline size_t default_hfill_min = CLUTCHLOG_DEFAULT_HFILL_MIN;
278 
-
279 
-
280  public:
-
281 
-
291  static clutchlog& logger()
-
292  {
-
293  static clutchlog instance;
-
294  return instance;
-
295  }
-
296 
-
298  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
-
299 
-
309  class fmt {
-
310  public:
-
312  enum class fg {
-
313  black = 30,
-
314  red = 31,
-
315  green = 32,
-
316  yellow = 33,
-
317  blue = 34,
-
318  magenta = 35,
-
319  cyan = 36,
-
320  white = 37,
-
321  none
-
322  } fore;
-
323 
-
325  enum class bg {
-
326  black = 40,
-
327  red = 41,
-
328  green = 42,
-
329  yellow = 43,
-
330  blue = 44,
-
331  magenta = 45,
-
332  cyan = 46,
-
333  white = 47,
-
334  none
-
335  } back;
-
336 
-
338  enum class typo {
-
339  reset = 0,
-
340  bold = 1,
-
341  underline = 4,
-
342  inverse = 7,
-
343  none
-
344  } style;
-
345 
-
347  fmt() : fore(fg::none), back(bg::none), style(typo::none) {}
-
348 
-
351  fmt( fg f, bg b = bg::none, typo s = typo::none) : fore(f), back(b), style(s) {}
-
352  fmt( fg f, typo s , bg b = bg::none) : fore(f), back(b), style(s) {}
-
353  fmt( bg b, fg f = fg::none, typo s = typo::none) : fore(f), back(b), style(s) {}
-
354  fmt( bg b, typo s , fg f = fg::none) : fore(f), back(b), style(s) {}
-
355  fmt(typo s, fg f = fg::none, bg b = bg::none) : fore(f), back(b), style(s) {}
-
356  fmt(typo s, bg b , fg f = fg::none) : fore(f), back(b), style(s) {}
-
359  protected:
-
361  std::ostream& print_on( std::ostream& os) const
-
362  {
-
363  std::vector<int> codes; codes.reserve(3);
-
364  if(this->fore != fg::none) { codes.push_back(static_cast<int>(this->fore ));}
-
365  if(this->back != bg::none) { codes.push_back(static_cast<int>(this->back ));}
-
366  if(this->style != typo::none) { codes.push_back(static_cast<int>(this->style));}
-
367  if(codes.size() == 0) {return os;}
-
368 
-
369  os << "\033[";
-
370  assert(codes.size() > 0);
-
371  os << codes[0];
-
372  for(size_t i=1; i < codes.size(); ++i) {
-
373  os << ";" << codes[i];
-
374  }
-
375  os << "m";
-
376  return os;
-
377  }
-
378 
-
379  public:
-
391  friend std::ostream& operator<<(std::ostream& os, const fmt& fmt)
-
392  {
-
393  return fmt.print_on(os);
-
394  }
-
395 
-
406  std::string operator()( const std::string& msg ) const
-
407  {
-
408  std::ostringstream os;
-
409  this->print_on(os);
-
410  fmt reset(fmt::typo::reset);
-
411  os << msg;
-
412  reset.print_on(os);
-
413  return os.str();
-
414  }
-
415 
-
418  std::string str() const
-
419  {
-
420  std::ostringstream os;
-
421  this->print_on(os);
-
422  return os.str();
-
423  }
-
424  }; // fmt class
-
425 
-
431  public:
-
432  clutchlog(clutchlog const&) = delete;
-
433  void operator=(clutchlog const&) = delete;
-
434 
-
435  private:
-
436  clutchlog() :
-
437  // system, main, log
-
438  _strip_calls(clutchlog::default_strip_calls),
-
439  _level_word({
-
440  {level::critical,"Critical"},
-
441  {level::error ,"Error"},
-
442  {level::warning ,"Warning"},
-
443  {level::progress,"Progress"},
-
444  {level::note ,"Note"},
-
445  {level::info ,"Info"},
-
446  {level::debug ,"Debug"},
-
447  {level::xdebug ,"XDebug"}
-
448  }),
-
449  _level_fmt({
-
450  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
-
451  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
-
452  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
-
453  {level::progress,fmt()},
-
454  {level::note ,fmt()},
-
455  {level::info ,fmt()},
-
456  {level::debug ,fmt()},
-
457  {level::xdebug ,fmt()}
-
458  }),
-
459  _format_log(clutchlog::default_format),
-
460  _format_dump(clutchlog::dump_default_format),
-
461  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
462  _hfill_char(clutchlog::default_hfill_char),
-
463  _hfill_fmt(fmt::fg::none),
-
464  _hfill_max(clutchlog::default_hfill_max),
-
465  #endif
-
466  _out(&std::clog),
-
467  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
468  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
-
469  _depth_mark(clutchlog::default_depth_mark),
-
470  #endif
-
471  _stage(level::error),
-
472  _in_file(".*"),
-
473  _in_func(".*"),
-
474  _in_line(".*")
-
475  {
-
476  // Reverse the level->word map into a word->level map.
-
477  for(auto& lw : _level_word) {
-
478  _word_level[lw.second] = lw.first;
-
479  }
-
480 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
481  struct winsize w;
-
482  ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
-
483  _nb_columns = std::min((size_t)w.ws_col, default_hfill_max);
-
484 #endif
-
485  }
-
486 
-
487  protected:
-
489  size_t _strip_calls;
-
491  const std::map<level,std::string> _level_word;
-
493  std::map<std::string,level> _word_level;
-
495  std::map<level,fmt> _level_fmt;
-
497  std::string _format_log;
-
499  std::string _format_dump;
-
500  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
501 
-
502  char _hfill_char;
-
504  fmt _hfill_fmt;
-
506  size_t _hfill_max;
-
507  #endif
-
508 
-
509  std::ostream* _out;
-
510  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
511 
-
512  size_t _depth;
-
514  std::string _depth_mark;
+
279  // NOTE: there is no CLUTCHLOG_HFILL_STYLE for defaulting,
+
280  // but you can still set `hfill_style(...)` on the logger singleton.
+
281  /* @} DefaultConfig */
+
282  /* @} */
+
283 
+
284 
+
285  public:
+
286 
+
296  static clutchlog& logger()
+
297  {
+
298  static clutchlog instance;
+
299  return instance;
+
300  }
+
301 
+
303  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
+
304 
+
314  class fmt {
+
315  public:
+
317  enum class fg {
+
318  black = 30,
+
319  red = 31,
+
320  green = 32,
+
321  yellow = 33,
+
322  blue = 34,
+
323  magenta = 35,
+
324  cyan = 36,
+
325  white = 37,
+
326  none
+
327  } fore;
+
328 
+
330  enum class bg {
+
331  black = 40,
+
332  red = 41,
+
333  green = 42,
+
334  yellow = 43,
+
335  blue = 44,
+
336  magenta = 45,
+
337  cyan = 46,
+
338  white = 47,
+
339  none
+
340  } back;
+
341 
+
343  enum class typo {
+
344  reset = 0,
+
345  bold = 1,
+
346  underline = 4,
+
347  inverse = 7,
+
348  none
+
349  } style;
+
350 
+
352  fmt() : fore(fg::none), back(bg::none), style(typo::none) {}
+
353 
+
356  fmt( fg f, bg b = bg::none, typo s = typo::none) : fore(f), back(b), style(s) {}
+
357  fmt( fg f, typo s , bg b = bg::none) : fore(f), back(b), style(s) {}
+
358  fmt( bg b, fg f = fg::none, typo s = typo::none) : fore(f), back(b), style(s) {}
+
359  fmt( bg b, typo s , fg f = fg::none) : fore(f), back(b), style(s) {}
+
360  fmt(typo s, fg f = fg::none, bg b = bg::none) : fore(f), back(b), style(s) {}
+
361  fmt(typo s, bg b , fg f = fg::none) : fore(f), back(b), style(s) {}
+
364  protected:
+
366  std::ostream& print_on( std::ostream& os) const
+
367  {
+
368  std::vector<int> codes; codes.reserve(3);
+
369  if(this->fore != fg::none) { codes.push_back(static_cast<int>(this->fore ));}
+
370  if(this->back != bg::none) { codes.push_back(static_cast<int>(this->back ));}
+
371  if(this->style != typo::none) { codes.push_back(static_cast<int>(this->style));}
+
372  if(codes.size() == 0) {return os;}
+
373 
+
374  os << "\033[";
+
375  assert(codes.size() > 0);
+
376  os << codes[0];
+
377  for(size_t i=1; i < codes.size(); ++i) {
+
378  os << ";" << codes[i];
+
379  }
+
380  os << "m";
+
381  return os;
+
382  }
+
383 
+
384  public:
+
396  friend std::ostream& operator<<(std::ostream& os, const fmt& fmt)
+
397  {
+
398  return fmt.print_on(os);
+
399  }
+
400 
+
411  std::string operator()( const std::string& msg ) const
+
412  {
+
413  std::ostringstream os;
+
414  this->print_on(os);
+
415  fmt reset(fmt::typo::reset);
+
416  os << msg;
+
417  reset.print_on(os);
+
418  return os.str();
+
419  }
+
420 
+
423  std::string str() const
+
424  {
+
425  std::ostringstream os;
+
426  this->print_on(os);
+
427  return os.str();
+
428  }
+
429  }; // fmt class
+
430 
+
436  public:
+
437  clutchlog(clutchlog const&) = delete;
+
438  void operator=(clutchlog const&) = delete;
+
439 
+
440  private:
+
441  clutchlog() :
+
442  // system, main, log
+
443  _strip_calls(clutchlog::default_strip_calls),
+
444  _level_word({
+
445  {level::critical,"Critical"},
+
446  {level::error ,"Error"},
+
447  {level::warning ,"Warning"},
+
448  {level::progress,"Progress"},
+
449  {level::note ,"Note"},
+
450  {level::info ,"Info"},
+
451  {level::debug ,"Debug"},
+
452  {level::xdebug ,"XDebug"}
+
453  }),
+
454  _level_fmt({
+
455  {level::critical,fmt(fmt::fg::red, fmt::typo::underline)},
+
456  {level::error ,fmt(fmt::fg::red, fmt::typo::bold)},
+
457  {level::warning ,fmt(fmt::fg::magenta, fmt::typo::bold)},
+
458  {level::progress,fmt()},
+
459  {level::note ,fmt()},
+
460  {level::info ,fmt()},
+
461  {level::debug ,fmt()},
+
462  {level::xdebug ,fmt()}
+
463  }),
+
464  _format_log(clutchlog::default_format),
+
465  _format_dump(clutchlog::dump_default_format),
+
466  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
467  _hfill_char(clutchlog::default_hfill_char),
+
468  _hfill_fmt(fmt::fg::none),
+
469  _hfill_max(clutchlog::default_hfill_max),
+
470  _hfill_min(clutchlog::default_hfill_min),
+
471  #endif
+
472  _out(&std::clog),
+
473  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
474  _depth(std::numeric_limits<size_t>::max() - _strip_calls),
+
475  _depth_mark(clutchlog::default_depth_mark),
+
476  #endif
+
477  _stage(level::error),
+
478  _in_file(".*"),
+
479  _in_func(".*"),
+
480  _in_line(".*")
+
481  {
+
482  // Reverse the level->word map into a word->level map.
+
483  for(auto& lw : _level_word) {
+
484  _word_level[lw.second] = lw.first;
+
485  }
+
486 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
487  struct winsize w;
+
488  ioctl(STDERR_FILENO, TIOCGWINSZ, &w);
+
489  _nb_columns = std::max(std::min((size_t)w.ws_col, default_hfill_max), default_hfill_min);
+
490 #endif
+
491  }
+
492 
+
493  protected:
+
495  size_t _strip_calls;
+
497  const std::map<level,std::string> _level_word;
+
499  std::map<std::string,level> _word_level;
+
501  std::map<level,fmt> _level_fmt;
+
503  std::string _format_log;
+
505  std::string _format_dump;
+
506  #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
507 
+
508  char _hfill_char;
+
510  fmt _hfill_fmt;
+
512  size_t _hfill_max;
+
514  size_t _hfill_min;
515  #endif
516 
-
517  level _stage;
-
519  std::regex _in_file;
-
521  std::regex _in_func;
-
523  std::regex _in_line;
+
517  std::ostream* _out;
+
518  #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
519 
+
520  size_t _depth;
+
522  std::string _depth_mark;
+
523  #endif
524 
-
525 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
526 
-
527  static const size_t _max_buffer = 4096;
-
528 #endif
-
529 
-
530 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
531 
-
532  size_t _nb_columns;
-
533 #endif
+
525  level _stage;
+
527  std::regex _in_file;
+
529  std::regex _in_func;
+
531  std::regex _in_line;
+
532 
+
533 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
534 
-
536  public:
+
535  static const size_t _max_buffer = 4096;
+
536 #endif
537 
-
541  void format(const std::string& format) {_format_log = format;}
-
544  std::string format() const {return _format_log;}
+
538 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
539 
+
540  size_t _nb_columns;
+
541 #endif
+
542 
+
544  public:
545 
-
547  void format_comment(const std::string& format) {_format_dump = format;}
-
549  std::string format_comment() const {return _format_dump;}
-
550 
-
552  void out(std::ostream& out) {_out = &out;}
-
554  std::ostream& out() {return *_out;}
-
555 
-
556 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
557  void depth(size_t d) {_depth = d;}
-
560  size_t depth() const {return _depth;}
-
561 
-
563  void depth_mark(const std::string mark) {_depth_mark = mark;}
-
565  std::string depth_mark() const {return _depth_mark;}
-
566 
-
568  void strip_calls(const size_t n) {_strip_calls = n;}
-
570  size_t strip_calls() const {return _strip_calls;}
-
571 #endif
-
572 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
-
573  void hfill_mark(const char mark) {_hfill_char = mark;}
-
576  char hfill_mark() const {return _hfill_char;}
-
578  void hfill_style(fmt style) {_hfill_fmt = style;}
-
583  template<class ... FMT>
-
584  void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
-
586  fmt hfill_style() const {return _hfill_fmt;}
-
588  void hfill_max(const size_t nmax) {_hfill_max = nmax;}
-
590  size_t hfill_max() {return _hfill_max;}
-
591 #endif
-
592 
-
594  void threshold(level l) {_stage = l;}
-
596  void threshold(const std::string& l) {_stage = this->level_of(l);}
-
598  level threshold() const {return _stage;}
-
600  const std::map<std::string,level>& levels() const { return _word_level;}
-
601 
-
606  level level_of(const std::string name)
-
607  {
-
608  const auto ilevel = _word_level.find(name);
-
609  if( ilevel != std::end(_word_level)) {
-
610  return ilevel->second;
-
611  } else {
-
612  throw std::out_of_range("'" + name + "' is not a valid log level name");
-
613  }
-
614  }
-
615 
-
617  void file(std::string file) {_in_file = file;}
-
619  void func(std::string func) {_in_func = func;}
-
621  void line(std::string line) {_in_line = line;}
-
622 
-
624  void location(
-
625  const std::string& in_file,
-
626  const std::string& in_function=".*",
-
627  const std::string& in_line=".*"
-
628  )
-
629  {
-
630  file(in_file);
-
631  func(in_function);
-
632  line(in_line);
-
633  }
+
549  void format(const std::string& format) {_format_log = format;}
+
552  std::string format() const {return _format_log;}
+
553 
+
555  void format_comment(const std::string& format) {_format_dump = format;}
+
557  std::string format_comment() const {return _format_dump;}
+
558 
+
560  void out(std::ostream& out) {_out = &out;}
+
562  std::ostream& out() {return *_out;}
+
563 
+
564 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
565  void depth(size_t d) {_depth = d;}
+
568  size_t depth() const {return _depth;}
+
569 
+
571  void depth_mark(const std::string mark) {_depth_mark = mark;}
+
573  std::string depth_mark() const {return _depth_mark;}
+
574 
+
576  void strip_calls(const size_t n) {_strip_calls = n;}
+
578  size_t strip_calls() const {return _strip_calls;}
+
579 #endif
+
580 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
+
581  void hfill_mark(const char mark) {_hfill_char = mark;}
+
584  char hfill_mark() const {return _hfill_char;}
+
586  void hfill_style(fmt style) {_hfill_fmt = style;}
+
591  template<class ... FMT>
+
592  void hfill_style(FMT... styles) { this->hfill_style(fmt(styles...)); }
+
594  fmt hfill_style() const {return _hfill_fmt;}
+
596  void hfill_max(const size_t nmax) {_hfill_max = nmax;}
+
598  size_t hfill_max() {return _hfill_max;}
+
600  void hfill_min(const size_t nmin) {_hfill_min = nmin;}
+
602  size_t hfill_min() {return _hfill_min;}
+
603 #endif
+
604 
+
606  void threshold(level l) {_stage = l;}
+
608  void threshold(const std::string& l) {_stage = this->level_of(l);}
+
610  level threshold() const {return _stage;}
+
612  const std::map<std::string,level>& levels() const { return _word_level;}
+
613 
+
618  level level_of(const std::string name)
+
619  {
+
620  const auto ilevel = _word_level.find(name);
+
621  if( ilevel != std::end(_word_level)) {
+
622  return ilevel->second;
+
623  } else {
+
624  throw std::out_of_range("'" + name + "' is not a valid log level name");
+
625  }
+
626  }
+
627 
+
629  void file(std::string file) {_in_file = file;}
+
631  void func(std::string func) {_in_func = func;}
+
633  void line(std::string line) {_in_line = line;}
634 
-
639  template<class ... FMT>
-
640  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
-
642  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
-
644  fmt style(level stage) const { return _level_fmt.at(stage); }
-
645 
-
648  public:
-
649 
-
653  struct scope_t {
-
656  bool matches;
-
658  level stage;
-
659 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
660 
-
661  size_t depth;
-
662 #endif
-
663 
-
664  bool there;
-
666  scope_t() :
-
667  matches(false),
-
668  stage(level::xdebug),
-
669 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
670  depth(0),
-
671 #endif
-
672  there(false)
-
673  {}
-
674  }; // scope_t
+
636  void location(
+
637  const std::string& in_file,
+
638  const std::string& in_function=".*",
+
639  const std::string& in_line=".*"
+
640  )
+
641  {
+
642  file(in_file);
+
643  func(in_function);
+
644  line(in_line);
+
645  }
+
646 
+
651  template<class ... FMT>
+
652  void style(level stage, FMT... styles) { this->style(stage,fmt(styles...)); }
+
654  void style(level stage, fmt style) { _level_fmt.at(stage) = style; }
+
656  fmt style(level stage) const { return _level_fmt.at(stage); }
+
657 
+
660  public:
+
661 
+
665  struct scope_t {
+
668  bool matches;
+
670  level stage;
+
671 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
672 
+
673  size_t depth;
+
674 #endif
675 
-
676 
-
678  scope_t locate(
-
679  const level& stage,
-
680  const std::string& file,
-
681  const std::string& func,
-
682  const size_t line
-
683  ) const
-
684  {
-
685  scope_t scope; // False scope by default.
-
686 
-
687  /***** Log level stage *****/
-
688  // Test stage first, because it's fastest.
-
689  scope.stage = stage;
-
690  if(not (scope.stage <= _stage)) {
-
691  // Bypass useless computations if no match
-
692  // because of the stage.
-
693  return scope;
-
694  }
-
695 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
696  /***** Stack depth *****/
-
697  // Backtrace in second, quite fast.
-
698  size_t stack_depth;
-
699  void *buffer[_max_buffer];
-
700  stack_depth = backtrace(buffer, _max_buffer);
-
701  scope.depth = stack_depth;
-
702  if(not (scope.depth <= _depth + _strip_calls)) {
-
703  // Bypass if no match.
-
704  return scope;
-
705  }
-
706 #endif
-
707 
-
708  /***** Location *****/
-
709  // Location last, slowest.
-
710  std::ostringstream sline; sline << line;
-
711  scope.there =
-
712  std::regex_search(file, _in_file)
-
713  and std::regex_search(func, _in_func)
-
714  and std::regex_search(sline.str(), _in_line);
-
715 
-
716  // No need to retest stage and depth, which are true here.
-
717  scope.matches = scope.there;
-
718 
-
719  return scope;
-
720  } // locate
-
721 
-
729  std::string replace(
-
730  const std::string& form,
-
731  const std::string& mark,
-
732  const std::string& tag
-
733  ) const
-
734  {
-
735  // Useless debug code, unless something fancy would be done with name tags.
-
736  // std::regex re;
-
737  // try {
-
738  // re = std::regex(mark);
-
739  //
-
740  // } catch(const std::regex_error& e) {
-
741  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
-
742  // switch(e.code()) {
-
743  // case std::regex_constants::error_collate:
-
744  // std::cerr << "the expression contains an invalid collating element name";
-
745  // break;
-
746  // case std::regex_constants::error_ctype:
-
747  // std::cerr << "the expression contains an invalid character class name";
-
748  // break;
-
749  // case std::regex_constants::error_escape:
-
750  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
-
751  // break;
-
752  // case std::regex_constants::error_backref:
-
753  // std::cerr << "the expression contains an invalid back reference";
-
754  // break;
-
755  // case std::regex_constants::error_brack:
-
756  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
+
676  bool there;
+
678  scope_t() :
+
679  matches(false),
+
680  stage(level::xdebug),
+
681 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
682  depth(0),
+
683 #endif
+
684  there(false)
+
685  {}
+
686  }; // scope_t
+
687 
+
688 
+
690  scope_t locate(
+
691  const level& stage,
+
692  const std::string& file,
+
693  const std::string& func,
+
694  const size_t line
+
695  ) const
+
696  {
+
697  scope_t scope; // False scope by default.
+
698 
+
699  /***** Log level stage *****/
+
700  // Test stage first, because it's fastest.
+
701  scope.stage = stage;
+
702  if(not (scope.stage <= _stage)) {
+
703  // Bypass useless computations if no match
+
704  // because of the stage.
+
705  return scope;
+
706  }
+
707 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
708  /***** Stack depth *****/
+
709  // Backtrace in second, quite fast.
+
710  size_t stack_depth;
+
711  void *buffer[_max_buffer];
+
712  stack_depth = backtrace(buffer, _max_buffer);
+
713  scope.depth = stack_depth;
+
714  if(not (scope.depth <= _depth + _strip_calls)) {
+
715  // Bypass if no match.
+
716  return scope;
+
717  }
+
718 #endif
+
719 
+
720  /***** Location *****/
+
721  // Location last, slowest.
+
722  std::ostringstream sline; sline << line;
+
723  scope.there =
+
724  std::regex_search(file, _in_file)
+
725  and std::regex_search(func, _in_func)
+
726  and std::regex_search(sline.str(), _in_line);
+
727 
+
728  // No need to retest stage and depth, which are true here.
+
729  scope.matches = scope.there;
+
730 
+
731  return scope;
+
732  } // locate
+
733 
+
741  std::string replace(
+
742  const std::string& form,
+
743  const std::string& mark,
+
744  const std::string& tag
+
745  ) const
+
746  {
+
747  // Useless debug code, unless something fancy would be done with name tags.
+
748  // std::regex re;
+
749  // try {
+
750  // re = std::regex(mark);
+
751  //
+
752  // } catch(const std::regex_error& e) {
+
753  // std::cerr << "ERROR with a regular expression \"" << mark << "\": ";
+
754  // switch(e.code()) {
+
755  // case std::regex_constants::error_collate:
+
756  // std::cerr << "the expression contains an invalid collating element name";
757  // break;
-
758  // case std::regex_constants::error_paren:
-
759  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
+
758  // case std::regex_constants::error_ctype:
+
759  // std::cerr << "the expression contains an invalid character class name";
760  // break;
-
761  // case std::regex_constants::error_brace:
-
762  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
+
761  // case std::regex_constants::error_escape:
+
762  // std::cerr << "the expression contains an invalid escaped character or a trailing escape";
763  // break;
-
764  // case std::regex_constants::error_badbrace:
-
765  // std::cerr << "the expression contains an invalid range in a {} expression";
+
764  // case std::regex_constants::error_backref:
+
765  // std::cerr << "the expression contains an invalid back reference";
766  // break;
-
767  // case std::regex_constants::error_range:
-
768  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
+
767  // case std::regex_constants::error_brack:
+
768  // std::cerr << "the expression contains mismatched square brackets ('[' and ']')";
769  // break;
-
770  // case std::regex_constants::error_space:
-
771  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
+
770  // case std::regex_constants::error_paren:
+
771  // std::cerr << "the expression contains mismatched parentheses ('(' and ')')";
772  // break;
-
773  // case std::regex_constants::error_badrepeat:
-
774  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
+
773  // case std::regex_constants::error_brace:
+
774  // std::cerr << "the expression contains mismatched curly braces ('{' and '}')";
775  // break;
-
776  // case std::regex_constants::error_complexity:
-
777  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
+
776  // case std::regex_constants::error_badbrace:
+
777  // std::cerr << "the expression contains an invalid range in a {} expression";
778  // break;
-
779  // case std::regex_constants::error_stack:
-
780  // std::cerr << "there was not enough memory to perform a match";
+
779  // case std::regex_constants::error_range:
+
780  // std::cerr << "the expression contains an invalid character range (e.g. [b-a])";
781  // break;
-
782  // default:
-
783  // std::cerr << "unknown error";
-
784  // }
-
785  // std::cerr << std::endl;
-
786  // throw;
-
787  // } // catch
-
788 
-
789  const std::regex re(mark);
-
790  return std::regex_replace(form, re, tag);
-
791  }
-
792 
-
794  std::string replace(
-
795  const std::string& form,
-
796  const std::string& mark,
-
797  const size_t tag
-
798  ) const
-
799  {
-
800  std::ostringstream stag; stag << tag;
-
801  return replace(form, mark, stag.str());
-
802  }
-
803 
-
805  std::string format(
-
806  std::string row,
-
807  const std::string& what,
-
808 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
809  const std::string& name,
-
810 #endif
-
811  const level& stage,
-
812  const std::string& file,
-
813  const std::string& func,
-
814  const size_t line
-
815 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
816  ,
-
817  const size_t depth
-
818 #endif
-
819  ) const
-
820  {
-
821  row = replace(row, "\\{msg\\}", what);
-
822  row = replace(row, "\\{file\\}", file);
-
823  row = replace(row, "\\{func\\}", func);
-
824  row = replace(row, "\\{line\\}", line);
-
825 
-
826  row = replace(row, "\\{level\\}", _level_word.at(stage));
-
827  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
-
828  row = replace(row, "\\{level_letter\\}", letter);
-
829 
-
830 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
831  row = replace(row, "\\{name\\}", name);
-
832  row = replace(row, "\\{depth\\}", depth - _strip_calls);
-
833 
-
834  std::ostringstream chevrons;
-
835  for(size_t i = _strip_calls; i < depth; ++i) {
-
836  chevrons << _depth_mark;
-
837  }
-
838  row = replace(row, "\\{depth_marks\\}", chevrons.str());
-
839 #endif
-
840 
-
841  row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str());
-
842 
-
843 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
-
844  // hfill is replaced last to allow for correct line width estimation.
-
845  const std::string raw_row = replace(row, "\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", "");
-
846  const std::string hfill_tag = "{hfill}";
-
847  const size_t hfill_pos = row.find(hfill_tag);
-
848  const size_t raw_hfill_pos = raw_row.find(hfill_tag);
-
849  const size_t nb_columns = std::min(_nb_columns, _hfill_max);
-
850  if(hfill_pos != std::string::npos) {
-
851  assert(raw_hfill_pos != std::string::npos);
-
852  if(nb_columns > 0) {
-
853  const size_t left_len = raw_hfill_pos;
-
854  const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
-
855  if(right_len+left_len > nb_columns) {
-
856  // The right part would go over the terminal width: add a new row.
-
857  if(right_len < nb_columns) {
-
858  // There is room for the right part on a new line.
-
859  const std::string hfill(std::max((size_t)0, nb_columns-right_len), _hfill_char);
-
860  const std::string hfill_styled = _hfill_fmt(hfill);
-
861  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
-
862  } else {
-
863  // Right part still goes over columns: let it go.
-
864  const std::string hfill(1, _hfill_char);
-
865  const std::string hfill_styled = _hfill_fmt(hfill);
-
866  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
-
867  }
-
868  } else {
-
869  // There is some space in between left and right parts.
-
870  const std::string hfill(std::max((size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
-
871  const std::string hfill_styled = _hfill_fmt(hfill);
-
872  row = replace(row, "\\{hfill\\}", hfill_styled);
-
873  }
-
874  } else {
-
875  // We don't know the terminal width.
-
876  const std::string hfill(1, _hfill_char);
-
877  const std::string hfill_styled = _hfill_fmt(hfill);
-
878  row = replace(row, "\\{hfill\\}", hfill_styled);
-
879  }
-
880  }
-
881 #else
-
882  // We cannot know the terminal width.
-
883  const std::string hfill(1, _hfill_char);
-
884  const std::string hfill_styled = _hfill_fmt(hfill);
-
885  row = replace(row, "\\{hfill\\}", hfill_styled);
-
886 #endif
-
887  return _level_fmt.at(stage)(row);
-
888  }
-
889 
-
891  void log(
-
892  const level& stage,
-
893  const std::string& what,
-
894  const std::string& file, const std::string& func, size_t line
-
895  ) const
-
896  {
-
897  scope_t scope = locate(stage, file, func, line);
-
898 
-
899  if(scope.matches) {
-
900 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
901  *_out << format(_format_log, what, basename(getenv("_")),
-
902  stage, file, func,
-
903  line, scope.depth );
-
904 #else
-
905  *_out << format(_format_log, what,
-
906  stage, file, func,
-
907  line );
-
908 
-
909 #endif
-
910  _out->flush();
-
911  } // if scopes.matches
-
912  }
-
913 
-
915  template<class In>
-
916  void dump(
-
917  const level& stage,
-
918  const In container_begin, const In container_end,
-
919  const std::string& file, const std::string& func, size_t line,
-
920  const std::string& filename_template = "dump_{n}.dat",
-
921  const std::string sep = dump_default_sep
-
922  ) const
-
923  {
-
924  scope_t scope = locate(stage, file, func, line);
+
782  // case std::regex_constants::error_space:
+
783  // std::cerr << "there was not enough memory to convert the expression into a finite state machine";
+
784  // break;
+
785  // case std::regex_constants::error_badrepeat:
+
786  // std::cerr << "one of *?+{ was not preceded by a valid regular expression";
+
787  // break;
+
788  // case std::regex_constants::error_complexity:
+
789  // std::cerr << "the complexity of an attempted match exceeded a predefined level";
+
790  // break;
+
791  // case std::regex_constants::error_stack:
+
792  // std::cerr << "there was not enough memory to perform a match";
+
793  // break;
+
794  // default:
+
795  // std::cerr << "unknown error";
+
796  // }
+
797  // std::cerr << std::endl;
+
798  // throw;
+
799  // } // catch
+
800 
+
801  const std::regex re(mark);
+
802  return std::regex_replace(form, re, tag);
+
803  }
+
804 
+
806  std::string replace(
+
807  const std::string& form,
+
808  const std::string& mark,
+
809  const size_t tag
+
810  ) const
+
811  {
+
812  std::ostringstream stag; stag << tag;
+
813  return replace(form, mark, stag.str());
+
814  }
+
815 
+
817  std::string format(
+
818  std::string row,
+
819  const std::string& what,
+
820 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
821  const std::string& name,
+
822 #endif
+
823  const level& stage,
+
824  const std::string& file,
+
825  const std::string& func,
+
826  const size_t line
+
827 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
828  ,
+
829  const size_t depth
+
830 #endif
+
831  ) const
+
832  {
+
833  row = replace(row, "\\{msg\\}", what);
+
834  row = replace(row, "\\{file\\}", file);
+
835  row = replace(row, "\\{func\\}", func);
+
836  row = replace(row, "\\{line\\}", line);
+
837 
+
838  row = replace(row, "\\{level\\}", _level_word.at(stage));
+
839  std::string letter(1, _level_word.at(stage).at(0)); // char -> string
+
840  row = replace(row, "\\{level_letter\\}", letter);
+
841 
+
842 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
843  row = replace(row, "\\{name\\}", name);
+
844  row = replace(row, "\\{depth\\}", depth - _strip_calls);
+
845 
+
846  std::ostringstream chevrons;
+
847  for(size_t i = _strip_calls; i < depth; ++i) {
+
848  chevrons << _depth_mark;
+
849  }
+
850  row = replace(row, "\\{depth_marks\\}", chevrons.str());
+
851 #endif
+
852 
+
853  row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str());
+
854 
+
855 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL
+
856  // hfill is replaced last to allow for correct line width estimation.
+
857  const std::string raw_row = replace(row, "\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", "");
+
858  const std::string hfill_tag = "{hfill}";
+
859  const size_t hfill_pos = row.find(hfill_tag);
+
860  const size_t raw_hfill_pos = raw_row.find(hfill_tag);
+
861  const size_t nb_columns = std::max(std::min((size_t)_nb_columns, _hfill_max), _hfill_min);
+
862  if(hfill_pos != std::string::npos) {
+
863  assert(raw_hfill_pos != std::string::npos);
+
864  if(nb_columns > 0) {
+
865  const size_t left_len = raw_hfill_pos;
+
866  const size_t right_len = raw_row.size() - raw_hfill_pos - hfill_tag.size();
+
867  if(right_len+left_len > nb_columns) {
+
868  // The right part would go over the terminal width: add a new row.
+
869  if(right_len < nb_columns) {
+
870  // There is room for the right part on a new line.
+
871  const std::string hfill(std::max((size_t)0, nb_columns-right_len), _hfill_char);
+
872  const std::string hfill_styled = _hfill_fmt(hfill);
+
873  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
+
874  } else {
+
875  // Right part still goes over columns: let it go.
+
876  const std::string hfill(1, _hfill_char);
+
877  const std::string hfill_styled = _hfill_fmt(hfill);
+
878  row = replace(row, "\\{hfill\\}", "\n"+hfill_styled);
+
879  }
+
880  } else {
+
881  // There is some space in between left and right parts.
+
882  const std::string hfill(std::max((size_t)0, nb_columns - (right_len+left_len)), _hfill_char);
+
883  const std::string hfill_styled = _hfill_fmt(hfill);
+
884  row = replace(row, "\\{hfill\\}", hfill_styled);
+
885  }
+
886  } else {
+
887  // We don't know the terminal width.
+
888  const std::string hfill(1, _hfill_char);
+
889  const std::string hfill_styled = _hfill_fmt(hfill);
+
890  row = replace(row, "\\{hfill\\}", hfill_styled);
+
891  }
+
892  }
+
893 #else
+
894  // We cannot know the terminal width.
+
895  const std::string hfill(1, _hfill_char);
+
896  const std::string hfill_styled = _hfill_fmt(hfill);
+
897  row = replace(row, "\\{hfill\\}", hfill_styled);
+
898 #endif
+
899  return _level_fmt.at(stage)(row);
+
900  }
+
901 
+
903  void log(
+
904  const level& stage,
+
905  const std::string& what,
+
906  const std::string& file, const std::string& func, size_t line
+
907  ) const
+
908  {
+
909  scope_t scope = locate(stage, file, func, line);
+
910 
+
911  if(scope.matches) {
+
912 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
913  *_out << format(_format_log, what, basename(getenv("_")),
+
914  stage, file, func,
+
915  line, scope.depth );
+
916 #else
+
917  *_out << format(_format_log, what,
+
918  stage, file, func,
+
919  line );
+
920 
+
921 #endif
+
922  _out->flush();
+
923  } // if scopes.matches
+
924  }
925 
-
926  if(scope.matches) {
-
927  const std::string tag = "\\{n\\}";
-
928  const std::regex re(tag);
-
929  std::string outfile = "";
-
930 
-
931  // If the file name template has the {n} tag.
-
932  if(std::regex_search(filename_template, re)) {
-
933  // Increment n until a free one is found.
-
934  size_t n = 0;
-
935  do {
-
936  outfile = replace(filename_template, tag, n);
-
937  n++;
-
938  } while( fs::exists( outfile ) );
-
939 
-
940  } else {
-
941  // Use the parameter as is.
-
942  outfile = filename_template;
-
943  }
-
944 
-
945  std::ofstream fd(outfile);
-
946 
-
947  if(_format_dump.size() > 0) {
-
948 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
949  fd << format(_format_dump, "", basename(getenv("_")),
-
950  stage, file, func,
-
951  line, scope.depth );
-
952 #else
-
953  fd << format(_format_dump, "",
-
954  stage, file, func,
-
955  line );
-
956 #endif
-
957  fd << sep; // sep after comment line.
-
958  }
-
959 
-
960  std::copy(container_begin, container_end,
-
961  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
-
962 
-
963  fd.close();
-
964  } // if scopes.matches
-
965  }
-
966 
-
968 };
-
969 
-
972 #else // not WITH_CLUTCHLOG
-
973 
+
927  template<class In>
+
928  void dump(
+
929  const level& stage,
+
930  const In container_begin, const In container_end,
+
931  const std::string& file, const std::string& func, size_t line,
+
932  const std::string& filename_template = "dump_{n}.dat",
+
933  const std::string sep = dump_default_sep
+
934  ) const
+
935  {
+
936  scope_t scope = locate(stage, file, func, line);
+
937 
+
938  if(scope.matches) {
+
939  const std::string tag = "\\{n\\}";
+
940  const std::regex re(tag);
+
941  std::string outfile = "";
+
942 
+
943  // If the file name template has the {n} tag.
+
944  if(std::regex_search(filename_template, re)) {
+
945  // Increment n until a free one is found.
+
946  size_t n = 0;
+
947  do {
+
948  outfile = replace(filename_template, tag, n);
+
949  n++;
+
950  } while( fs::exists( outfile ) );
+
951 
+
952  } else {
+
953  // Use the parameter as is.
+
954  outfile = filename_template;
+
955  }
+
956 
+
957  std::ofstream fd(outfile);
+
958 
+
959  if(_format_dump.size() > 0) {
+
960 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
961  fd << format(_format_dump, "", basename(getenv("_")),
+
962  stage, file, func,
+
963  line, scope.depth );
+
964 #else
+
965  fd << format(_format_dump, "",
+
966  stage, file, func,
+
967  line );
+
968 #endif
+
969  fd << sep; // sep after comment line.
+
970  }
+
971 
+
972  std::copy(container_begin, container_end,
+
973  std::ostream_iterator<typename In::value_type>(fd, sep.c_str()));
974 
-
975 /**********************************************************************
-
976  * Fake implementation
-
977  **********************************************************************/
+
975  fd.close();
+
976  } // if scopes.matches
+
977  }
978 
-
979 // Equivalent class with empty methods, will be optimized out
-
980 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
-
981 #pragma GCC diagnostic push
-
982 #pragma GCC diagnostic ignored "-Wreturn-type"
-
983 class clutchlog
-
984 {
-
985  public:
-
986  static clutchlog& logger() {}
-
987  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
-
988  class fmt {
-
989  public:
-
990  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, none } fore;
-
991  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, none } back;
-
992  enum class typo { reset, bold, underline, inverse, none } style;
-
993  fmt() : fore(fg::none), back(bg::none), style(typo::none) {}
-
994  fmt( fg f, bg b = bg::none, typo s = typo::none) : fore(f), back(b), style(s) {}
-
995  fmt( fg f, typo s , bg b = bg::none) : fore(f), back(b), style(s) {}
-
996  fmt( bg b, fg f = fg::none, typo s = typo::none) : fore(f), back(b), style(s) {}
-
997  fmt( bg b, typo s , fg f = fg::none) : fore(f), back(b), style(s) {}
-
998  fmt(typo s, fg f = fg::none, bg b = bg::none) : fore(f), back(b), style(s) {}
-
999  fmt(typo s, bg b , fg f = fg::none) : fore(f), back(b), style(s) {}
-
1000  protected:
-
1001  std::ostream& print_on(std::ostream&) const {}
-
1002  public:
-
1003  friend std::ostream& operator<<(std::ostream&, const fmt&) {}
-
1004  std::string operator()(const std::string&) const {}
-
1005  };
-
1006  public:
-
1007  clutchlog(clutchlog const&) = delete;
-
1008  void operator=(clutchlog const&) = delete;
-
1009  private:
-
1010  clutchlog() {}
-
1011  protected:
-
1012  struct scope_t {};
-
1013  scope_t locate(
-
1014  const level&,
-
1015  const std::string&,
-
1016  const std::string&,
-
1017  const size_t
-
1018  ) const
-
1019  {}
-
1020  public:
-
1021  void format(const std::string&) {}
-
1022  std::string format() const {}
-
1023 
-
1024  void format_comment(const std::string&) {}
-
1025  std::string format_comment() const {}
-
1026 
-
1027  void out(std::ostream&) {}
-
1028  std::ostream& out() {}
-
1029 
-
1030 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1031  void depth(size_t) {}
-
1032  size_t depth() const {}
-
1033 
-
1034  void depth_mark(const std::string) {}
-
1035  std::string depth_mark() const {}
-
1036  void strip_calls(const size_t) {}
-
1037  size_t strip_calls() const {}
-
1038 #endif
-
1039 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
-
1040  void hfill_mark(const char) {}
-
1041  char hfill_mark() const {}
-
1042  void hfill_fmt(fmt) {}
-
1043  fmt hfill_fmt() const {}
-
1044  void hfill_max(const size_t) {}
-
1045  size_t hfill_max() {}
-
1046 #endif
-
1047 
-
1048  void threshold(level) {}
-
1049  void threshold(const std::string&) {}
-
1050  level threshold() const {}
-
1051  const std::map<std::string,level> levels() const {}
-
1052  level level_of(const std::string) {}
-
1053 
-
1054  void file(std::string) {}
-
1055  void func(std::string) {}
-
1056  void line(std::string) {}
-
1057 
-
1058 #pragma GCC diagnostic push
-
1059 #pragma GCC diagnostic ignored "-Wunused-parameter"
-
1060  void location(
-
1061  const std::string&,
-
1062  const std::string& in_function=".*",
-
1063  const std::string& in_line=".*"
-
1064  )
-
1065  {}
-
1066 #pragma GCC diagnostic pop
-
1067  template<class ... FMT>
-
1068  void style(level, FMT...) {}
-
1069  void style(level, fmt) {}
-
1070  fmt style(level) const {}
-
1071  public:
-
1072  std::string replace(
-
1073  const std::string&,
-
1074  const std::string&,
-
1075  const std::string&
-
1076  ) const
-
1077  {}
-
1078 
-
1079  std::string replace(
-
1080  const std::string&,
-
1081  const std::string&,
-
1082  const size_t
-
1083  ) const
-
1084  {}
-
1085 
-
1086  std::string format(
-
1087  std::string,
+
980 };
+
981 
+
984 #else // not WITH_CLUTCHLOG
+
985 
+
986 
+
987 /**********************************************************************
+
988  * Fake implementation
+
989  **********************************************************************/
+
990 
+
991 // Equivalent class with empty methods, will be optimized out
+
992 // while allowing to actually have calls implemented without WITH_CLUTCHLOG guards.
+
993 #pragma GCC diagnostic push
+
994 #pragma GCC diagnostic ignored "-Wreturn-type"
+
995 class clutchlog
+
996 {
+
997  public:
+
998  static clutchlog& logger() {}
+
999  enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7};
+
1000  class fmt {
+
1001  public:
+
1002  enum class fg { black, red, green, yellow, blue, magenta, cyan, white, none } fore;
+
1003  enum class bg { black, red, green, yellow, blue, magenta, cyan, white, none } back;
+
1004  enum class typo { reset, bold, underline, inverse, none } style;
+
1005  fmt() : fore(fg::none), back(bg::none), style(typo::none) {}
+
1006  fmt( fg f, bg b = bg::none, typo s = typo::none) : fore(f), back(b), style(s) {}
+
1007  fmt( fg f, typo s , bg b = bg::none) : fore(f), back(b), style(s) {}
+
1008  fmt( bg b, fg f = fg::none, typo s = typo::none) : fore(f), back(b), style(s) {}
+
1009  fmt( bg b, typo s , fg f = fg::none) : fore(f), back(b), style(s) {}
+
1010  fmt(typo s, fg f = fg::none, bg b = bg::none) : fore(f), back(b), style(s) {}
+
1011  fmt(typo s, bg b , fg f = fg::none) : fore(f), back(b), style(s) {}
+
1012  protected:
+
1013  std::ostream& print_on(std::ostream&) const {}
+
1014  public:
+
1015  friend std::ostream& operator<<(std::ostream&, const fmt&) {}
+
1016  std::string operator()(const std::string&) const {}
+
1017  };
+
1018  public:
+
1019  clutchlog(clutchlog const&) = delete;
+
1020  void operator=(clutchlog const&) = delete;
+
1021  private:
+
1022  clutchlog() {}
+
1023  protected:
+
1024  struct scope_t {};
+
1025  scope_t locate(
+
1026  const level&,
+
1027  const std::string&,
+
1028  const std::string&,
+
1029  const size_t
+
1030  ) const
+
1031  {}
+
1032  public:
+
1033  void format(const std::string&) {}
+
1034  std::string format() const {}
+
1035 
+
1036  void format_comment(const std::string&) {}
+
1037  std::string format_comment() const {}
+
1038 
+
1039  void out(std::ostream&) {}
+
1040  std::ostream& out() {}
+
1041 
+
1042 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1043  void depth(size_t) {}
+
1044  size_t depth() const {}
+
1045 
+
1046  void depth_mark(const std::string) {}
+
1047  std::string depth_mark() const {}
+
1048  void strip_calls(const size_t) {}
+
1049  size_t strip_calls() const {}
+
1050 #endif
+
1051 #if CLUTCHLOG_HAVE_UNIX_SYSIOCTL == 1
+
1052  void hfill_mark(const char) {}
+
1053  char hfill_mark() const {}
+
1054  void hfill_fmt(fmt) {}
+
1055  fmt hfill_fmt() const {}
+
1056  void hfill_min(const size_t) {}
+
1057  size_t hfill_min() {}
+
1058  void hfill_max(const size_t) {}
+
1059  size_t hfill_max() {}
+
1060 #endif
+
1061 
+
1062  void threshold(level) {}
+
1063  void threshold(const std::string&) {}
+
1064  level threshold() const {}
+
1065  const std::map<std::string,level> levels() const {}
+
1066  level level_of(const std::string) {}
+
1067 
+
1068  void file(std::string) {}
+
1069  void func(std::string) {}
+
1070  void line(std::string) {}
+
1071 
+
1072 #pragma GCC diagnostic push
+
1073 #pragma GCC diagnostic ignored "-Wunused-parameter"
+
1074  void location(
+
1075  const std::string&,
+
1076  const std::string& in_function=".*",
+
1077  const std::string& in_line=".*"
+
1078  )
+
1079  {}
+
1080 #pragma GCC diagnostic pop
+
1081  template<class ... FMT>
+
1082  void style(level, FMT...) {}
+
1083  void style(level, fmt) {}
+
1084  fmt style(level) const {}
+
1085  public:
+
1086  std::string replace(
+
1087  const std::string&,
1088  const std::string&,
-
1089 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1090  const std::string&,
-
1091 #endif
-
1092  const level&,
-
1093  const std::string&,
+
1089  const std::string&
+
1090  ) const
+
1091  {}
+
1092 
+
1093  std::string replace(
1094  const std::string&,
-
1095  const size_t
-
1096 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
-
1097  ,
-
1098  const size_t
-
1099 #endif
-
1100  ) const
-
1101  {}
-
1102 
-
1103  void log(
-
1104  const level&,
-
1105  const std::string&,
-
1106  const std::string&, const std::string&, size_t
-
1107  ) const
-
1108  {}
-
1109 
-
1110  template<class In>
-
1111  void dump(
-
1112  const level&,
-
1113  const In, const In,
-
1114  const std::string&, const std::string&, size_t,
-
1115  const std::string&,
-
1116  const std::string
-
1117  ) const
-
1118  {}
-
1119 };
-
1120 #pragma GCC diagnostic pop
-
1121 #endif // WITH_CLUTCHLOG
-
1122 
-
1123 #endif // CLUTCHLOG_H
+
1095  const std::string&,
+
1096  const size_t
+
1097  ) const
+
1098  {}
+
1099 
+
1100  std::string format(
+
1101  std::string,
+
1102  const std::string&,
+
1103 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1104  const std::string&,
+
1105 #endif
+
1106  const level&,
+
1107  const std::string&,
+
1108  const std::string&,
+
1109  const size_t
+
1110 #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1
+
1111  ,
+
1112  const size_t
+
1113 #endif
+
1114  ) const
+
1115  {}
+
1116 
+
1117  void log(
+
1118  const level&,
+
1119  const std::string&,
+
1120  const std::string&, const std::string&, size_t
+
1121  ) const
+
1122  {}
+
1123 
+
1124  template<class In>
+
1125  void dump(
+
1126  const level&,
+
1127  const In, const In,
+
1128  const std::string&, const std::string&, size_t,
+
1129  const std::string&,
+
1130  const std::string
+
1131  ) const
+
1132  {}
+
1133 };
+
1134 #pragma GCC diagnostic pop
+
1135 #endif // WITH_CLUTCHLOG
+
1136 
+
1137 #endif // CLUTCHLOG_H
static std::string default_depth_mark
Default mark for stack depth.
Definition: clutchlog.h:249
-
std::string _format_log
Current format of the standard output.
Definition: clutchlog.h:497
-
std::map< level, fmt > _level_fmt
Dictionary of level identifier to their format.
Definition: clutchlog.h:495
-
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:891
-
std::string str() const
Return the formatting code as a string.
Definition: clutchlog.h:418
-
void line(std::string line)
Set the regular expression filtering the line location.
Definition: clutchlog.h:621
+
std::string _format_log
Current format of the standard output.
Definition: clutchlog.h:503
+
std::map< level, fmt > _level_fmt
Dictionary of level identifier to their format.
Definition: clutchlog.h:501
+
void log(const level &stage, const std::string &what, const std::string &file, const std::string &func, size_t line) const
Print a log message IF the location matches the given one.
Definition: clutchlog.h:903
+
std::string str() const
Return the formatting code as a string.
Definition: clutchlog.h:423
+
void line(std::string line)
Set the regular expression filtering the line location.
Definition: clutchlog.h:633
static std::string dump_default_format
Default format of the comment line in file dump.
Definition: clutchlog.h:235
-
void out(std::ostream &out)
Set the output stream on which to print.
Definition: clutchlog.h:552
+
void out(std::ostream &out)
Set the output stream on which to print.
Definition: clutchlog.h:560
static std::string dump_default_sep
Default item separator for dump.
Definition: clutchlog.h:242
-
std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
Substitute all tags in the format string with the corresponding information and apply the style corre...
Definition: clutchlog.h:805
+
std::string format(std::string row, const std::string &what, const level &stage, const std::string &file, const std::string &func, const size_t line) const
Substitute all tags in the format string with the corresponding information and apply the style corre...
Definition: clutchlog.h:817
#define CLUTCHLOG_DEFAULT_DEPTH_MARK
Compile-time default mark for stack depth.
Definition: clutchlog.h:246
static unsigned int default_strip_calls
Number of call stack levels to remove from depth display by default.
Definition: clutchlog.h:256
-
std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
Replace mark by tag in form.
Definition: clutchlog.h:729
+
static size_t default_hfill_min
Default minimum width (number of characters) at which to fill for right-aligning the right part of me...
Definition: clutchlog.h:277
+
std::string replace(const std::string &form, const std::string &mark, const std::string &tag) const
Replace mark by tag in form.
Definition: clutchlog.h:741
enum clutchlog::fmt::bg back
Background color.
-
fg
Foreground color codes.
Definition: clutchlog.h:312
+
fg
Foreground color codes.
Definition: clutchlog.h:317
enum clutchlog::fmt::fg fore
Foreground color.
static char default_hfill_char
Default character used as a filling for right-align the right part of messages with "{hfill}".
Definition: clutchlog.h:263
-
bool matches
Everything is compatible.
Definition: clutchlog.h:656
+
bool matches
Everything is compatible.
Definition: clutchlog.h:668
enum clutchlog::fmt::typo style
Typographic style.
-
#define CLUTCHLOG_HFILL_MARK
Character used as a filling for right-align the right part of messages with "{hfill}".
Definition: clutchlog.h:260
-
void format_comment(const std::string &format)
Set the template string for dumps.
Definition: clutchlog.h:547
-
void file(std::string file)
Set the regular expression filtering the file location.
Definition: clutchlog.h:617
-
scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
Gather information on the current location of the call.
Definition: clutchlog.h:678
-
fmt()
&#160;Empty constructor, only useful for a no-op formatter.
Definition: clutchlog.h:347
-
void style(level stage, fmt style)
Set the style (color and typo) of the given log level, passing a fmt instance.
Definition: clutchlog.h:642
-
void threshold(level l)
Set the log level (below which logs are not printed) with an identifier.
Definition: clutchlog.h:594
-
level threshold() const
Get the log level below which logs are not printed.
Definition: clutchlog.h:598
-
level
Available log levels.
Definition: clutchlog.h:298
-
static size_t default_hfill_max
Default maximum number of character used as a filling for right-align the right part of messages with...
Definition: clutchlog.h:272
-
scope_t()
Constructor.
Definition: clutchlog.h:666
-
std::regex _in_func
Current function location filter.
Definition: clutchlog.h:521
-
bg
Background color codes.
Definition: clutchlog.h:325
+
void format_comment(const std::string &format)
Set the template string for dumps.
Definition: clutchlog.h:555
+
void file(std::string file)
Set the regular expression filtering the file location.
Definition: clutchlog.h:629
+
scope_t locate(const level &stage, const std::string &file, const std::string &func, const size_t line) const
Gather information on the current location of the call.
Definition: clutchlog.h:690
+
fmt()
&#160;Empty constructor, only useful for a no-op formatter.
Definition: clutchlog.h:352
+
void style(level stage, fmt style)
Set the style (color and typo) of the given log level, passing a fmt instance.
Definition: clutchlog.h:654
+
void threshold(level l)
Set the log level (below which logs are not printed) with an identifier.
Definition: clutchlog.h:606
+
level threshold() const
Get the log level below which logs are not printed.
Definition: clutchlog.h:610
+
level
Available log levels.
Definition: clutchlog.h:303
+
static size_t default_hfill_max
Default maximum width (number of characters) for which to fill for right-aligning the right part of m...
Definition: clutchlog.h:275
+
scope_t()
Constructor.
Definition: clutchlog.h:678
+
std::regex _in_func
Current function location filter.
Definition: clutchlog.h:529
+
bg
Background color codes.
Definition: clutchlog.h:330
static std::string default_format
Default format of the messages.
Definition: clutchlog.h:213
-
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:291
-
void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
Dump a serializable container after a comment line with log information.
Definition: clutchlog.h:916
-
Color and style formatter for ANSI terminal escape sequences.
Definition: clutchlog.h:309
-
void func(std::string func)
Set the regular expression filtering the function location.
Definition: clutchlog.h:619
-
std::string format() const
Get the template string.
Definition: clutchlog.h:544
-
std::regex _in_file
Current file location filter.
Definition: clutchlog.h:519
-
void style(level stage, FMT... styles)
Set the style (color and typo) of the given log level.
Definition: clutchlog.h:640
-
level level_of(const std::string name)
Return the log level tag corresponding to the given pre-configured name.
Definition: clutchlog.h:606
-
const std::map< level, std::string > _level_word
Dictionary of level identifier to their string representation.
Definition: clutchlog.h:491
-
std::string operator()(const std::string &msg) const
Format the given string with the currently encoded format.
Definition: clutchlog.h:406
+
static clutchlog & logger()
Get the logger instance.
Definition: clutchlog.h:296
+
void dump(const level &stage, const In container_begin, const In container_end, const std::string &file, const std::string &func, size_t line, const std::string &filename_template="dump_{n}.dat", const std::string sep=dump_default_sep) const
Dump a serializable container after a comment line with log information.
Definition: clutchlog.h:928
+
Color and style formatter for ANSI terminal escape sequences.
Definition: clutchlog.h:314
+
void func(std::string func)
Set the regular expression filtering the function location.
Definition: clutchlog.h:631
+
std::string format() const
Get the template string.
Definition: clutchlog.h:552
+
std::regex _in_file
Current file location filter.
Definition: clutchlog.h:527
+
void style(level stage, FMT... styles)
Set the style (color and typo) of the given log level.
Definition: clutchlog.h:652
+
level level_of(const std::string name)
Return the log level tag corresponding to the given pre-configured name.
Definition: clutchlog.h:618
+
const std::map< level, std::string > _level_word
Dictionary of level identifier to their string representation.
Definition: clutchlog.h:497
+
std::string operator()(const std::string &msg) const
Format the given string with the currently encoded format.
Definition: clutchlog.h:411
#define CLUTCHLOG_DEFAULT_FORMAT
Compile-time default format of the messages (debug mode: with absolute location).
Definition: clutchlog.h:198
-
std::regex _in_line
Current line location filter.
Definition: clutchlog.h:523
-
std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
Replace mark by tag in form, converting tag to its string representation first.
Definition: clutchlog.h:794
-
std::string format_comment() const
Get the template string for dumps.
Definition: clutchlog.h:549
-
std::string _format_dump
Current format of the file output.
Definition: clutchlog.h:499
+
std::regex _in_line
Current line location filter.
Definition: clutchlog.h:531
+
std::string replace(const std::string &form, const std::string &mark, const size_t tag) const
Replace mark by tag in form, converting tag to its string representation first.
Definition: clutchlog.h:806
+
std::string format_comment() const
Get the template string for dumps.
Definition: clutchlog.h:557
+
std::string _format_dump
Current format of the file output.
Definition: clutchlog.h:505
#define CLUTCHDUMP_DEFAULT_SEP
Compile-time default item separator for dump.
Definition: clutchlog.h:239
-
Structure holding a location matching.
Definition: clutchlog.h:654
-
std::ostream & print_on(std::ostream &os) const
Print the currently encoded format escape code on the given output stream.
Definition: clutchlog.h:361
-
std::ostream * _out
Standard output.
Definition: clutchlog.h:509
-
std::ostream & out()
Get the output stream on which to print.
Definition: clutchlog.h:554
-
void threshold(const std::string &l)
Set the log level (below which logs are not printed) with a string.
Definition: clutchlog.h:596
-
const std::map< std::string, level > & levels() const
Get the map of available log levels string representations toward their identifier....
Definition: clutchlog.h:600
-
size_t _strip_calls
Current number of call stack levels to remove from depth display.
Definition: clutchlog.h:489
-
level stage
Current log level.
Definition: clutchlog.h:658
-
bool there
Location is compatible.
Definition: clutchlog.h:664
+
Structure holding a location matching.
Definition: clutchlog.h:666
+
#define CLUTCHLOG_DEFAULT_HFILL_MARK
Character used as a filling for right-align the right part of messages with "{hfill}".
Definition: clutchlog.h:260
+
std::ostream & print_on(std::ostream &os) const
Print the currently encoded format escape code on the given output stream.
Definition: clutchlog.h:366
+
std::ostream * _out
Standard output.
Definition: clutchlog.h:517
+
std::ostream & out()
Get the output stream on which to print.
Definition: clutchlog.h:562
+
void threshold(const std::string &l)
Set the log level (below which logs are not printed) with a string.
Definition: clutchlog.h:608
+
const std::map< std::string, level > & levels() const
Get the map of available log levels string representations toward their identifier....
Definition: clutchlog.h:612
+
size_t _strip_calls
Current number of call stack levels to remove from depth display.
Definition: clutchlog.h:495
+
level stage
Current log level.
Definition: clutchlog.h:670
+
bool there
Location is compatible.
Definition: clutchlog.h:676
#define CLUTCHLOG_STRIP_CALLS
Compile-time number of call stack levels to remove from depth display by default.
Definition: clutchlog.h:253
-
friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
Output stream overload.
Definition: clutchlog.h:391
-
std::map< std::string, level > _word_level
Dictionary of level string to their identifier.
Definition: clutchlog.h:493
-
level _stage
Current log level.
Definition: clutchlog.h:517
-
fmt style(level stage) const
Get the configured fmt instance of the given log level.
Definition: clutchlog.h:644
-
typo
Typographic style codes.
Definition: clutchlog.h:338
-
void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
Set the regular expressions filtering the location.
Definition: clutchlog.h:624
+
friend std::ostream & operator<<(std::ostream &os, const fmt &fmt)
Output stream overload.
Definition: clutchlog.h:396
+
std::map< std::string, level > _word_level
Dictionary of level string to their identifier.
Definition: clutchlog.h:499
+
level _stage
Current log level.
Definition: clutchlog.h:525
+
fmt style(level stage) const
Get the configured fmt instance of the given log level.
Definition: clutchlog.h:656
+
typo
Typographic style codes.
Definition: clutchlog.h:343
+
void location(const std::string &in_file, const std::string &in_function=".*", const std::string &in_line=".*")
Set the regular expressions filtering the location.
Definition: clutchlog.h:636
#define CLUTCHLOG_HAVE_UNIX_SYSINFO
True if POSIX headers necessary for stack depth management are available.
Definition: clutchlog.h:33
The single class which holds everything.
Definition: clutchlog.h:177
#define CLUTCHDUMP_DEFAULT_FORMAT
Compile-time default format of the comment line in file dump.
Definition: clutchlog.h:221
diff --git a/docs/clutchlog_logo.png b/docs/clutchlog_logo.png index 573d2d0a5a50b712184961424de342a9cb7d5837..841a245a679e233bb6f012e7798bf5e0172a2deb 100644 GIT binary patch delta 66701 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 delta 66249 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%0Ad6fPtb;4*l_P9$0!n>b{xt2l1w5BmSwRX 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 BTgU(a diff --git a/docs/clutchlog_logo.svg b/docs/clutchlog_logo.svg index 84b8e3f..f06c5e1 100644 --- a/docs/clutchlog_logo.svg +++ b/docs/clutchlog_logo.svg @@ -35,7 +35,7 @@ showgrid="false" showguides="false" inkscape:zoom="0.3724553" - inkscape:cx="994.75025" + inkscape:cx="387.96602" inkscape:cy="1388.086" inkscape:current-layer="layer1"> v0.11 + y="457.33154">v0.12