[ttssh2-commit] [10783] ウィンドウタイトルの設定を受信文字コードにしたがって行うよう修正

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 6月 27日 (火) 23:12:20 JST


Revision: 10783
          https://osdn.net/projects/ttssh2/scm/svn/commits/10783
Author:   zmatsuo
Date:     2023-06-27 23:12:20 +0900 (Tue, 27 Jun 2023)
Log Message:
-----------
ウィンドウタイトルの設定を受信文字コードにしたがって行うよう修正

- 修正前は UTF-8, SJIS, Japanese/EUC のみ対応だった

ticket #39743
ticket #39744

Ticket Links:
------------
    https://osdn.net/projects/ttssh2/tracker/detail/39743
    https://osdn.net/projects/ttssh2/tracker/detail/39744

Modified Paths:
--------------
    trunk/teraterm/teraterm/vtterm.c

-------------- next part --------------
Modified: trunk/teraterm/teraterm/vtterm.c
===================================================================
--- trunk/teraterm/teraterm/vtterm.c	2023-06-27 13:36:25 UTC (rev 10782)
+++ trunk/teraterm/teraterm/vtterm.c	2023-06-27 14:12:20 UTC (rev 10783)
@@ -4885,6 +4885,65 @@
 	}
 }
 
+typedef struct {
+	wchar_t *ptr;	// \x95ϊ\xB7\x8C㕶\x8E\x9A\x97\xF1\x83o\x83b\x83t\x83@\x82ւ̃|\x83C\x83\x93\x83^
+	size_t index;	// \x83o\x83b\x83t\x83@\x93\xE0\x82ɓ\xFC\x82\xC1\x82Ă\xA2\x82镶\x8E\x9A\x90\x94
+	size_t size;	// \x83o\x83b\x83t\x83@\x83T\x83C\x83Y
+} CharSetBuf;
+
+static void PutU32Buf(char32_t code, void *client_data)
+{
+	CharSetBuf *bufdata = (CharSetBuf *)client_data;
+	if (bufdata->index + 2 > bufdata->size) {
+		// \x83o\x83b\x83t\x83@\x83T\x83C\x83Y\x82\xF0\x8Ag\x92\xA3\x82\xB7\x82\xE9
+		const size_t add_size = 4;
+		wchar_t *new_ptr = (wchar_t *)realloc(bufdata->ptr, sizeof(wchar_t) * (bufdata->size + add_size));
+		if (new_ptr == NULL) {
+			return;
+		}
+		bufdata->size += add_size;
+		bufdata->ptr = new_ptr;
+	}
+	if (bufdata->index < bufdata->size) {
+		// UTF-16\x82ɕϊ\xB7\x82\xB5\x82ăo\x83b\x83t\x83@\x82ɓ\xFC\x82\xEA\x82\xE9
+		wchar_t *w16_str = &bufdata->ptr[bufdata->index];
+		size_t u16_len = UTF32ToUTF16(code, w16_str, 2);
+		bufdata->index += u16_len;
+	}
+}
+
+static void ParseControlBuf(BYTE b, void *client_data)
+{
+	PutU32Buf(b, client_data);
+}
+
+/**
+ *	\x8E\xF3\x90M\x95\xB6\x8E\x9A\x97\xF1\x82\xF0UTF16\x95\xB6\x8E\x9A\x97\xF1\x82ɕϊ\xB7\x82\xB7\x82\xE9
+ *
+ *	@param	ptr		\x95\xB6\x8E\x9A\x97\xF1
+ *	@param	len		\x95\xB6\x8E\x9A\x97\xF1\x92\xB7(\n\x82\xF0\x8A܂܂Ȃ\xA2)
+ *	@retval			\x95ϊ\xB7\x82\xB3\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1(\x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7free()\x82\xB7\x82邱\x82\xC6)
+ *
+ */
+static wchar_t *ConvertUTF16(const BYTE *ptr, size_t len)
+{
+	CharSetOp op;
+	op.PutU32 = PutU32Buf;
+	op.ParseControl = ParseControlBuf;
+	CharSetBuf b;
+	b.size = 32;
+	b.ptr = (wchar_t *)malloc(sizeof(wchar_t) * b.size);
+	b.index = 0;
+	CharSetData *h = CharSetInit(&op, &b);
+	for (size_t i = 0; i < len; i++) {
+		BYTE c = *ptr++;
+		ParseFirst(h, c);
+	}
+	CharSetFinish(h);
+	PutU32Buf(0, &b);
+	return b.ptr;
+}
+
 static void XsProcClipboard(PCHAR buff)
 {
 	char *p;
@@ -4970,66 +5029,6 @@
 	}
 }
 
