14 #ifndef _consolestreambuf_h 15 #define _consolestreambuf_h 24 class ConsoleStreambuf :
public std::streambuf {
27 static const int BUFFER_SIZE = 4096;
30 char inBuffer[BUFFER_SIZE];
31 char outBuffer[BUFFER_SIZE];
35 virtual void myEndLineConsole(
bool isStderr) = 0;
37 virtual string myGetLineConsole() = 0;
39 virtual void myPutConsole(
const string& str,
bool isStderr) = 0;
43 setg(inBuffer, inBuffer, inBuffer);
44 setp(outBuffer, outBuffer + BUFFER_SIZE);
52 virtual bool isBlocked() {
56 virtual int overflow(
int ch = EOF) {
57 return overflow(ch,
false);
60 virtual int overflow(
int ch,
bool isStderr) {
62 for (
char *cp = pbase(); cp < pptr(); cp++) {
64 myPutConsole(line, isStderr);
65 myEndLineConsole(isStderr);
72 myPutConsole(line, isStderr);
74 setp(outBuffer, outBuffer + BUFFER_SIZE);
86 virtual int sync(
bool isStderr) {
87 return overflow(EOF, isStderr);
90 virtual int underflow() {
93 string line = myGetLineConsole();
96 bool eof = std::cin.eof();
103 int n = line.length();
104 if (n + 1 >= BUFFER_SIZE) {
105 throw std::runtime_error(
"ConsoleStreambuf::underflow: String too long");
107 for (
int i = 0; i < n; i++) {
108 inBuffer[i] = line[i];
110 inBuffer[n++] =
'\n';
112 setg(inBuffer, inBuffer, inBuffer + n);
121 extern void putConsoleQt(
const string& str,
bool isStderr);
127 class ConsoleStreambufQt :
public ::sgl::ConsoleStreambuf {
129 ConsoleStreambufQt(
bool isStderr =
false)
130 : ConsoleStreambuf(),
131 _isStderr(isStderr) {
135 ~ConsoleStreambufQt() {
140 virtual void myEndLineConsole(
bool ) {
144 virtual string myGetLineConsole() {
148 virtual void myPutConsole(
const string& str,
bool ) {
160 #endif // _consolestreambuf_h string getLineConsoleQt()
Definition: gconsolewindow.cpp:1443
Definition: console.h:293
void putConsoleQt(string str, bool isStderr)
Definition: gconsolewindow.cpp:1447
void endLineConsoleQt(bool isStderr)
Definition: gconsolewindow.cpp:1439