Files
fsh-oop/include/util/input.hpp

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
}