34 m_inputUsed(0), m_inputRead(0)
37 m_allocatedConsole=AllocConsole()!=0;
38 if (m_allocatedConsole)
40 HANDLE h=GetStdHandle(STD_INPUT_HANDLE);
45 h=GetStdHandle(STD_OUTPUT_HANDLE);
46 CONSOLE_SCREEN_BUFFER_INFO info;
47 GetConsoleScreenBufferInfo(h,&info);
50 newSize.X=info.srWindow.Right+1;
51 newSize.Y=info.srWindow.Bottom+1;
52 SetConsoleScreenBufferSize(h,newSize);
55 CONSOLE_CURSOR_INFO ci;
58 SetConsoleCursorInfo(h,&ci);
80 if (!m_allocatedConsole)
87 if (maxchar>m_inputUsed-m_inputRead)
90 numRead=m_inputUsed-m_inputRead;
91 memcpy(buf,m_input+m_inputRead,numRead);
92 m_inputRead=m_inputUsed=0;
98 memcpy(buf,m_input+m_inputRead,numRead);
105 HANDLE h=GetStdHandle(STD_INPUT_HANDLE);
106 bool returnChars=
false;
110 if (!GetNumberOfConsoleInputEvents(h,&dwRecords))
116 ReadConsoleInput(h,&record,1,&dwRecords);
117 if (record.EventType!=KEY_EVENT)
120 KEY_EVENT_RECORD &key=record.Event.KeyEvent;
121 if (!key.bKeyDown||!key.uChar.AsciiChar)
124 if (key.uChar.AsciiChar==
'\r'||
125 key.uChar.AsciiChar==
'\n')
127 m_input[m_inputUsed++]=
'\n';
134 if (key.uChar.AsciiChar==
'\b')
139 else if (((
unsigned char)key.uChar.AsciiChar)>=
' ')
141 if (m_inputUsed<
sizeof(m_input)-1)
142 m_input[m_inputUsed++]=key.uChar.AsciiChar;
147 h=GetStdHandle(STD_OUTPUT_HANDLE);
148 CONSOLE_SCREEN_BUFFER_INFO info;
149 GetConsoleScreenBufferInfo(h,&info);
150 CHAR_INFO ci[
sizeof(m_input)+1];
151 for (
unsigned k=0;k<=
sizeof(m_input);k++)
153 ci[k].Char.AsciiChar=k<m_inputUsed?m_input[k]:
' ';
154 ci[k].Attributes=BACKGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_GREEN
155 |FOREGROUND_RED|FOREGROUND_INTENSITY;
159 if (GetTickCount()&512)
160 ci[m_inputUsed].Attributes=BACKGROUND_BLUE|BACKGROUND_GREEN
161 |BACKGROUND_RED|BACKGROUND_INTENSITY|FOREGROUND_GREEN;
163 COORD srcSize,srcCoord;
164 srcSize.X=
sizeof(m_input); srcSize.Y=1;
165 srcCoord.X=srcCoord.Y=0;
168 r.Left=r.Top=r.Bottom=0; r.Right=info.dwSize.X-1;
169 WriteConsoleOutput(h,ci+(m_inputUsed<=info.dwSize.X?0:m_inputUsed-info.dwSize.X),
170 srcSize,srcCoord,&r);
173 if (returnChars&&m_inputUsed>1)
virtual void Execute(class Debug &dbg, const char *cmd, bool structuredCmd, unsigned argn, const char *const *argv)
I/O class specific command.