teraterm/common/ttlib.h | 1 + teraterm/common/ttlib_static_cpp.cpp | 38 ++++++++++++++++++++++++++++++++++++ teraterm/teraterm/clipboar.c | 4 ++-- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/teraterm/common/ttlib.h b/teraterm/common/ttlib.h index 75d78d2dc..be216e9cb 100644 --- a/teraterm/common/ttlib.h +++ b/teraterm/common/ttlib.h @@ -162,6 +162,7 @@ wchar_t *GetClipboardTextW(HWND hWnd, BOOL empty); char *GetClipboardTextA(HWND hWnd, BOOL empty); BOOL CBSetTextW(HWND hWnd, const wchar_t *str_w, size_t str_len); void TTInsertMenuItemA(HMENU hMenu, UINT targetItemID, UINT flags, UINT newItemID, const char *text, BOOL before); +BOOL IsTextW(const wchar_t *str, size_t len); #ifdef __cplusplus } diff --git a/teraterm/common/ttlib_static_cpp.cpp b/teraterm/common/ttlib_static_cpp.cpp index 93bdde513..6fd36ee73 100644 --- a/teraterm/common/ttlib_static_cpp.cpp +++ b/teraterm/common/ttlib_static_cpp.cpp @@ -103,6 +103,44 @@ int TTMessageBoxW(HWND hWnd, const TTMessageBoxInfoW *info, UINT uType, const ch return r; } +/** + * strがテキストかどうかチェック + * + * @param[in] str テストする文字 + * @param[in] len テストするテキスト長(L'\0'は含まない) + * 0のときL'\0'の前までテストする + * @retval TRUE テキストと思われる(長さ0のときも含む) + * FALSE テキストではない + * + * 検査するデータ内に0x20未満のテキストには出てこない文字があれば + * バイナリと判断 + * IsTextUnicode() のほうが良いか? + */ +BOOL IsTextW(const wchar_t *str, size_t len) +{ + if (len == 0) { + len = wcslen(str); + if (len == 0) { + return TRUE; + } + } + + BOOL result = TRUE; + while(len-- > 0) { + wchar_t c = *str++; + if (c >= 0x20) { + continue; + } + if ((7 <= c && c <= 0x0d) || c == 0x1b) { + /* \a, \b, \t, \n, \v, \f, \r, \e */ + continue; + } + result = FALSE; + break; + } + return result; +} + /** * クリップボードからwchar_t文字列を取得する * 文字列長が必要なときはwcslen()すること diff --git a/teraterm/teraterm/clipboar.c b/teraterm/teraterm/clipboar.c index c87e62ab3..d9051ba2a 100644 --- a/teraterm/teraterm/clipboar.c +++ b/teraterm/teraterm/clipboar.c @@ -345,7 +345,7 @@ void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed) CBEchoOnly = FALSE; str_w = GetClipboardTextW(HWin, FALSE); - if (str_w == NULL) { + if (str_w == NULL || !IsTextW(str_w, 0)) { // クリップボードから文字列を取得できなかった CBEndPaste(); return; @@ -419,7 +419,7 @@ void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer) CBEchoOnly = FALSE; str_w = GetClipboardTextW(HWin, FALSE); - if (str_w == NULL) { + if (str_w == NULL || !IsTextW(str_w, 0)) { // クリップボードから文字列を取得できなかった goto error; }