#pragma once #include #include #ifdef _WIN32 #include #endif namespace fsh::util { /** * Applies some settings to terminals to fix some inconsistencies between * windows and linux terminals * * * **Windows** : it enables using ansii characters * * **Linux** : it enables [Noncanonical Mode](https://www.gnu.org/software/libc/manual/html_node/Noncanonical-Input.html) */ void prepTerminal(); #ifndef _WIN32 class CursorIStreamBuffer : public std::streambuf { public: enum EscapeSequence { FAILED, POSSIBLE, LEFT_ARROW, RIGHT_ARROW }; CursorIStreamBuffer() : valid(0), read_chars(0), cursor_pos(0), buffer() { setg(buffer, buffer, buffer); } protected: int underflow() override; // int uflow() override; // std::streamsize xsgetn(char* s, std::streamsize n) override; private: int valid; EscapeSequence testForEscapeCodes(char chr); int readInputToNewLine(); std::string input; int read_chars; int cursor_pos; char buffer[32]; }; class CursorIStream : public std::istream { public: CursorIStream() : std::istream(&buffer) {} private: CursorIStreamBuffer buffer; }; extern CursorIStream cin; #else extern std::istream& cin; #endif }