Revision: 10770 https://osdn.net/projects/ttssh2/scm/svn/commits/10770 Author: zmatsuo Date: 2023-06-17 23:47:11 +0900 (Sat, 17 Jun 2023) Log Message: ----------- ISO8859で0x80-0x9fの文字を表示するとクラッシュするので修正 - PutU32() でC0,C1文字の特殊処理を行わないよう修正 Modified Paths: -------------- trunk/teraterm/teraterm/charset.c trunk/teraterm/teraterm/vtterm.c -------------- next part -------------- Modified: trunk/teraterm/teraterm/charset.c =================================================================== --- trunk/teraterm/teraterm/charset.c 2023-06-17 14:47:01 UTC (rev 10769) +++ trunk/teraterm/teraterm/charset.c 2023-06-17 14:47:11 UTC (rev 10770) @@ -82,7 +82,20 @@ static VttermKanjiWork KanjiWork; -// Unicode\x83x\x81[\x83X\x82ɐ\xE8\x91ւ\xA6 +static BOOL IsC0(char32_t b) +{ + return (b <= US); +} + +static BOOL IsC1(char32_t b) +{ + return ((b>=0x80) && (b<=0x9F)); +} + +/** + * PutU32() wrapper + * Unicode\x83x\x81[\x83X\x82ɐ\xE8\x91ւ\xA6 + */ static void PutChar(BYTE b) { PutU32(b); @@ -539,6 +552,10 @@ } } +/** + * REPLACEMENT_CHARACTER \x82̕\\x8E\xA6 + * UTF-8 \x83f\x83R\x81[\x83h\x82\xA9\x82\xE7\x8Eg\x97p + */ static void PutReplacementChr(VttermKanjiWork *w, const BYTE *ptr, size_t len, BOOL fallback) { const char32_t replacement_char = w->replacement_char; @@ -545,6 +562,7 @@ int i; for (i = 0; i < len; i++) { BYTE c = *ptr++; + assert(IsC0(c)); if (fallback) { // fallback ISO8859-1 PutU32(c); @@ -554,7 +572,7 @@ if (c < 0x80) { // \x95s\x90\xB3\x82\xC8UTF-8\x95\xB6\x8E\x9A\x97\xF1\x82̂Ȃ\xA9\x82\xC90x80\x96\xA2\x96\x9E\x82\xAA\x82\xA0\x82\xEA\x82A // 1\x95\xB6\x8E\x9A\x82\xCCUTF-8\x95\xB6\x8E\x9A\x82Ƃ\xB5\x82Ă\xBB\x82̂܂ܕ\\x8E\xA6\x82\xB7\x82\xE9 - ParseASCII(c); + PutU32(c); } else { PutU32(replacement_char); @@ -563,9 +581,11 @@ } } -// UTF-8\x82Ŏ\xF3\x90M\x83f\x81[\x83^\x82\xF0\x8F\x88\x97\x9D\x82\xB7\x82\xE9 -// returns TRUE if b is processed -// (actually allways returns TRUE) +/** + * UTF-8\x82Ŏ\xF3\x90M\x83f\x81[\x83^\x82\xF0\x8F\x88\x97\x9D\x82\xB7\x82\xE9 + * + * returns TRUE if b is processed + */ static BOOL ParseFirstUTF8(BYTE b) { VttermKanjiWork *w = &KanjiWork; @@ -608,18 +628,24 @@ recheck: // 1byte(7bit) if (w->count == 0) { - if (b <= 0x7f) { - // 1byte(7bit) - // 0x7f\x88ȉ\xBA, \x82̂Ƃ\xAB\x81A\x82\xBB\x82̂܂o\x97\xCD - ParseASCII(b); + if (IsC0(b)) { + // U+0000 .. U+001f + // C0\x90\xA7\x8C䕶\x8E\x9A, C0 Coontrols + ParseControl(b); return TRUE; } - if (0xc2 <= b && b <= 0xf4) { + else if (b <= 0x7f) { + // 0x7f\x88ȉ\xBA, \x82̂Ƃ\xAB\x81A\x82\xBB\x82̂܂o\x97\xCD + PutU32(b); + return TRUE; + } + else if (0xc2 <= b && b <= 0xf4) { // 1byte\x96ڕۑ\xB6 w->buf[w->count++] = b; return TRUE; } + // 0x80 - 0xc1, 0xf5 - 0xff // UTF-8\x82\xC51byte\x82ɏo\x8C\xBB\x82\xB5\x82Ȃ\xA2\x83R\x81[\x83h\x82̂Ƃ\xAB if (ts.FallbackToCP932) { // fallback\x82\xB7\x82\xE9\x8Fꍇ @@ -660,7 +686,14 @@ if ((w->buf[0] & 0xe0) == 0xc0) { // == (0xc2 <= w->buf[0] && w->buf[0] <= 0xdf) // 5bit + 6bit code = ((w->buf[0] & 0x1f) << 6) | (b & 0x3f); - PutU32(code); + if (IsC1(code)) { + // U+0080 .. u+009f + // C1\x90\xA7\x8C䕶\x8E\x9A, C1 Controls + ParseControl((BYTE)code); + } + else { + PutU32(code); + } w->count = 0; return TRUE; } @@ -711,6 +744,10 @@ static BOOL ParseFirstRus(BYTE b) // returns if b is processed { + if (IsC0(b)) { + ParseControl(b); + return TRUE; + } // CP1251\x82ɕϊ\xB7 BYTE c = RussConv(ts.KanjiCode, IdWindows, b); // CP1251->Unicode Modified: trunk/teraterm/teraterm/vtterm.c =================================================================== --- trunk/teraterm/teraterm/vtterm.c 2023-06-17 14:47:01 UTC (rev 10769) +++ trunk/teraterm/teraterm/vtterm.c 2023-06-17 14:47:11 UTC (rev 10770) @@ -760,17 +760,6 @@ TCharAttr CharAttrTmp; CharAttrTmp = CharAttr; - if (code <= US) { - // U+0000 .. U+001f - // C0\x90\xA7\x8C䕶\x8E\x9A, C0 Coontrols - ParseControl(code); - return; - } else if ((0x80<=code) && (code<=0x9F)) { - // U+0080 .. u+009f - // C1\x90\xA7\x8C䕶\x8E\x9A, C1 Controls - ParseControl(code); - return; - } { int r;