[PATCH] line_edit return value
Steve O
bub@io.com
Sat Nov 30 14:55:00 GMT 2002
On Sat, Nov 30, 2002 at 05:26:03PM -0500, Christopher Faylor wrote:
> P.S. Btw, did you notice that the return value for accept_input
> is not being used, AFAICT? I had always wanted to do something
> with that but it never seemed to be necessary.
Yep, about 5 or 6 patches from now, I am thinking of using
the return value to signal that accept_input didn't work.
Here's the next patch. It shouldn't change the code behavior at all
but lays some ground work for having line_edit return an error condition.
Thanks,
-steve
ChangeLog entry
2002-11-30 Steve Osborn <bub@io.com>
* fhandler.h (fhandler_termios::line_edit): Changed return
from an int to an enum to allow the function to return an
error.
* fhandler_console.cc (fhandler_console::read): Updated the
line_edit call to use the new enum.
* fhandler_termios.cc (fhandler_termios::line_edit): Changed
return from an int to an enum to allow the function to return an
error. Put put_readahead call before doecho for future patch.
* fhandler_tty.cc (fhandler_pty_master::write): Changed to
call line_edit one character at a time, and stop if an error
occurs.
-------------- next part --------------
Index: cygwin/fhandler.h
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/fhandler.h,v
retrieving revision 1.146
diff -u -p -r1.146 fhandler.h
--- cygwin/fhandler.h 9 Nov 2002 03:17:40 -0000 1.146
+++ cygwin/fhandler.h 30 Nov 2002 22:32:19 -0000
@@ -118,6 +118,14 @@ typedef struct __DIR DIR;
struct dirent;
struct iovec;
+enum line_edit_status
+{
+ line_edit_signalled = -1,
+ line_edit_ok = 0,
+ line_edit_input_done = 1,
+ line_edit_error = 2
+};
+
enum bg_check_types
{
bg_error = -1,
@@ -693,7 +701,7 @@ class fhandler_termios: public fhandler_
set_need_fork_fixup ();
}
HANDLE& get_output_handle () { return output_handle; }
- int line_edit (const char *rptr, int nread, int always_accept = 0);
+ line_edit_status line_edit (const char *rptr, int nread, int always_accept = 0);
void set_output_handle (HANDLE h) { output_handle = h; }
void tcinit (tty_min *this_tc, int force = FALSE);
virtual int is_tty () { return 1; }
Index: cygwin/fhandler_console.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/fhandler_console.cc,v
retrieving revision 1.96
diff -u -p -r1.96 fhandler_console.cc
--- cygwin/fhandler_console.cc 15 Nov 2002 04:35:13 -0000 1.96
+++ cygwin/fhandler_console.cc 30 Nov 2002 22:32:23 -0000
@@ -457,10 +457,10 @@ fhandler_console::read (void *pv, size_t
if (toadd)
{
- int res = line_edit (toadd, nread);
- if (res < 0)
+ line_edit_status res = line_edit (toadd, nread);
+ if (res == line_edit_signalled)
goto sig_exit;
- else if (res)
+ else if (res == line_edit_input_done)
break;
}
#undef ich
Index: cygwin/fhandler_termios.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/fhandler_termios.cc,v
retrieving revision 1.33
diff -u -p -r1.33 fhandler_termios.cc
--- cygwin/fhandler_termios.cc 23 Sep 2002 00:31:30 -0000 1.33
+++ cygwin/fhandler_termios.cc 30 Nov 2002 22:32:24 -0000
@@ -186,9 +186,10 @@ fhandler_termios::echo_erase (int force)
doecho ("\b \b", 3);
}
-int
+line_edit_status
fhandler_termios::line_edit (const char *rptr, int nread, int always_accept)
{
+ line_edit_status ret = line_edit_ok;
char c;
int input_done = 0;
bool sawsig = FALSE;
@@ -321,20 +322,23 @@ fhandler_termios::line_edit (const char
if (tc->ti.c_iflag & IUCLC && isupper (c))
c = cyg_tolower (c);
+ put_readahead (c);
if (tc->ti.c_lflag & ECHO)
doecho (&c, 1);
- put_readahead (c);
}
if (!iscanon || always_accept)
set_input_done (ralen > 0);
if (sawsig)
- input_done = -1;
+ ret = line_edit_signalled;
else if (input_done)
- (void) accept_input ();
+ {
+ ret = line_edit_input_done;
+ (void) accept_input ();
+ }
- return input_done;
+ return ret;
}
void
Index: cygwin/fhandler_tty.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/fhandler_tty.cc,v
retrieving revision 1.80
diff -u -p -r1.80 fhandler_tty.cc
--- cygwin/fhandler_tty.cc 30 Nov 2002 22:23:01 -0000 1.80
+++ cygwin/fhandler_tty.cc 30 Nov 2002 22:32:26 -0000
@@ -1077,8 +1077,12 @@ fhandler_pty_master::close ()
int
fhandler_pty_master::write (const void *ptr, size_t len)
{
- (void) line_edit ((char *) ptr, len);
- return len;
+ size_t i;
+ char *p = (char *) ptr;
+ for (i=0; i<len; i++)
+ if (line_edit (p++, 1) == line_edit_error)
+ break;
+ return i;
}
int __stdcall
More information about the Cygwin-patches
mailing list