7 #include <msp/core/systemerror.h>
23 Console::Console(unsigned n)
26 throw invalid_argument("Console::Console");
28 mode = (n==0 ? M_READ : M_WRITE);
33 case 0: handle = GetStdHandle(STD_INPUT_HANDLE); break;
34 case 1: handle = GetStdHandle(STD_OUTPUT_HANDLE); break;
35 case 2: handle = GetStdHandle(STD_ERROR_HANDLE); break;
41 tcgetattr(handle, &orig_attr);
52 tcsetattr(handle, TCSADRAIN, &orig_attr);
56 void Console::set_block(bool b)
59 // XXX Dunno how to do this in win32
62 int flags = fcntl(0, F_GETFL);
63 flags = (flags&~O_NONBLOCK) | (b?0:O_NONBLOCK);
64 fcntl(0, F_SETFL, flags);
68 void Console::set_local_echo(bool e)
71 throw invalid_access(M_READ);
75 GetConsoleMode(handle, &m);
76 SetConsoleMode(handle, (m&~ENABLE_ECHO_INPUT) | (e?ENABLE_ECHO_INPUT:0));
80 t.c_lflag = (t.c_lflag&~ECHO) | (e?ECHO:0);
81 tcsetattr(0, TCSADRAIN, &t);
85 void Console::set_line_buffer(bool l)
88 throw invalid_access(M_READ);
92 GetConsoleMode(handle, &m);
93 SetConsoleMode(handle, (m&~ENABLE_LINE_INPUT) | (l?ENABLE_LINE_INPUT:0));
95 // XXX ICANON does more than just set line buffering, may need a bit more thought
98 t.c_lflag = (t.c_lflag&~ICANON) | (l?ICANON:0);
99 tcsetattr(0, TCSADRAIN, &t);
103 void Console::get_size(unsigned &rows, unsigned &cols)
106 throw invalid_access(M_WRITE);
109 // XXX Figure out how to do this
114 ioctl(handle, TIOCGWINSZ, &wsz);
120 unsigned Console::do_write(const char *buf, unsigned len)
123 throw invalid_access(M_WRITE);
127 if(!WriteFile(handle, buf, len, &ret, 0))
128 throw system_error("WriteFile");
130 int ret = ::write(handle, buf, len);
132 throw system_error("write");
138 unsigned Console::do_read(char *buf, unsigned len)
141 throw invalid_access(M_READ);
145 if(!ReadFile(handle, buf, len, &ret, 0))
146 throw system_error("ReadFile");
148 int ret = ::read(handle, buf, len);
154 throw system_error("read");
163 Handle Console::get_event_handle()
168 Console &Console::instance(unsigned n)
170 static Console in(0);
171 static Console out(1);
172 static Console err(2);
181 throw invalid_argument("Console::instance");
184 Console &cin = Console::instance(0);
185 Console &cout = Console::instance(1);
186 Console &cerr = Console::instance(2);