diff options
author | Christopher Faylor <me@cgf.cx> | 2009-05-04 03:51:16 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2009-05-04 03:51:16 +0000 |
commit | b65ec404a7aa5e036a7d4de415701be7a7efd5fc (patch) | |
tree | 99e6d92ad9acb068a818d96f387c219efaae8dfa /winsup/cygwin/fhandler_console.cc | |
parent | 1f5ea7a0db1b5bb4d0135898a7dfbda5c021f81d (diff) | |
download | newlib-b65ec404a7aa5e036a7d4de415701be7a7efd5fc.zip newlib-b65ec404a7aa5e036a7d4de415701be7a7efd5fc.tar.gz newlib-b65ec404a7aa5e036a7d4de415701be7a7efd5fc.tar.bz2 |
* fhandler.h (fhandler_console::MAX_WRITE_CHARS): Declare.
(fhandler_console::write_replacement_char): Declare as inline.
(fhandler_console::write_console): Declare new function.
* fhandler_console.cc (fhandler_console::MAX_WRITE_CHARS): Define.
(handler_console::write_console): Define.
(fhandler_console::write_replacement_char): Define as inline.
(fhandler_console::write_normal): Use write_console when writing buffers of
unknown length.
Diffstat (limited to 'winsup/cygwin/fhandler_console.cc')
-rw-r--r-- | winsup/cygwin/fhandler_console.cc | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc index 88c4d2c..616c17a 100644 --- a/winsup/cygwin/fhandler_console.cc +++ b/winsup/cygwin/fhandler_console.cc @@ -52,6 +52,8 @@ details. */ const char * get_nonascii_key (INPUT_RECORD&, char *); +const unsigned fhandler_console::MAX_WRITE_CHARS = 16384; + static console_state NO_COPY *shared_console_info; dev_console NO_COPY *fhandler_console::dev_state; @@ -1026,6 +1028,24 @@ fhandler_console::cursor_get (int *x, int *y) *x = dev_state->info.dwCursorPosition.X; } +inline +bool fhandler_console::write_console (PWCHAR buf, DWORD len, DWORD& done) +{ + while (len > 0) + { + DWORD nbytes = len > MAX_WRITE_CHARS ? MAX_WRITE_CHARS : len; + if (!WriteConsoleW (get_output_handle (), buf, nbytes, &done, 0)) + { + debug_printf ("write failed, handle %p", get_output_handle ()); + __seterrno (); + return false; + } + len -= done; + buf += done; + } + return true; +} + #define BAK 1 #define ESC 2 #define NOR 0 @@ -1421,7 +1441,7 @@ beep () /* This gets called when we found an invalid input character. We just print a half filled square (UTF 0x2592). We have no chance to figure out the "meaning" of the input char anyway. */ -void +inline void fhandler_console::write_replacement_char () { static const wchar_t replacement_char = 0x2592; /* Half filled square */ @@ -1489,7 +1509,12 @@ fhandler_console::write_normal (const unsigned char *src, buf_len = dev_state->str_to_con (f_mbtowc, charset, write_buf, (const char *) trunc_buf.buf, nfound - trunc_buf.buf); - WriteConsoleW (get_output_handle (), write_buf, buf_len, &done, 0); + if (!write_console (write_buf, buf_len, done)) + { + debug_printf ("multibyte sequence write failed, handle %p", get_output_handle ()); + __seterrno (); + return 0; + } found = src + (nfound - trunc_buf.buf - trunc_buf.len); trunc_buf.len = 0; return found; @@ -1543,19 +1568,12 @@ fhandler_console::write_normal (const unsigned char *src, scroll_screen (x, y, -1, y, x + buf_len, y); } - register PWCHAR buf = write_buf; - do + if (!write_console (write_buf, buf_len, done)) { - if (!WriteConsoleW (get_output_handle (), buf, buf_len, &done, 0)) - { - debug_printf ("write failed, handle %p", get_output_handle ()); - __seterrno (); - return 0; - } - buf_len -= done; - buf += done; + debug_printf ("write failed, handle %p", get_output_handle ()); + __seterrno (); + return 0; } - while (buf_len > 0); if (len >= CONVERT_LIMIT) return found; } @@ -1776,7 +1794,7 @@ fhandler_console::write (const void *vsrc, size_t len) } } - syscall_printf ("%d = write_console (,..%d)", len, len); + syscall_printf ("%d = fhandler_console::write (,..%d)", len, len); return len; } |