65 lines
1.4 KiB
C++
65 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include <istream>
|
|
#include <streambuf>
|
|
|
|
#ifdef _WIN32
|
|
#include <iostream>
|
|
#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
|
|
|
|
} |