[PATCH 3/5] Cygwin: pty: Unify the charset conversion codes into a function.
Takashi Yano
takashi.yano@nifty.ne.jp
Wed Sep 18 14:33:00 GMT 2019
---
winsup/cygwin/fhandler_tty.cc | 130 +++++++++++++---------------------
1 file changed, 49 insertions(+), 81 deletions(-)
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 843807aab..f723ec7cf 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -370,7 +370,43 @@ CreateProcessW_Hooked
void set_ishybrid_and_switch_to_pcon (HANDLE) {}
#endif /* USE_API_HOOK */
-bool
+static char *
+convert_mb_str (UINT cp_to, size_t *len_to,
+ UINT cp_from, const char *ptr_from, size_t len_from)
+{
+ char *buf;
+ size_t nlen;
+ if (cp_to != cp_from)
+ {
+ size_t wlen =
+ MultiByteToWideChar (cp_from, 0, ptr_from, len_from, NULL, 0);
+ wchar_t *wbuf = (wchar_t *)
+ HeapAlloc (GetProcessHeap (), 0, wlen * sizeof (wchar_t));
+ wlen =
+ MultiByteToWideChar (cp_from, 0, ptr_from, len_from, wbuf, wlen);
+ nlen = WideCharToMultiByte (cp_to, 0, wbuf, wlen, NULL, 0, NULL, NULL);
+ buf = (char *) HeapAlloc (GetProcessHeap (), 0, nlen);
+ nlen = WideCharToMultiByte (cp_to, 0, wbuf, wlen, buf, nlen, NULL, NULL);
+ HeapFree (GetProcessHeap (), 0, wbuf);
+ }
+ else
+ {
+ /* Just copy */
+ buf = (char *) HeapAlloc (GetProcessHeap (), 0, len_from);
+ memcpy (buf, ptr_from, len_from);
+ nlen = len_from;
+ }
+ *len_to = nlen;
+ return buf;
+}
+
+static void
+mb_str_free (char *ptr)
+{
+ HeapFree (GetProcessHeap (), 0, ptr);
+}
+
+static bool
bytes_available (DWORD& n, HANDLE h)
{
DWORD navail, nleft;
@@ -1270,34 +1306,11 @@ fhandler_pty_slave::write (const void *ptr, size_t len)
reset_switch_to_pcon ();
- char *buf;
- ssize_t nlen;
- UINT targetCodePage = get_ttyp ()->switch_to_pcon_out ?
+ UINT target_code_page = get_ttyp ()->switch_to_pcon_out ?
GetConsoleOutputCP () : get_ttyp ()->term_code_page;
- if (targetCodePage != get_ttyp ()->term_code_page)
- {
- size_t wlen =
- MultiByteToWideChar (get_ttyp ()->term_code_page, 0,
- (char *)ptr, len, NULL, 0);
- wchar_t *wbuf = (wchar_t *)
- HeapAlloc (GetProcessHeap (), 0, wlen * sizeof (wchar_t));
- wlen =
- MultiByteToWideChar (get_ttyp ()->term_code_page, 0,
- (char *)ptr, len, wbuf, wlen);
- nlen = WideCharToMultiByte (targetCodePage, 0,
- wbuf, wlen, NULL, 0, NULL, NULL);
- buf = (char *) HeapAlloc (GetProcessHeap (), 0, nlen);
- nlen = WideCharToMultiByte (targetCodePage, 0,
- wbuf, wlen, buf, nlen, NULL, NULL);
- HeapFree (GetProcessHeap (), 0, wbuf);
- }
- else
- {
- /* Just copy */
- buf = (char *) HeapAlloc (GetProcessHeap (), 0, len);
- memcpy (buf, (char *)ptr, len);
- nlen = len;
- }
+ ssize_t nlen;
+ char *buf = convert_mb_str (target_code_page, (size_t *) &nlen,
+ get_ttyp ()->term_code_page, (const char *) ptr, len);
/* If not attached to this pseudo console, try to attach temporarily. */
pid_restore = 0;
@@ -1334,7 +1347,7 @@ fhandler_pty_slave::write (const void *ptr, size_t len)
towrite = -1;
}
release_output_mutex ();
- HeapFree (GetProcessHeap (), 0, buf);
+ mb_str_free (buf);
flags = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (get_ttyp ()->switch_to_pcon_out && !fallback)
SetConsoleMode (get_output_handle (), dwMode | flags);
@@ -2260,33 +2273,10 @@ fhandler_pty_master::write (const void *ptr, size_t len)
if current application is native console application. */
if (to_be_read_from_pcon ())
{
- char *buf;
size_t nlen;
+ char *buf = convert_mb_str
+ (CP_UTF8, &nlen, get_ttyp ()->term_code_page, (const char *) ptr, len);
- if (get_ttyp ()->term_code_page != CP_UTF8)
- {
- size_t wlen =
- MultiByteToWideChar (get_ttyp ()->term_code_page, 0,
- (char *)ptr, len, NULL, 0);
- wchar_t *wbuf = (wchar_t *)
- HeapAlloc (GetProcessHeap (), 0, wlen * sizeof (wchar_t));
- wlen =
- MultiByteToWideChar (get_ttyp ()->term_code_page, 0,
- (char *)ptr, len, wbuf, wlen);
- nlen = WideCharToMultiByte (CP_UTF8, 0,
- wbuf, wlen, NULL, 0, NULL, NULL);
- buf = (char *) HeapAlloc (GetProcessHeap (), 0, nlen);
- nlen = WideCharToMultiByte (CP_UTF8, 0,
- wbuf, wlen, buf, nlen, NULL, NULL);
- HeapFree (GetProcessHeap (), 0, wbuf);
- }
- else
- {
- /* Just copy */
- buf = (char *) HeapAlloc (GetProcessHeap (), 0, len);
- memcpy (buf, (char *)ptr, len);
- nlen = len;
- }
DWORD wLen;
WriteFile (to_slave, buf, nlen, &wLen, NULL);
@@ -2302,7 +2292,7 @@ fhandler_pty_master::write (const void *ptr, size_t len)
else
SetEvent (input_available_event);
- HeapFree (GetProcessHeap (), 0, buf);
+ mb_str_free (buf);
return len;
}
@@ -3039,32 +3029,10 @@ fhandler_pty_master::pty_master_fwd_thread ()
}
wlen = rlen;
- char *buf;
size_t nlen;
- if (get_ttyp ()->term_code_page != CP_UTF8)
- {
- size_t wlen2 =
- MultiByteToWideChar (CP_UTF8, 0,
- (char *)ptr, wlen, NULL, 0);
- wchar_t *wbuf = (wchar_t *)
- HeapAlloc (GetProcessHeap (), 0, wlen2 * sizeof (wchar_t));
- wlen2 =
- MultiByteToWideChar (CP_UTF8, 0,
- (char *)ptr, wlen, wbuf, wlen2);
- nlen = WideCharToMultiByte (get_ttyp ()->term_code_page, 0,
- wbuf, wlen2, NULL, 0, NULL, NULL);
- buf = (char *) HeapAlloc (GetProcessHeap (), 0, nlen);
- nlen = WideCharToMultiByte (get_ttyp ()->term_code_page, 0,
- wbuf, wlen2, buf, nlen, NULL, NULL);
- HeapFree (GetProcessHeap (), 0, wbuf);
- }
- else
- {
- /* Just copy */
- buf = (char *) HeapAlloc (GetProcessHeap (), 0, wlen);
- memcpy (buf, (char *)ptr, wlen);
- nlen = wlen;
- }
+ char *buf = convert_mb_str
+ (get_ttyp ()->term_code_page, &nlen, CP_UTF8, ptr, wlen);
+
ptr = buf;
wlen = rlen = nlen;
@@ -3083,7 +3051,7 @@ fhandler_pty_master::pty_master_fwd_thread ()
wlen = (rlen -= written);
}
release_output_mutex ();
- HeapFree (GetProcessHeap (), 0, buf);
+ mb_str_free (buf);
continue;
}
acquire_output_mutex (INFINITE);
--
2.21.0
More information about the Cygwin-patches
mailing list