Revision: 8919 https://osdn.net/projects/ttssh2/scm/svn/commits/8919 Author: zmatsuo Date: 2020-08-22 00:24:32 +0900 (Sat, 22 Aug 2020) Log Message: ----------- 改行変換を ttlib へ移動 - wchar_t *NormalizeLineBreakCR(const wchar_t *src, size_t *len); - wchar_t *NormalizeLineBreakCRLF(const wchar_t *src_); Modified Paths: -------------- trunk/teraterm/common/ttlib.h trunk/teraterm/common/ttlib_static_cpp.cpp trunk/teraterm/teraterm/clipboar.c trunk/teraterm/teraterm/sendmem.cpp -------------- next part -------------- Modified: trunk/teraterm/common/ttlib.h =================================================================== --- trunk/teraterm/common/ttlib.h 2020-08-21 15:24:19 UTC (rev 8918) +++ trunk/teraterm/common/ttlib.h 2020-08-21 15:24:32 UTC (rev 8919) @@ -163,6 +163,8 @@ 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); +wchar_t *NormalizeLineBreakCR(const wchar_t *src, size_t *len); +wchar_t *NormalizeLineBreakCRLF(const wchar_t *src_); #ifdef __cplusplus } Modified: trunk/teraterm/common/ttlib_static_cpp.cpp =================================================================== --- trunk/teraterm/common/ttlib_static_cpp.cpp 2020-08-21 15:24:19 UTC (rev 8918) +++ trunk/teraterm/common/ttlib_static_cpp.cpp 2020-08-21 15:24:32 UTC (rev 8919) @@ -443,3 +443,137 @@ } } } + +/* + * \x95\xB6\x8E\x9A\x97\xF1\x82̉\xFC\x8Ds\x83R\x81[\x83h\x82\xF0CR(0x0d)\x82\xBE\x82\xAF\x82ɂ\xB7\x82\xE9 + * + * @param [in] *src \x93\xFC\x97͕\xB6\x8E\x9A\x97\xF1\x82ւ̃|\x83C\x83\x93\x83^ + * @param [in] *len \x93\xFC\x97͕\xB6\x8E\x9A\x97\xF1\x92\xB7 + * NULL \x82܂\xBD\x82\xCD 0 \x82̂Ƃ\xAB\x93\xE0\x95\x94\x82ŕ\xB6\x8E\x9A\x97𑪂邱\x82̎\x9EL'\0'\x82͕K\x90{ + * @param [out] *len \x8Fo\x97͕\xB6\x8E\x9A\x97\xF1\x92\xB7(wcslen()\x82Ɠ\xAF\x82\xB6) + * NULL \x82̂Ƃ\xAB\x8Fo\x97͂\xB3\x82\xEA\x82Ȃ\xA2 + * @return \x95ϊ\xB7\x8C㕶\x8E\x9A\x97\xF1(malloc()\x82\xB3\x82ꂽ\x97̈\xE6,free()\x82\xB7\x82邱\x82\xC6) + * NULL \x83\x81\x83\x82\x83\x8A\x82\xAA\x8Am\x95ۂł\xAB\x82Ȃ\xA9\x82\xC1\x82\xBD + * + * \x93\xFC\x97͕\xB6\x8E\x9A\x97̎w\x92肪\x82\xA0\x82鎞 + * \x93\xFC\x97͕\xB6\x8E\x9A\x97\xF1\x82̓r\x92\x86\x82\xC5 L'\0' \x82\xAA\x8C\xA9\x82\xA9\x82\xC1\x82\xBD\x82\xE7\x81A\x82\xBB\x82\xB1\x82ŕϊ\xB7\x82\xF0\x8FI\x97\xB9\x82\xB7\x82\xE9 + * \x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xA2\x82Ƃ\xAB\x82͓\xFC\x97͕\xB6\x8E\x9A\x90\x94\x95\xAA\x95ϊ\xB7(\x8DŌ\xE3\x82\xC9L'\0'\x82͕t\x89\xC1\x82\xB3\x82\xEA\x82Ȃ\xA2) + */ +wchar_t *NormalizeLineBreakCR(const wchar_t *src, size_t *len) +{ +#define CR 0x0D +#define LF 0x0A + size_t src_len = 0; + if (len != NULL) { + src_len = *len; + } + if (src_len == 0) { + src_len = wcslen(src) + 1; + } + wchar_t *dest_top = (wchar_t *)malloc(sizeof(wchar_t) * src_len); + if (dest_top == NULL) { + *len = 0; + return NULL; + } + + const wchar_t *p = src; + const wchar_t *p_end = src + src_len; + wchar_t *dest = dest_top; + BOOL find_eos = FALSE; + while (p < p_end) { + wchar_t c = *p++; + if (c == CR) { + if (*p == LF) { + // CR+LF -> CR + p++; + *dest++ = CR; + } else { + // CR -> CR + *dest++ = CR; + } + } + else if (c == LF) { + // LF -> CR + *dest++ = CR; + } + else if (c == 0) { + // EOS\x82\xF0\x8C\xA9\x82\xAF\x82\xBD\x82Ƃ\xAB\x82͑ł\xBF\x90\xE9 + *dest++ = 0; + find_eos = TRUE; + break; + } + else { + *dest++ = c; + } + } + + if (len != NULL) { + *len = dest - dest_top; + if (find_eos) { + *len = *len - 1; + } + } + return dest_top; +} + +/** + * \x89\xFC\x8Ds\x83R\x81[\x83h\x82\xF0 CR+LF \x82ɕϊ\xB7\x82\xB7\x82\xE9 + * @return \x95ϊ\xB7\x82\xB3\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1 + */ +wchar_t *NormalizeLineBreakCRLF(const wchar_t *src_) +{ + const wchar_t *src = src_; + wchar_t *dest_top; + wchar_t *dest; + size_t len, need_len, alloc_len; + + // \x93\\x82\xE8\x95t\x82\xAF\x83f\x81[\x83^\x82̒\xB7\x82\xB3(len)\x81A\x82\xA8\x82\xE6\x82ѐ\xB3\x8BK\x89\xBB\x8C\xE3\x82̃f\x81[\x83^\x82̒\xB7\x82\xB3(need_len)\x82̃J\x83E\x83\x93\x83g + for (len=0, need_len=0, src=src_; *src != '\0'; src++, len++, need_len++) { + if (*src == CR) { + need_len++; + if (*(src+1) == LF) { + len++; + src++; + } + } + else if (*src == LF) { + need_len++; + } + } + + // \x90\xB3\x8BK\x89\xBB\x8C\xE3\x82\xE0\x83f\x81[\x83^\x92\xB7\x82\xAA\x95ς\xED\x82\xE7\x82Ȃ\xA2 => \x90\xB3\x8BK\x89\xBB\x82͕K\x97v\x82Ȃ\xB5 + if (need_len == len) { + dest = _wcsdup(src_); + return dest; + } + alloc_len = need_len + 1; + + dest_top = (wchar_t *)malloc(sizeof(wchar_t) * alloc_len); + + src = src_ + len - 1; + dest = dest_top + need_len; + *dest-- = '\0'; + + while (len > 0 && dest_top <= dest) { + if (*src == LF) { + *dest-- = *src--; + if (--len == 0) { + *dest = CR; + break; + } + if (*src != CR) { + *dest-- = CR; + continue; + } + } + else if (*src == CR) { + *dest-- = LF; + if (src == dest) + break; + } + *dest-- = *src--; + len--; + } + + return dest_top; +} Modified: trunk/teraterm/teraterm/clipboar.c =================================================================== --- trunk/teraterm/teraterm/clipboar.c 2020-08-21 15:24:19 UTC (rev 8918) +++ trunk/teraterm/teraterm/clipboar.c 2020-08-21 15:24:32 UTC (rev 8919) @@ -126,68 +126,6 @@ } /** - * \x89\xFC\x8Ds\x83R\x81[\x83h\x82\xF0 CR+LF \x82ɕϊ\xB7\x82\xB7\x82\xE9 - * @return \x95ϊ\xB7\x82\xB3\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1 - */ -static wchar_t *NormalizeLineBreakW(const wchar_t *src_) -{ - const wchar_t *src = src_; - wchar_t *dest_top; - wchar_t *dest; - size_t len, need_len, alloc_len; - - // \x93\\x82\xE8\x95t\x82\xAF\x83f\x81[\x83^\x82̒\xB7\x82\xB3(len)\x81A\x82\xA8\x82\xE6\x82ѐ\xB3\x8BK\x89\xBB\x8C\xE3\x82̃f\x81[\x83^\x82̒\xB7\x82\xB3(need_len)\x82̃J\x83E\x83\x93\x83g - for (len=0, need_len=0, src=src_; *src != '\0'; src++, len++, need_len++) { - if (*src == CR) { - need_len++; - if (*(src+1) == LF) { - len++; - src++; - } - } - else if (*src == LF) { - need_len++; - } - } - - // \x90\xB3\x8BK\x89\xBB\x8C\xE3\x82\xE0\x83f\x81[\x83^\x92\xB7\x82\xAA\x95ς\xED\x82\xE7\x82Ȃ\xA2 => \x90\xB3\x8BK\x89\xBB\x82͕K\x97v\x82Ȃ\xB5 - if (need_len == len) { - dest = _wcsdup(src_); - return dest; - } - alloc_len = need_len + 1; - - dest_top = (wchar_t *)malloc(sizeof(wchar_t) * alloc_len); - - src = src_ + len - 1; - dest = dest_top + need_len; - *dest-- = '\0'; - - while (len > 0 && dest_top <= dest) { - if (*src == LF) { - *dest-- = *src--; - if (--len == 0) { - *dest = CR; - break; - } - if (*src != CR) { - *dest-- = CR; - continue; - } - } - else if (*src == CR) { - *dest-- = LF; - if (src == dest) - break; - } - *dest-- = *src--; - len--; - } - - return dest_top; -} - -/** * \x83t\x83@\x83C\x83\x8B\x82ɒ\xE8\x8B`\x82\xB3\x82ꂽ\x95\xB6\x8E\x9A\x97Atext\x82Ɋ܂܂\xEA\x82邩\x82ׂ\xE9\x81B * \x8C\xA9\x82\xA9\x82\xEA\x82\xCE TRUE\x82\xF0\x95Ԃ\xB7 */ @@ -357,8 +295,8 @@ } { - // \x89\xFC\x8Ds\x82𐳋K\x89\xBB - wchar_t *dest = NormalizeLineBreakW(str_w); + // \x89\xFC\x8Ds\x82\xF0 CR+LF \x82ɐ\xB3\x8BK\x89\xBB\x81A\x83_\x83C\x83A\x83\x8D\x83O\x82ʼn\xFC\x8Ds\x82𐳂\xB5\x82\xAD\x95\\x8E\xA6\x82\xB7\x82邽\x82\xDF + wchar_t *dest = NormalizeLineBreakCRLF(str_w); free(str_w); str_w = dest; } Modified: trunk/teraterm/teraterm/sendmem.cpp =================================================================== --- trunk/teraterm/teraterm/sendmem.cpp 2020-08-21 15:24:19 UTC (rev 8918) +++ trunk/teraterm/teraterm/sendmem.cpp 2020-08-21 15:24:32 UTC (rev 8919) @@ -406,66 +406,6 @@ } } -/* - * \x95\xB6\x8E\x9A\x97\xF1\x82̉\xFC\x8Ds\x83R\x81[\x83h\x82\xF0CR(0x0d)\x82\xBE\x82\xAF\x82ɂ\xB7\x82\xE9 - * - * @param [in] *src \x93\xFC\x97͕\xB6\x8E\x9A\x97\xF1\x82ւ̃|\x83C\x83\x93\x83^ - * @param [in] *len \x93\xFC\x97͕\xB6\x8E\x9A\x97\xF1\x92\xB7(0\x82̂Ƃ\xAB\x93\xE0\x95\x94\x82ŕ\xB6\x8E\x9A\x97𑪂\xE9,L'\0'\x82\xE0\x95ϊ\xB7\x82\xB3\x82\xEA\x82\xE9) - * @param [out] *len \x8Fo\x97͕\xB6\x8E\x9A\x97\xF1\x92\xB7(\x93\xFC\x97͕\xB6\x8E\x9A\x97\xF1\x82̍Ō\xE3\x82\xCCL'\0'\x82\xE0\x8A܂\xDE) - * @return \x95ϊ\xB7\x8C㕶\x8E\x9A\x97\xF1(malloc\x82\xB3\x82ꂽ\x97̈\xE6) - * - * \x93\xFC\x97͕\xB6\x8E\x9A\x97̎w\x92肪\x82\xA0\x82鎞 - * \x93\xFC\x97͕\xB6\x8E\x9A\x97\xF1\x82̓r\x92\x86\x82\xC5 L'\0' \x82\xAA\x8C\xA9\x82\xA9\x82\xC1\x82\xBD\x82\xE7\x81A\x82\xBB\x82\xB1\x82ŕϊ\xB7\x82\xF0\x8FI\x97\xB9\x82\xB7\x82\xE9 - * \x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xA2\x82Ƃ\xAB\x82͓\xFC\x97͕\xB6\x8E\x9A\x90\x94\x95\xAA\x95ϊ\xB7(\x8DŌ\xE3\x82\xC9L'\0'\x82͕t\x89\xC1\x82\xB3\x82\xEA\x82Ȃ\xA2) - */ -static wchar_t *NormalizeLineBreak(const wchar_t *src, size_t *len) -{ - size_t src_len = *len; - if (src_len == 0) { - src_len = wcslen(src) + 1; - } - wchar_t *dest_top = (wchar_t *)malloc(sizeof(wchar_t) * src_len); - if (dest_top == NULL) { - *len = 0; - return NULL; - } - - // CR+LF -> LF - // CR -> LF - // LF -> LF (\x95ϊ\xB7\x95s\x97v) - const wchar_t *p = src; - const wchar_t *p_end = src + src_len; - wchar_t *dest = dest_top; - while (p < p_end) { - wchar_t c = *p++; - if (c == CR) { - if (*p == LF) { - // CR+LF -> CR - p++; - *dest++ = CR; - } else { - // CR -> CR - *dest++ = CR; - } - } - else if (c == LF) { - // LF -> CR - *dest++ = CR; - } - else if (c == 0) { - // EOS\x82\xF0\x8C\xA9\x82\xAF\x82\xBD\x82Ƃ\xAB\x82͑ł\xBF\x90\xE9 - *dest++ = 0; - break; - } - else { - *dest++ = c; - } - } - - *len = dest - dest_top; - return dest_top; -} - /** * \x8F\x89\x8A\xFA\x89\xBB */ @@ -522,7 +462,7 @@ // \x89\xFC\x8Ds\x83R\x81[\x83h\x82\xAE\x82\xB5\x82Ă\xA8\x82\xAD size_t new_len = len; - wchar_t *new_str = NormalizeLineBreak((wchar_t *)str, &new_len); + wchar_t *new_str = NormalizeLineBreakCR((wchar_t *)str, &new_len); if (new_str == NULL || new_len == 0) { // \x95ϊ\xB7\x82ł\xAB\x82Ȃ\xA9\x82\xC1\x82\xBD?(\x95ϊ\xB7\x92\xB7\x82\xB30?) if (new_str != NULL) {