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;