-
-// \x83^\x83C\x83g\x83\x8B\x83o\x81[\x82\xCCCP932\x82ւ̕ϊ\xB7\x82\xF0\x8Ds\x82\xA4
-// \x8C\xBB\x8D݁ASJIS\x81AEUC\x82݂̂ɑΉ\x9E\x81B
-// (2005.3.13 yutaka)
-static void ConvertToCP932(char *str, int destlen)
-{
-#define IS_SJIS(n) (ts.KanjiCode == IdSJIS && IsDBCSLeadByte(n))
-#define IS_EUC(n) (ts.KanjiCode == IdEUC && (n & 0x80))
-	extern WORD PASCAL JIS2SJIS(WORD KCode);
-	size_t len = strlen(str);
-	char *cc = _alloca(len + 1);
-	char *c = cc;
-	size_t i;
-	unsigned char b;
-	WORD word;
-
-	if (ts.Language == IdJapanese) {
-		for (i = 0 ; i < len ; i++) {
-			b = str[i];
-			if (IS_SJIS(b) || IS_EUC(b)) {
-				word = b<<8;
-
-				if (i == len - 1) {
-					*c++ = b;
-					continue;
-				}
-
-				b = str[i + 1];
-				word |= b;
-				i++;
-
-				if (ts.KanjiCode == IdSJIS) {
-					// SJIS\x82͂\xBB\x82̂܂\xDCCP932\x82Ƃ\xB5\x82ďo\x97͂\xB7\x82\xE9
-
-				} else if (ts.KanjiCode == IdEUC) {
-					// EUC -> SJIS
-					word &= ~0x8080;
-					word = JIS2SJIS(word);
-
-				} else if (ts.KanjiCode == IdJIS) {
-
-				} else if (ts.KanjiCode == IdUTF8) {
-
-				} else {
-
-				}
-
-				*c++ = word >> 8;
-				*c++ = word & 0xff;
-
-			} else {
-				*c++ = b;
-			}
-		}
-
-		*c = '\0';
-		strncpy_s(str, destlen, cc, _TRUNCATE);
-	}
-}
-
 static void XSequence(BYTE b)
 {
 	static char *StrBuff = NULL;
@@ -5077,20 +5076,14 @@
 		  case 1: /* Change icon name */
 		  case 2: /* Change window title */
 			if (StrBuff && ts.AcceptTitleChangeRequest) {
-				if (ts.KanjiCode == IdUTF8 || ts.Language == IdUtf8) {
-					char *titleTmp;
-
-					titleTmp = ToCharU8(StrBuff);
-					if (titleTmp) {
-						strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), titleTmp, _TRUNCATE);
-						free(titleTmp);
-					}
+				size_t len = strlen(StrBuff);
+				wchar_t *titleW = ConvertUTF16(StrBuff, len);
+				char *titleA = ToCharW(titleW);
+				free(titleW);
+				if (titleA) {
+					strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), titleA, _TRUNCATE);
+					free(titleA);
 				}
-				else {
-					strncpy_s(cv.TitleRemote, sizeof(cv.TitleRemote), StrBuff, _TRUNCATE);
-					// (2006.6.15 maya) \x83^\x83C\x83g\x83\x8B\x82ɓn\x82\xB7\x95\xB6\x8E\x9A\x97\xF1\x82\xF0SJIS\x82ɕϊ\xB7
-					ConvertToCP932(cv.TitleRemote, sizeof(cv.TitleRemote));
-				}
 				ChangeTitle();
 			}
 			break;


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