From: corinna Date: Tue, 5 Mar 2002 08:15:24 +0000 (+0000) Subject: * include/sys/termios.h: Define _POSIX_VDISABLE. Define CCEQ macro. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=2df497e0264dd189eb9702fe816887a1dfd9922f;p=pf3gnuchains%2Fpf3gnuchains3x.git * include/sys/termios.h: Define _POSIX_VDISABLE. Define CCEQ macro. * fhandler_termios.cc: Include . (line_edit): Recognize disabled c_cc[] chars. Ignore VDISCARD when not in ICANON mode. --- diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 19ba572c0e..7a8838dce2 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2002-03-04 Christian Lestrade + + * include/sys/termios.h: Define _POSIX_VDISABLE. Define CCEQ macro. + * fhandler_termios.cc: Include . + (line_edit): Recognize disabled c_cc[] chars. Ignore VDISCARD when + not in ICANON mode. + 2002-03-04 Dmitry Timoshkov * syscalls.cc (truncate64): Use ftruncate64 directly to not lose diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc index 2407238e7c..fb8c2e09f1 100644 --- a/winsup/cygwin/fhandler_termios.cc +++ b/winsup/cygwin/fhandler_termios.cc @@ -9,6 +9,7 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ #include "winsup.h" +#include #include #include #include @@ -226,11 +227,11 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept) if (tc->ti.c_lflag & ISIG) { int sig; - if (c == tc->ti.c_cc[VINTR]) + if (CCEQ(tc->ti.c_cc[VINTR], c)) sig = SIGINT; - else if (c == tc->ti.c_cc[VQUIT]) + else if (CCEQ(tc->ti.c_cc[VQUIT], c)) sig = SIGQUIT; - else if (c == tc->ti.c_cc[VSUSP]) + else if (CCEQ(tc->ti.c_cc[VSUSP], c)) sig = SIGTSTP; else goto not_a_sig; @@ -245,7 +246,7 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept) not_a_sig: if (tc->ti.c_iflag & IXON) { - if (c == tc->ti.c_cc[VSTOP]) + if (CCEQ(tc->ti.c_cc[VSTOP], c)) { if (!tc->output_stopped) { @@ -254,7 +255,7 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept) } continue; } - else if (c == tc->ti.c_cc[VSTART]) + else if (CCEQ(tc->ti.c_cc[VSTART], c)) { restart_output: tc->output_stopped = 0; @@ -264,20 +265,20 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept) else if ((tc->ti.c_iflag & IXANY) && tc->output_stopped) goto restart_output; } - if (tc->ti.c_lflag & IEXTEN && c == tc->ti.c_cc[VDISCARD]) + if (iscanon && tc->ti.c_lflag & IEXTEN && CCEQ(tc->ti.c_cc[VDISCARD], c)) { tc->ti.c_lflag ^= FLUSHO; continue; } if (!iscanon) /* nothing */; - else if (c == tc->ti.c_cc[VERASE]) + else if (CCEQ(tc->ti.c_cc[VERASE], c)) { if (eat_readahead (1)) echo_erase (); continue; } - else if (c == tc->ti.c_cc[VWERASE]) + else if (CCEQ(tc->ti.c_cc[VWERASE], c)) { int ch; do @@ -288,7 +289,7 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept) while ((ch = peek_readahead (1)) >= 0 && !isspace (ch)); continue; } - else if (c == tc->ti.c_cc[VKILL]) + else if (CCEQ(tc->ti.c_cc[VKILL], c)) { int nchars = eat_readahead (-1); if (tc->ti.c_lflag & ECHO) @@ -296,7 +297,7 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept) echo_erase (1); continue; } - else if (c == tc->ti.c_cc[VREPRINT]) + else if (CCEQ(tc->ti.c_cc[VREPRINT], c)) { if (tc->ti.c_lflag & ECHO) { @@ -305,14 +306,14 @@ fhandler_termios::line_edit (const char *rptr, int nread, int always_accept) } continue; } - else if (c == tc->ti.c_cc[VEOF]) + else if (CCEQ(tc->ti.c_cc[VEOF], c)) { termios_printf ("EOF"); input_done = 1; continue; } - else if (c == tc->ti.c_cc[VEOL] || - c == tc->ti.c_cc[VEOL2] || + else if (CCEQ(tc->ti.c_cc[VEOL], c) || + CCEQ(tc->ti.c_cc[VEOL2], c) || c == '\n') { set_input_done (1); diff --git a/winsup/cygwin/include/sys/termios.h b/winsup/cygwin/include/sys/termios.h index a87f10627f..c37776111d 100644 --- a/winsup/cygwin/include/sys/termios.h +++ b/winsup/cygwin/include/sys/termios.h @@ -195,6 +195,14 @@ details. */ #define NCCS 18 +/* `c_cc' member of 'struct termios' structure can be disabled by + using the value _POSIX_VDISABLE. */ +#define _POSIX_VDISABLE '\0' + +/* Compare a character C to a value VAL from the `c_cc' array in a + `struct termios'. If VAL is _POSIX_VDISABLE, no character can match it. */ +#define CCEQ(val, c) ((c) == (val) && (val) != _POSIX_VDISABLE) + typedef unsigned char cc_t; typedef unsigned int tcflag_t; typedef unsigned int speed_t;