--- /dev/null
+// Roast+ License
+
+/*
+
+*/
+#ifndef __SFJP_ROAST__debug__console_monitor_HPP__
+#define __SFJP_ROAST__debug__console_monitor_HPP__
+
+#include "roast/console/console.hpp"
+#include <string>
+#include <stack>
+#include <list>
+
+namespace roast
+{
+ namespace debug
+ {
+ struct into{
+ ::std::string name;
+
+ into(const ::std::string &s):name(s){}
+ into(const char* s):name(s){}
+ };
+
+ struct out{};
+ }
+
+ class debug_console_monitor
+ {
+ private:
+ ::std::list<::std::string> m_stack;
+ typedef ::std::list<::std::string>::iterator _StackIterator;
+ public:
+ debug_console_monitor()
+ {
+ update_screen();
+ }
+
+ void update_stackframe()
+ {
+ using namespace console;
+ set_cursol(0,3);
+ //for(size_t i=0; i<m_stack.size(); i++)
+ int i=0;
+ for(_StackIterator it=m_stack.begin(); it != m_stack.end(); it++, i++)
+ {
+ putchar_repeat(' ',i*2);
+ printf("%s\n", it->c_str());
+ }
+ getc(stdin);
+ }
+
+ void update_screen()
+ {
+ using namespace console;
+
+ clear_screen();
+
+ set_cursol(0,0);
+ repeat_to_screen_max('*',2);
+ // printf("\n*");
+ printf("\n* Roast+ lexical Debugging Monitor\n");
+ // printf("*\n");
+ repeat_to_screen_max('*',2);
+
+ set_cursol(0,console::screen_height - 4);
+ repeat_to_screen_max('-');
+ printf("> ");
+
+ update_stackframe();
+ }
+
+ void operator << (const debug::into& in)
+ {
+ m_stack.push_back(in.name);
+ update_screen();
+ }
+
+ void operator << (const debug::out& out)
+ {
+ m_stack.pop_back();
+ update_screen();
+ }
+ };
+
+ class debug_null_monitor
+ {
+ public:
+ void operator << (const debug::into&){}
+ void operator << (const debug::out&){}
+ };
+}
+
+#endif//__SFJP_ROAST__debug__console_monitor_HPP__