- Enhanced internal variables framework (including read/save to
registry and typing)
- Finalized use of Windows' Console I/O interface (instead of Unix std
streams)
- Now handling registers as internal variables (they are no longer
seen as a specific type)
diff --git a/debugger/editline.c b/debugger/editline.c
index fa690d7..9acc704 100644
--- a/debugger/editline.c
+++ b/debugger/editline.c
@@ -27,12 +27,7 @@
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
-#include <unistd.h>
#include <string.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
#include "windef.h"
#include "debugger.h"
@@ -136,94 +131,29 @@
** Declarations.
*/
static CHAR *editinput();
-extern int read();
-extern int write();
-#if defined(USE_TERMCAP)
-extern char *getenv();
-extern char *tgetstr();
-extern int tgetent();
-#endif /* defined(USE_TERMCAP) */
/*
** TTY input/output functions.
*/
-#ifdef HAVE_TCGETATTR
-#include <termios.h>
-
static void
rl_ttyset(int Reset)
{
- static struct termios old;
- struct termios new;
+ static DWORD old_mode;
- if (Reset == 0) {
- (void)tcgetattr(0, &old);
- rl_erase = old.c_cc[VERASE];
- rl_kill = old.c_cc[VKILL];
- rl_eof = old.c_cc[VEOF];
- rl_intr = old.c_cc[VINTR];
- rl_quit = old.c_cc[VQUIT];
-
- new = old;
- new.c_cc[VINTR] = -1;
- new.c_cc[VQUIT] = -1;
- new.c_lflag &= ~(ECHO | ICANON);
- new.c_iflag &= ~(ISTRIP | INPCK);
- new.c_cc[VMIN] = 1;
- new.c_cc[VTIME] = 0;
- (void)tcsetattr(0, TCSANOW, &new);
- }
- else
- (void)tcsetattr(0, TCSANOW, &old);
+ if (Reset == 0) {
+ GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &old_mode);
+ SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), 0 /*ENABLE_PROCESSED_INPUT|ENABLE_WINDOW_INPUT|ENABLE_MOUSE_INPUT*/);
+ } else {
+ SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), old_mode);
+ }
}
-#else /* HAVE_TCGETATTR */
-
-static void
-rl_ttyset(int Reset)
-{
- static struct sgttyb old_sgttyb;
- static struct tchars old_tchars;
- struct sgttyb new_sgttyb;
- struct tchars new_tchars;
-
- if (Reset == 0) {
- (void)ioctl(0, TIOCGETP, &old_sgttyb);
- rl_erase = old_sgttyb.sg_erase;
- rl_kill = old_sgttyb.sg_kill;
-
- (void)ioctl(0, TIOCGETC, &old_tchars);
- rl_eof = old_tchars.t_eofc;
- rl_intr = old_tchars.t_intrc;
- rl_quit = old_tchars.t_quitc;
-
- new_sgttyb = old_sgttyb;
- new_sgttyb.sg_flags &= ~ECHO;
- new_sgttyb.sg_flags |= RAW;
-#if defined(PASS8)
- new_sgttyb.sg_flags |= PASS8;
-#endif /* defined(PASS8) */
- (void)ioctl(0, TIOCSETP, &new_sgttyb);
-
- new_tchars = old_tchars;
- new_tchars.t_intrc = -1;
- new_tchars.t_quitc = -1;
- (void)ioctl(0, TIOCSETC, &new_tchars);
- }
- else {
- (void)ioctl(0, TIOCSETP, &old_sgttyb);
- (void)ioctl(0, TIOCSETC, &old_tchars);
- }
-}
-
-#endif /* HAVE_TCGETATTR */
-
static void
TTYflush(void)
{
if (ScreenCount) {
- (void)write(1, Screen, ScreenCount);
+ DEBUG_Output(DBG_CHN_MESG, Screen, ScreenCount);
ScreenCount = 0;
}
}
@@ -276,7 +206,7 @@
TTYget(void)
{
CHAR c;
- int retv;
+ DWORD retv;
TTYflush();
if (Pushed) {
@@ -286,16 +216,22 @@
if (*Input)
return *Input++;
- while ( ( retv = read( 0, &c, (size_t)1 ) ) == -1 )
- {
- if ( errno != EINTR )
- {
- perror( "read" );
- return EOF;
- }
+ for (;;) {
+ /* data available ? */
+ if (ReadConsole(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &retv, NULL) &&
+ retv == 1)
+ return c;
+ switch (WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE)) {
+ case WAIT_OBJECT_0:
+ break;
+ default:
+ DEBUG_Printf(DBG_CHN_FIXME, "shouldn't happen\n");
+ /* fall thru */
+ case WAIT_ABANDONED:
+ case WAIT_TIMEOUT:
+ return EOF;
+ }
}
-
- return retv == 1 ? c : EOF;
}
#define TTYback() (backspace ? TTYputs((CHAR *)backspace) : TTYput('\b'))
@@ -310,55 +246,9 @@
static void
TTYinfo(void)
{
- static int init;
-#if defined(USE_TERMCAP)
- char *term;
- char buff[2048];
- char *bp;
-#endif /* defined(USE_TERMCAP) */
-#if defined(TIOCGWINSZ)
- struct winsize W;
-#endif /* defined(TIOCGWINSZ) */
-
- if (init) {
-#if defined(TIOCGWINSZ)
- /* Perhaps we got resized. */
- if (ioctl(0, TIOCGWINSZ, &W) >= 0
- && W.ws_col > 0 && W.ws_row > 0) {
- TTYwidth = (int)W.ws_col;
- TTYrows = (int)W.ws_row;
- }
-#endif /* defined(TIOCGWINSZ) */
- return;
- }
- init++;
-
- TTYwidth = TTYrows = 0;
-#if defined(USE_TERMCAP)
- bp = &buff[0];
- if ((term = getenv("TERM")) == NULL)
- term = "dumb";
- if (tgetent(buff, term) < 0) {
- TTYwidth = SCREEN_WIDTH;
- TTYrows = SCREEN_ROWS;
- return;
- }
- backspace = tgetstr("le", &bp);
- TTYwidth = tgetnum("co");
- TTYrows = tgetnum("li");
-#endif /* defined(USE_TERMCAP) */
-
-#if defined(TIOCGWINSZ)
- if (ioctl(0, TIOCGWINSZ, &W) >= 0) {
- TTYwidth = (int)W.ws_col;
- TTYrows = (int)W.ws_row;
- }
-#endif /* defined(TIOCGWINSZ) */
-
- if (TTYwidth <= 0 || TTYrows <= 0) {
- TTYwidth = SCREEN_WIDTH;
- TTYrows = SCREEN_ROWS;
- }
+ COORD c = GetLargestConsoleWindowSize(GetStdHandle(STD_INPUT_HANDLE));
+ TTYwidth = c.x;
+ TTYrows = c.y;
}