Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2002-03-05 11:15:28 +0300
committerCorinna Vinschen <corinna@vinschen.de>2002-03-05 11:15:28 +0300
commitad2864f4c8dd5157dad2011483c4076416a80f4c (patch)
tree91247897fcc07860d690839224fc1314fb2e225b /winsup
parent8cd4824313b12ec2b243bd4cc8c0b4bc5b2f796d (diff)
* include/sys/termios.h: Define _POSIX_VDISABLE. Define CCEQ macro.
* fhandler_termios.cc: Include <sys/termios.h>. (line_edit): Recognize disabled c_cc[] chars. Ignore VDISCARD when not in ICANON mode.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/fhandler_termios.cc27
-rw-r--r--winsup/cygwin/include/sys/termios.h8
3 files changed, 29 insertions, 13 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 19ba572c0..7a8838dce 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,10 @@
+2002-03-04 Christian Lestrade <christian.lestrade@free.fr>
+
+ * include/sys/termios.h: Define _POSIX_VDISABLE. Define CCEQ macro.
+ * fhandler_termios.cc: Include <sys/termios.h>.
+ (line_edit): Recognize disabled c_cc[] chars. Ignore VDISCARD when
+ not in ICANON mode.
+
2002-03-04 Dmitry Timoshkov <dmitry@baikal.ru>
* syscalls.cc (truncate64): Use ftruncate64 directly to not lose
diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc
index 2407238e7..fb8c2e09f 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 <sys/termios.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
@@ -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 a87f10627..c37776111 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;