From 47e3cb85b238c7669e28a8071372dae13f2a3b0c Mon Sep 17 00:00:00 2001
From: Stefan Girke <s_girk01@pris.(none)>
Date: Tue, 6 Mar 2012 12:47:30 +0100
Subject: [PATCH] removed unnecessary methods in helperclass.hh, changed
 "#define" into "static const char*", wrote a small class for testing the
 colored output....

---
 stuff/color.hh     | 163 +++++++++++++++++++++++++++++++++++++++++++++
 stuff/colortest.cc |  30 +++++++++
 2 files changed, 193 insertions(+)
 create mode 100644 stuff/color.hh
 create mode 100644 stuff/colortest.cc

diff --git a/stuff/color.hh b/stuff/color.hh
new file mode 100644
index 000000000..f753ddadf
--- /dev/null
+++ b/stuff/color.hh
@@ -0,0 +1,163 @@
+#ifndef DUNE_COMMON_COLOR_HH
+#define DUNE_COMMON_COLOR_HH
+
+#include <sstream>
+#include <assert.h>
+#include <iostream>
+
+#ifdef __GNUC__
+#include <cxxabi.h>
+#endif
+#include <string>
+
+
+namespace Color {
+// foreground colors
+static const char* black     = "\033[30m";
+static const char* red       = "\033[31m";
+static const char* green     = "\033[32m";
+static const char* brown     = "\033[33m";
+static const char* blue      = "\033[34m";
+static const char* purple    = "\033[35m";
+static const char* cyan      = "\033[36m";
+static const char* lightgray = "\033[37m";
+// light foreground colors
+static const char* darkgray    = "\033[1;30m";
+static const char* lightred    = "\033[1;31m";
+static const char* lightgreen  = "\033[1;32m";
+static const char* yellow      = "\033[1;33m";
+static const char* lightblue   = "\033[1;34m";
+static const char* lightpurple = "\033[1;35m";
+static const char* lightcyan   = "\033[1;36m";
+static const char* white       = "\033[1;37m";
+
+// background colors
+static const char* bblack     = "\033[40m";
+static const char* bred       = "\033[41m";
+static const char* bgreen     = "\033[42m";
+static const char* bbrown     = "\033[43m";
+static const char* bblue      = "\033[44m";
+static const char* bpurple    = "\033[45m";
+static const char* bcyan      = "\033[46m";
+static const char* blightgray = "\033[47m";
+// light background colors
+static const char* bdarkgray    = "\033[1;40m";
+static const char* blightred    = "\033[1;41m";
+static const char* blightgreen  = "\033[1;42m";
+static const char* byellow      = "\033[1;43m";
+static const char* blightblue   = "\033[1;44m";
+static const char* blightpurple = "\033[1;45m";
+static const char* blightcyan   = "\033[1;46m";
+static const char* bwhite       = "\033[1;47m";
+// modifiers
+static const char* normal       = "\033[0m";
+static const char* bold         = "\033[1m";
+static const char* italic       = "\033[2m";
+static const char* underline    = "\033[4m";
+static const char* blink        = "\033[5m";
+static const char* reverse      = "\033[7m";
+static const char* enditalic    = "\033[22m";
+static const char* endunderline = "\033[24m";
+static const char* endblink     = "\033[25m";
+static const char* endreverse   = "\033[27m";
+
+// converts int to string by using ostringstream
+std::string intToString(int i)
+{
+  std::ostringstream out;
+  out << i;
+  return out.str();
+}
+
+std::string color(int i)
+{
+  return "\033[38;5;" + intToString(i) + "m";
+}
+
+std::string backcolor(int i)
+{
+  return "\033[38;5;" + intToString(i) + "m";
+}
+
+
+// demangles typeid
+template <class T>
+std::string demangledTypeId(T& obj)
+{
+  int status;
+#ifdef __GNUC__
+  return abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
+#else
+  return typeid(obj).name();
+#endif
+}
+
+// create output for demangled typeid
+template <class T>
+void realTypeId(T& obj, std::string name = "", int maxlevel = 10000)
+{
+  std::cout << name << (name == "" ? "" : "'s type is ") << highlightTemplate(demangledTypeId(obj), maxlevel)
+            << std::endl;
+}
+
+// maybe you want to choose your own color
+int templateColorChooser(int i)
+{
+  return i % 256;
+}
+
+// highlight templates depending on the "template"-level
+std::string highlightTemplate(std::string str, int maxlevel = 10000)
+{
+  if (maxlevel < 0)
+    maxlevel     = 0;
+  int startindex = 0;
+  int level = 0;
+  for (size_t i = 0; i < str.size(); i++) {
+    if (str[i] == '<') {
+      level++;
+      std::string dummy = "\033[38;5;" + intToString(templateColorChooser(level)) + "m";
+      str.insert(i, dummy);
+      i += dummy.size();
+      if (level == maxlevel)
+        startindex = i + 1;
+    } else if (str[i] == '>') {
+      level--;
+      std::string dummy = "\033[38;5;" + intToString(templateColorChooser(level)) + "m";
+      str.insert(++i, dummy);
+      if (level + 1 == maxlevel) {
+        int size = i - startindex - 1;
+        str.erase(startindex, size);
+        i = startindex + 1;
+      }
+      i += dummy.size();
+    }
+  }
+  str += "\033[38;5;0m";
+  return str;
+}
+
+// highlight a string in a specified color
+std::string highlightString(std::string str, int colornr = 0)
+{
+  return "\033[38;5;" + intToString(colornr % 256) + "m" + str + "\033[38;5;0m";
+}
+
+// highlight a string which is searched in another string in a specified color
+std::string highlightSearchString(std::string str, std::string searchstr, int colornr = 0)
+{
+  int index = str.find(searchstr, 0);
+  while (index != int(std::string::npos)) {
+    std::string dummy  = "\033[38;5;" + intToString(colornr % 256) + "m";
+    std::string dummy2 = "\033[38;5;0m";
+    str.insert(index, dummy);
+    str.insert(index + searchstr.size() + dummy.size(), dummy2);
+    index = str.find(searchstr, index + dummy.size() + searchstr.size() + dummy2.size());
+  }
+  return str;
+}
+
+} // end of namespace Color
+
+
+#endif // end of DUNE_COMMON_COLOR_HH
diff --git a/stuff/colortest.cc b/stuff/colortest.cc
new file mode 100644
index 000000000..da90c8217
--- /dev/null
+++ b/stuff/colortest.cc
@@ -0,0 +1,30 @@
+
+#include "color.hh"
+
+using namespace Color;
+
+int main()
+{
+  std::cout << underline << "a simple 'hello world': " << endunderline << "hello world" << std::endl;
+  std::cout << underline << "a colored 'hello world': " << endunderline << highlightString("hello world", 1)
+            << std::endl;
+  std::cout << underline << "a colored 'hello world': " << endunderline << bgreen << "hello world" << normal
+            << std::endl;
+  std::cout << underline << "a blinking 'hello world': " << endunderline << blink << "hello world" << endblink
+            << std::endl;
+  std::cout << underline << "an italic 'hello world': " << endunderline << italic << "hello world" << enditalic
+            << std::endl;
+  std::cout << underline << "an underlined 'hello world': " << endunderline << underline << "hello world"
+            << endunderline << std::endl;
+  std::cout << underline << "a reverse 'hello world': " << endunderline << reverse << "hello world" << endreverse
+            << std::endl;
+  std::cout << underline << "a 'hello world' with highlighted substrings ('o'): " << endunderline
+            << highlightSearchString("hello world", "o", 3) << std::endl;
+  std::cout << underline << "a highlighted 'hello world'-template: " << endunderline
+            << highlightTemplate("Hello< World, Hello< World, Hello< World< Hello, World > > > >") << std::endl;
+  std::cout << underline << "a highlighted 'hello world'-template only showing two levels: " << endunderline
+            << highlightTemplate("Hello< World, Hello< World, Hello< World< Hello, World > > > >", 2) << std::endl;
+  std::cout << underline << "colored 'hello world' for all available colors( 0 - 255): " << endunderline << std::endl;
+  for (int i = 0; i < 256; ++i)
+    std::cout << highlightString("hello world", i) << std::endl;
+}
-- 
GitLab