#ifndef TERMINAL_H #define TERMINAL_H #include #include class Terminal { private: int posx, posy; std::vector> saved_cursor_position; std::string ansi; int in_ansi; int fgcolor, bgcolor, status; public: enum ANSI_TYPE { START, CURSOR, COLOR, CLEAR, OTHER }; struct termchar { int in_ansi; ANSI_TYPE ansi; }; public: Terminal(void); Terminal(const Terminal &old); Terminal &operator=(Terminal &rhs); void init(void); std::string color_restore(void); termchar putchar(char ch); void putstring(std::string text); int getx(void); int gety(void); int getstatus(void); int inANSI(void); int fg(void); int bg(void); bool ansiempty(void); private: void ansi_color(int color); ANSI_TYPE ansi_code(std::string ansi); }; // notice the curstor position history vector is missing from the struct below? // Yes, it is a global. Completely WRONG. Broken! Bad! struct console_details { int posx, posy; int savedx, savedy; char ansi[20]; // current ANSI command being processed. int in_ansi; int fgcolor; // 0-7 // not 0-15 int bgcolor; // 0-7 int status; // 0, 1 or 5 (Blink) }; enum ANSI_TYPE { START, CURSOR, COLOR, CLEAR, OTHER }; struct termchar { int in_ansi; ANSI_TYPE ansi; // undefined if in_ansi is false }; void console_init(struct console_details *cdp); void ansi_color(struct console_details *cdp, int color); const char *color_restore(struct console_details *cdp); ANSI_TYPE console_ansi(struct console_details *cdp, const char *ansi); termchar console_char(struct console_details *cdp, char ch); void console_receive(struct console_details *cdp, std::string chars); #endif