[Ttssh2-commit] [8919] 改行変換を ttlib へ移動

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 8月 22日 (土) 00:24:32 JST


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\x97񂪁Atext\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) {


Ttssh2-commit メーリングリストの案内
Back to archive index