[Ttssh2-commit] [8723] CodeBuff 削除

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 4月 13日 (月) 01:41:30 JST


Revision: 8723
          https://osdn.net/projects/ttssh2/scm/svn/commits/8723
Author:   zmatsuo
Date:     2020-04-13 01:41:30 +0900 (Mon, 13 Apr 2020)
Log Message:
-----------
CodeBuff 削除

- buff_char_t にメンバー変数 ansi_char を追加
- 要調査
  - ANSI文字表示
  - デリミタ関連
  - プリント関連

Modified Paths:
--------------
    branches/unicode_buf_2/teraterm/teraterm/buffer.c

-------------- next part --------------
Modified: branches/unicode_buf_2/teraterm/teraterm/buffer.c
===================================================================
--- branches/unicode_buf_2/teraterm/teraterm/buffer.c	2020-04-12 16:41:23 UTC (rev 8722)
+++ branches/unicode_buf_2/teraterm/teraterm/buffer.c	2020-04-12 16:41:30 UTC (rev 8723)
@@ -72,6 +72,7 @@
 	unsigned char bg;
 	unsigned char attr;
 	unsigned char attr2;
+	unsigned short ansi_char;
 } buff_char_t;
 
 #define BuffXMax TermWidthMax
@@ -93,7 +94,7 @@
 
 static WORD BuffLock = 0;
 
-static PCHAR CodeBuff;  /* Character code buffer */
+//static PCHAR CodeBuff;  /* Character code buffer */
 //static PCHAR AttrBuff;  /* Attribute buffer */
 //static PCHAR AttrBuff2; /* Color attr buffer */
 //static PCHAR AttrBuffFG; /* Foreground color attr buffer */
@@ -314,6 +315,24 @@
 	return Ptr;
 }
 
+/**
+ * \x83|\x83C\x83\x93\x83^\x82̈ʒu\x82\xA9\x82\xE7 x,y \x82\xF0\x8B\x81\x82߂\xE9
+ */
+static void GetPosFromPtr(const buff_char_t *b, int *bx, int *by)
+{
+	size_t index = b - CodeBuffW;
+	int x = (int)(index % NumOfColumns);
+	int y = (int)(index / NumOfColumns);
+	if (y >= BuffStartAbs) {
+		y -= BuffStartAbs;
+	}
+	else {
+		y += (NumOfLines - BuffStartAbs);
+	}
+	*bx = x;
+	*by = y;
+}
+
 static BOOL ChangeBuffer(int Nx, int Ny)
 {
 //	buff_char_t * CodeLineW = &CodeBuffW[LinePtr];
@@ -320,7 +339,7 @@
 //	PCHAR CodeLine = &CodeBuff[LinePtr];
 	LONG NewSize;
 	int NxCopy, NyCopy, i;
-	PCHAR CodeDest;
+//	PCHAR CodeDest;
 //	PCHAR AttrDest, AttrDest2;
 //	PCHAR AttrDestFG, AttrDestBG;
 	LONG SrcPtr, DestPtr;
@@ -343,7 +362,7 @@
 
 	NewSize = (LONG)Nx * (LONG)Ny;
 
-	CodeDest = NULL;
+//	CodeDest = NULL;
 //	AttrDest = NULL;
 //	AttrDest2 = NULL;
 //	AttrDestFG = NULL;
@@ -350,10 +369,12 @@
 //	AttrDestBG = NULL;
 	CodeDestW = NULL;
 
+#if 0
 	CodeDest = malloc(NewSize);
 	if (CodeDest == NULL) {
 		goto allocate_error;
 	}
+#endif
 #if 0
 	AttrDest = malloc(NewSize);
 	if (AttrDest == NULL) {
@@ -379,7 +400,7 @@
 		goto allocate_error;
 	}
 
-	memset(&CodeDest[0], 0x20, NewSize);
+//	memset(&CodeDest[0], 0x20, NewSize);
 	memset(&CodeDestW[0], 0, NewSize * sizeof(buff_char_t));
 	memsetW(&CodeDestW[0], 0x20, AttrDefaultFG, AttrDefaultBG, AttrDefault, AttrDefault, NewSize);
 //	memset(&AttrDest[0], AttrDefault, NewSize);
@@ -386,7 +407,7 @@
 //	memset(&AttrDest2[0], AttrDefault, NewSize);
 //	memset(&AttrDestFG[0], AttrDefaultFG, NewSize);
 //	memset(&AttrDestBG[0], AttrDefaultBG, NewSize);
-	if ( CodeBuff != NULL ) {
+	if ( CodeBuffW != NULL ) {
 		if ( NumOfColumns > Nx ) {
 			NxCopy = Nx;
 		}
@@ -405,7 +426,7 @@
 		SrcPtr = GetLinePtr(BuffEnd-NyCopy);
 		DestPtr = 0;
 		for (i = 1 ; i <= NyCopy ; i++) {
-			memcpy(&CodeDest[DestPtr],&CodeBuff[SrcPtr],NxCopy);
+//			memcpy(&CodeDest[DestPtr],&CodeBuff[SrcPtr],NxCopy);
 			memcpyW(&CodeDestW[DestPtr],&CodeBuffW[SrcPtr],NxCopy);
 //			memcpy(&AttrDest[DestPtr],&AttrBuff[SrcPtr],NxCopy);
 //			memcpy(&AttrDest2[DestPtr],&AttrBuff2[SrcPtr],NxCopy);
@@ -418,7 +439,8 @@
 			}
 #endif
 			if (CodeDestW[DestPtr+NxCopy-1].attr & AttrKanji) {
-				CodeDest[DestPtr+NxCopy-1] = ' ';
+//				CodeDest[DestPtr+NxCopy-1] = ' ';
+				BuffSetChar(&CodeDestW[DestPtr + NxCopy - 1], ' ', 'H');
 				CodeDestW[DestPtr+NxCopy-1].attr ^= AttrKanji;
 			}
 			SrcPtr = NextLinePtr(SrcPtr);
@@ -449,7 +471,7 @@
 		            (SelectEnd.x > SelectStart.x));
 	}
 
-	CodeBuff = CodeDest;
+//	CodeBuff = CodeDest;
 //	AttrBuff = AttrDest;
 //	AttrBuff2 = AttrDest2;
 //	AttrBuffFG = AttrDestFG;
@@ -488,7 +510,7 @@
 	return TRUE;
 
 allocate_error:
-	if (CodeDest)   free(CodeDest);
+//	if (CodeDest)   free(CodeDest);
 //	if (AttrDest)   free(AttrDest);
 //	if (AttrDest2)  free(AttrDest2);
 //	if (AttrDestFG) free(AttrDestFG);
@@ -574,10 +596,12 @@
 {
 	BuffLock = 1;
 	UnlockBuffer();
+#if 0
 	if (CodeBuff!=NULL) {
 		free(CodeBuff);
 		CodeBuff = NULL;
 	}
+#endif
 	if (CodeBuffW != NULL) {
 		free(CodeBuffW);
 		CodeBuffW = NULL;
@@ -694,13 +718,13 @@
 	if (Bottom<NumOfLines-1) {
 		SrcPtr = GetLinePtr(PageStart+NumOfLines-1);
 		for (i=NumOfLines-1; i>=Bottom+1; i--) {
-			memcpy(&(CodeBuff[DestPtr]),&(CodeBuff[SrcPtr]),NumOfColumns);
+//			memcpy(&(CodeBuff[DestPtr]),&(CodeBuff[SrcPtr]),NumOfColumns);
 			memcpyW(&(CodeBuffW[DestPtr]),&(CodeBuffW[SrcPtr]),NumOfColumns);
 //			memcpy(&(AttrBuff[DestPtr]),&(AttrBuff[SrcPtr]),NumOfColumns);
 //			memcpy(&(AttrBuff2[DestPtr]),&(AttrBuff2[SrcPtr]),NumOfColumns);
 //			memcpy(&(AttrBuffFG[DestPtr]),&(AttrBuffFG[SrcPtr]),NumOfColumns);
 //			memcpy(&(AttrBuffBG[DestPtr]),&(AttrBuffBG[SrcPtr]),NumOfColumns);
-			memset(&(CodeBuff[SrcPtr]),0x20,NumOfColumns);
+//			memset(&(CodeBuff[SrcPtr]),0x20,NumOfColumns);
 			memsetW(&(CodeBuffW[SrcPtr]),0x20,CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, NumOfColumns);
 //			memset(&(AttrBuff[SrcPtr]),AttrDefault,NumOfColumns);
 //			memset(&(AttrBuff2[SrcPtr]),CurCharAttr.Attr2 & Attr2ColorMask, NumOfColumns);
@@ -713,7 +737,7 @@
 	}
 	for (i = 1 ; i <= n ; i++) {
 		buff_char_t *b = &CodeBuffW[DestPtr];
-		memset(&CodeBuff[DestPtr],0x20,NumOfColumns);
+//		memset(&CodeBuff[DestPtr],0x20,NumOfColumns);
 		memsetW(b ,0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, NumOfColumns);
 //		memset(&AttrBuff[DestPtr],AttrDefault,NumOfColumns);
 //		memset(&AttrBuff2[DestPtr],CurCharAttr.Attr2 & Attr2ColorMask, NumOfColumns);
@@ -760,7 +784,7 @@
 static void EraseKanji(int LR)
 {
 #if !ATR
-	PCHAR CodeLine = &CodeBuff[LinePtr];
+//	PCHAR CodeLine = &CodeBuff[LinePtr];
 //	PCHAR AttrLine = &AttrBuff[LinePtr];
 //	PCHAR AttrLine2 = &AttrBuff2[LinePtr];
 //	PCHAR AttrLineFG = &AttrBuffFG[LinePtr];
@@ -779,7 +803,7 @@
 	if (IsBuffFullWidth(p)) {
 		// \x91S\x8Ap\x82\xF0\x82‚Ԃ\xB7
 		BuffSetChar(p, ' ', 'H');
-		CodeLine[bx] = 0x20;
+//		CodeLine[bx] = 0x20;
 		p->attr = CurCharAttr.Attr;
 		p->attr2 = CurCharAttr.Attr2;
 //		AttrLine[bx] = CurCharAttr.Attr;
@@ -790,7 +814,7 @@
 		p->bg = CurCharAttr.Back;
 		if (bx+1 < NumOfColumns) {
 			BuffSetChar(p + 1, ' ', 'H');
-			CodeLine[bx+1] = 0x20;
+//			CodeLine[bx+1] = 0x20;
 			(p+1)->attr = CurCharAttr.Attr;
 			(p+1)->attr2 = CurCharAttr.Attr2;
 //			AttrLine[bx+1] = CurCharAttr.Attr;
@@ -814,12 +838,12 @@
 	for (i=0; i<count; i++) {
 		pos = ptr + CursorLeftM-1;
 		if (CursorLeftM>0 && (CodeBuffW[pos].attr & AttrKanji)) {
-			CodeBuff[pos] = 0x20;
+//			CodeBuff[pos] = 0x20;
 			BuffSetChar(&CodeBuffW[pos], 0x20, 'H');
 //			AttrBuff[pos] &= ~AttrKanji;
 			CodeBuffW[pos].attr &= ~AttrKanji;
 			pos++;
-			CodeBuff[pos] = 0x20;
+//			CodeBuff[pos] = 0x20;
 			BuffSetChar(&CodeBuffW[pos], 0x20, 'H');
 //			AttrBuff[pos] &= ~AttrKanji;
 			CodeBuffW[pos].attr &= ~AttrKanji;
@@ -827,12 +851,12 @@
 		pos = ptr + CursorRightM;
 //		if (CursorRightM < NumOfColumns-1 && (AttrBuff[pos] & AttrKanji)) {
 		if (CursorRightM < NumOfColumns-1 && (CodeBuffW[pos].attr & AttrKanji)) {
-			CodeBuff[pos] = 0x20;
+//			CodeBuff[pos] = 0x20;
 			BuffSetChar(&CodeBuffW[pos], 0x20, 'H');
 //			AttrBuff[pos] &= ~AttrKanji;
 			CodeBuffW[pos].attr &= ~AttrKanji;
 			pos++;
-			CodeBuff[pos] = 0x20;
+//			CodeBuff[pos] = 0x20;
 			BuffSetChar(&CodeBuffW[pos], 0x20, 'H');
 //			AttrBuff[pos] &= ~AttrKanji;
 			CodeBuffW[pos].attr &= ~AttrKanji;
@@ -846,7 +870,7 @@
 void BuffInsertSpace(int Count)
 {
 #if !ATR
-	PCHAR CodeLine = &CodeBuff[LinePtr];
+//	PCHAR CodeLine = &CodeBuff[LinePtr];
 //	PCHAR AttrLine = &AttrBuff[LinePtr];
 //	PCHAR AttrLine2 = &AttrBuff2[LinePtr];
 //	PCHAR AttrLineFG = &AttrBuffFG[LinePtr];
@@ -875,7 +899,7 @@
 	}
 
 	if (CursorRightM < NumOfColumns - 1 && (CodeLineW[CursorRightM].attr & AttrKanji)) {
-		CodeLine[CursorRightM + 1] = 0x20;
+//		CodeLine[CursorRightM + 1] = 0x20;
 		BuffSetChar(&CodeLineW[CursorRightM + 1], 0x20, 'H');
 //		AttrLine[CursorRightM + 1] &= ~AttrKanji;
 		CodeLineW[CursorRightM + 1].attr &= ~AttrKanji;
@@ -888,7 +912,7 @@
 	MoveLen = CursorRightM + 1 - CursorX - Count;
 
 	if (MoveLen > 0) {
-		memmove(&(CodeLine[CursorX + Count]), &(CodeLine[CursorX]), MoveLen);
+//		memmove(&(CodeLine[CursorX + Count]), &(CodeLine[CursorX]), MoveLen);
 		memmoveW(&(CodeLineW[CursorX + Count]), &(CodeLineW[CursorX]), MoveLen);
 //		memmove(&(AttrLine[CursorX + Count]), &(AttrLine[CursorX]), MoveLen);
 //		memmove(&(AttrLine2[CursorX + Count]), &(AttrLine2[CursorX]), MoveLen);
@@ -895,7 +919,7 @@
 //		memmove(&(AttrLineFG[CursorX + Count]), &(AttrLineFG[CursorX]), MoveLen);
 //		memmove(&(AttrLineBG[CursorX + Count]), &(AttrLineBG[CursorX]), MoveLen);
 	}
-	memset(&(CodeLine[CursorX]), 0x20, Count);
+//	memset(&(CodeLine[CursorX]), 0x20, Count);
 	memsetW(&(CodeLineW[CursorX]), 0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2, Count);
 //	memset(&(AttrLine[CursorX]), AttrDefault, Count);
 //	memset(&(AttrLine2[CursorX]), CurCharAttr.Attr2 & Attr2ColorMask, Count);
@@ -905,7 +929,7 @@
 //	if ((AttrLine[CursorRightM] & AttrKanji) != 0) {
 	if ((CodeLineW[CursorRightM].attr & AttrKanji) != 0) {
 		/* then delete it */
-		CodeLine[CursorRightM] = 0x20;
+//		CodeLine[CursorRightM] = 0x20;
 		BuffSetChar(&CodeLineW[CursorRightM], 0x20, 'H');
 //		AttrLine[CursorRightM] &= ~AttrKanji;
 		CodeLineW[CursorRightM].attr &= ~AttrKanji;
@@ -931,7 +955,7 @@
 		YEnd--;
 	}
 	for (i = CursorY ; i <= YEnd ; i++) {
-		memset(&(CodeBuff[TmpPtr+offset]),0x20,NumOfColumns-offset);
+//		memset(&(CodeBuff[TmpPtr+offset]),0x20,NumOfColumns-offset);
 		memsetW(&(CodeBuffW[TmpPtr+offset]),0x20,CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, NumOfColumns-offset);
 //		memset(&(AttrBuff[TmpPtr+offset]),AttrDefault,NumOfColumns-offset);
 //		memset(&(AttrBuff2[TmpPtr+offset]),CurCharAttr.Attr2 & Attr2ColorMask, NumOfColumns-offset);
@@ -967,7 +991,7 @@
 		if (i==CursorY) {
 			offset = CursorX+1;
 		}
-		memset(&(CodeBuff[TmpPtr]),0x20,offset);
+//		memset(&(CodeBuff[TmpPtr]),0x20,offset);
 		memsetW(&(CodeBuffW[TmpPtr]),0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, offset);
 //		memset(&(AttrBuff[TmpPtr]),AttrDefault,offset);
 //		memset(&(AttrBuff2[TmpPtr]),CurCharAttr.Attr2 & Attr2ColorMask, offset);
@@ -1002,7 +1026,7 @@
 	DestPtr = GetLinePtr(PageStart+YEnd) + CursorLeftM;
 	linelen = CursorRightM - CursorLeftM + 1;
 	for (i= YEnd-Count ; i>=CursorY ; i--) {
-		memcpy(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
+//		memcpy(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
 		memcpyW(&(CodeBuffW[DestPtr]), &(CodeBuffW[SrcPtr]), linelen);
 //		memcpy(&(AttrBuff[DestPtr]), &(AttrBuff[SrcPtr]), linelen);
 //		memcpy(&(AttrBuff2[DestPtr]), &(AttrBuff2[SrcPtr]), linelen);
@@ -1012,7 +1036,7 @@
 		DestPtr = PrevLinePtr(DestPtr);
 	}
 	for (i = 1 ; i <= Count ; i++) {
-		memset(&(CodeBuff[DestPtr]), 0x20, linelen);
+//		memset(&(CodeBuff[DestPtr]), 0x20, linelen);
 		memsetW(&(CodeBuffW[DestPtr]), 0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, linelen);
 //		memset(&(AttrBuff[DestPtr]), AttrDefault, linelen);
 //		memset(&(AttrBuff2[DestPtr]), CurCharAttr.Attr2 & Attr2ColorMask, linelen);
@@ -1032,7 +1056,7 @@
 //  Count: number of characters to be erased
 {
 #if !ATR
-	PCHAR CodeLine = &CodeBuff[LinePtr];
+//	PCHAR CodeLine = &CodeBuff[LinePtr];
 //	PCHAR AttrLine = &AttrBuff[LinePtr];
 //	PCHAR AttrLine2 = &AttrBuff2[LinePtr];
 //	PCHAR AttrLineFG = &AttrBuffFG[LinePtr];
@@ -1051,7 +1075,7 @@
 	}
 
 	NewLine(PageStart+CursorY);
-	memset(&(CodeLine[XStart]),0x20,Count);
+//	memset(&(CodeLine[XStart]),0x20,Count);
 	memsetW(&(CodeLineW[XStart]),0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, Count);
 //	memset(&(AttrLine[XStart]),AttrDefault,Count);
 //	memset(&(AttrLine2[XStart]),CurCharAttr.Attr2 & Attr2ColorMask, Count);
@@ -1094,7 +1118,7 @@
 	DestPtr = GetLinePtr(PageStart+CursorY) + (LONG)CursorLeftM;
 	linelen = CursorRightM - CursorLeftM + 1;
 	for (i=CursorY ; i<= YEnd-Count ; i++) {
-		memcpy(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
+//		memcpy(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
 		memcpyW(&(CodeBuffW[DestPtr]), &(CodeBuffW[SrcPtr]), linelen);
 //		memcpy(&(AttrBuff[DestPtr]), &(AttrBuff[SrcPtr]), linelen);
 //		memcpy(&(AttrBuff2[DestPtr]), &(AttrBuff2[SrcPtr]), linelen);
@@ -1104,7 +1128,7 @@
 		DestPtr = NextLinePtr(DestPtr);
 	}
 	for (i = YEnd+1-Count ; i<=YEnd ; i++) {
-		memset(&(CodeBuff[DestPtr]), 0x20, linelen);
+//		memset(&(CodeBuff[DestPtr]), 0x20, linelen);
 		memsetW(&(CodeBuffW[DestPtr]), 0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, linelen);
 //		memset(&(AttrBuff[DestPtr]), AttrDefault, linelen);
 //		memset(&(AttrBuff2[DestPtr]), CurCharAttr.Attr2 & Attr2ColorMask,  linelen);
@@ -1123,7 +1147,7 @@
 void BuffDeleteChars(int Count)
 {
 #if !ATR
-	PCHAR CodeLine = &CodeBuff[LinePtr];
+//	PCHAR CodeLine = &CodeBuff[LinePtr];
 //	PCHAR AttrLine = &AttrBuff[LinePtr];
 //	PCHAR AttrLine2 = &AttrBuff2[LinePtr];
 //	PCHAR AttrLineFG = &AttrBuffFG[LinePtr];
@@ -1165,11 +1189,11 @@
 
 //	if (CursorRightM < NumOfColumns - 1 && (AttrLine[CursorRightM] & AttrKanji)) {
 	if (CursorRightM < NumOfColumns - 1 && (CodeLineW[CursorRightM].attr & AttrKanji)) {
-		CodeLine[CursorRightM] = 0x20;
+//		CodeLine[CursorRightM] = 0x20;
 		BuffSetChar(&CodeLineW[CursorRightM], 0x20, 'H');
 //		AttrLine[CursorRightM] &= ~AttrKanji;
 		CodeLineW[CursorRightM].attr &= ~AttrKanji;
-		CodeLine[CursorRightM + 1] = 0x20;
+//		CodeLine[CursorRightM + 1] = 0x20;
 		BuffSetChar(&CodeLineW[CursorRightM + 1], 0x20, 'H');
 //		AttrLine[CursorRightM + 1] &= ~AttrKanji;
 		CodeLineW[CursorRightM + 1].attr &= ~AttrKanji;
@@ -1179,7 +1203,7 @@
 	MoveLen = CursorRightM + 1 - CursorX - Count;
 
 	if (MoveLen > 0) {
-		memmove(&(CodeLine[CursorX]), &(CodeLine[CursorX + Count]), MoveLen);
+//		memmove(&(CodeLine[CursorX]), &(CodeLine[CursorX + Count]), MoveLen);
 		memmoveW(&(CodeLineW[CursorX]), &(CodeLineW[CursorX + Count]), MoveLen);
 //		memmove(&(AttrLine[CursorX]), &(AttrLine[CursorX + Count]), MoveLen);
 //		memmove(&(AttrLine2[CursorX]), &(AttrLine2[CursorX + Count]), MoveLen);
@@ -1186,7 +1210,7 @@
 //		memmove(&(AttrLineFG[CursorX]), &(AttrLineFG[CursorX + Count]), MoveLen);
 //		memmove(&(AttrLineBG[CursorX]), &(AttrLineBG[CursorX + Count]), MoveLen);
 	}
-	memset(&(CodeLine[CursorX + MoveLen]), 0x20, Count);
+//	memset(&(CodeLine[CursorX + MoveLen]), 0x20, Count);
 	memsetW(&(CodeLineW[CursorX + MoveLen]), ' ', CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, Count);
 //	memset(&(AttrLine[CursorX + MoveLen]), AttrDefault, Count);
 //	memset(&(AttrLine2[CursorX + MoveLen]), CurCharAttr.Attr2 & Attr2ColorMask, Count);
@@ -1201,7 +1225,7 @@
 void BuffEraseChars(int Count)
 {
 #if !ATR
-	PCHAR CodeLine = &CodeBuff[LinePtr];
+//	PCHAR CodeLine = &CodeBuff[LinePtr];
 //	PCHAR AttrLine = &AttrBuff[LinePtr];
 //	PCHAR AttrLine2 = &AttrBuff2[LinePtr];
 //	PCHAR AttrLineFG = &AttrBuffFG[LinePtr];
@@ -1243,7 +1267,7 @@
 		}
 	}
 
-	memset(&(CodeLine[CursorX]), 0x20, Count);
+//	memset(&(CodeLine[CursorX]), 0x20, Count);
 	memsetW(&(CodeLineW[CursorX]), 0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, Count);
 //	memset(&(AttrLine[CursorX]), AttrDefault, Count);
 //	memset(&(AttrLine2[CursorX]), CurCharAttr.Attr2 & Attr2ColorMask, Count);
@@ -1262,7 +1286,7 @@
 
 	TmpPtr = GetLinePtr(PageStart);
 	for (i = 0 ; i <= NumOfLines-1-StatusLine ; i++) {
-		memset(&(CodeBuff[TmpPtr]),'E',NumOfColumns);
+//		memset(&(CodeBuff[TmpPtr]),'E',NumOfColumns);
 		memsetW(&(CodeBuffW[TmpPtr]),'E', AttrDefaultFG, AttrDefaultBG, AttrDefault, AttrDefault, NumOfColumns);
 //		memset(&(AttrBuff[TmpPtr]),AttrDefault,NumOfColumns);
 //		memset(&(AttrBuff2[TmpPtr]),AttrDefault,NumOfColumns);
@@ -1302,7 +1326,7 @@
 				C = NumOfColumns-CursorX;
 			}
 			Ptr = GetLinePtr(PageStart+Y);
-			memset(&(CodeBuff[Ptr+CursorX]),'q',C);
+//			memset(&(CodeBuff[Ptr+CursorX]),'q',C);
 			memsetW(&(CodeBuffW[Ptr+CursorX]),'q', Attr.Fore, Attr.Back, Attr.Attr, Attr.Attr2, C);
 //			memset(&(AttrBuff[Ptr+CursorX]),Attr.Attr,C);
 //			memset(&(AttrBuff2[Ptr+CursorX]),Attr.Attr2,C);
@@ -1331,8 +1355,8 @@
 				C = NumOfLines-StatusLine-CursorY;
 			}
 			for (i=1; i<=C; i++) {
-				CodeBuff[Ptr+X] = 'x';
-				BuffSetChar4(&CodeBuffW[Ptr+X], 0x20, Attr.Fore, Attr.Back, Attr.Attr, Attr.Attr2, 'H');
+//				CodeBuff[Ptr+X] = 'x';
+				BuffSetChar4(&CodeBuffW[Ptr+X], 'x', Attr.Fore, Attr.Back, Attr.Attr, Attr.Attr2, 'H');
 //				AttrBuff[Ptr+X] = Attr.Attr;
 //				AttrBuff2[Ptr+X] = Attr.Attr2;
 //				AttrBuffFG[Ptr+X] = Attr.Fore;
@@ -1366,7 +1390,7 @@
 	for (i=YStart; i<=YEnd; i++) {
 		if ((XStart>0) &&
 		    ((CodeBuffW[Ptr+XStart-1].attr & AttrKanji) != 0)) {
-			CodeBuff[Ptr+XStart-1] = 0x20;
+//			CodeBuff[Ptr+XStart-1] = 0x20;
 			BuffSetChar4(&CodeBuffW[Ptr+XStart-1], 0x20, CurCharAttr.Fore, CurCharAttr.Back, CurCharAttr.Attr, CurCharAttr.Attr2, 'H');
 //			AttrBuff[Ptr+XStart-1] = CurCharAttr.Attr;
 //			AttrBuff2[Ptr+XStart-1] = CurCharAttr.Attr2;
@@ -1375,7 +1399,7 @@
 		}
 		if ((XStart+C<NumOfColumns) &&
 		    ((CodeBuffW[Ptr+XStart+C-1].attr & AttrKanji) != 0)) {
-			CodeBuff[Ptr+XStart+C] = 0x20;
+//			CodeBuff[Ptr+XStart+C] = 0x20;
 			BuffSetChar4(&CodeBuffW[Ptr+XStart+C], 0x20, CurCharAttr.Fore, CurCharAttr.Back, CurCharAttr.Attr, CurCharAttr.Attr2, 'H');
 //			AttrBuff[Ptr+XStart+C] = CurCharAttr.Attr;
 //			AttrBuff2[Ptr+XStart+C] = CurCharAttr.Attr2;
@@ -1382,7 +1406,7 @@
 //			AttrBuffFG[Ptr+XStart+C] = CurCharAttr.Fore;
 //			AttrBuffBG[Ptr+XStart+C] = CurCharAttr.Back;
 		}
-		memset(&(CodeBuff[Ptr+XStart]),0x20,C);
+//		memset(&(CodeBuff[Ptr+XStart]),0x20,C);
 		memsetW(&(CodeBuffW[Ptr+XStart]),0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, C);
 //		memset(&(AttrBuff[Ptr+XStart]),AttrDefault,C);
 //		memset(&(AttrBuff2[Ptr+XStart]),CurCharAttr.Attr2 & Attr2ColorMask, C);
@@ -1415,16 +1439,16 @@
 	for (i=YStart; i<=YEnd; i++) {
 		if ((XStart>0) &&
 		    ((CodeBuffW[Ptr+XStart-1].attr & AttrKanji) != 0)) {
-			CodeBuff[Ptr+XStart-1] = 0x20;
+//			CodeBuff[Ptr+XStart-1] = 0x20;
 			BuffSetChar(&CodeBuffW[Ptr + XStart - 1], 0x20, 'H');
 			CodeBuffW[Ptr+XStart-1].attr ^= AttrKanji;
 		}
 		if ((XStart+Cols<NumOfColumns) &&
 		    ((CodeBuffW[Ptr+XStart+Cols-1].attr & AttrKanji) != 0)) {
-			CodeBuff[Ptr+XStart+Cols] = 0x20;
+//			CodeBuff[Ptr+XStart+Cols] = 0x20;
 			BuffSetChar(&CodeBuffW[Ptr + XStart + Cols], 0x20, 'H');
 		}
-		memset(&(CodeBuff[Ptr+XStart]), ch, Cols);
+//		memset(&(CodeBuff[Ptr+XStart]), ch, Cols);
 		memsetW(&(CodeBuffW[Ptr+XStart]), ch, CurCharAttr.Fore, CurCharAttr.Back, CurCharAttr.Attr, CurCharAttr.Attr2, Cols);
 //		memset(&(AttrBuff[Ptr+XStart]), CurCharAttr.Attr, Cols);
 //		memset(&(AttrBuff2[Ptr+XStart]), CurCharAttr.Attr2, Cols);
@@ -1480,7 +1504,7 @@
 		SPtr = GetLinePtr(PageStart+SrcYStart);
 		DPtr = GetLinePtr(PageStart+DstY);
 		for (i=0; i<L; i++) {
-			memcpy(&(CodeBuff[DPtr+DstX]), &(CodeBuff[SPtr+SrcXStart]), C);
+//			memcpy(&(CodeBuff[DPtr+DstX]), &(CodeBuff[SPtr+SrcXStart]), C);
 			memcpyW(&(CodeBuffW[DPtr+DstX]), &(CodeBuffW[SPtr+SrcXStart]), C);
 //			memcpy(&(AttrBuff[DPtr+DstX]), &(AttrBuff[SPtr+SrcXStart]), C);
 //			memcpy(&(AttrBuff2[DPtr+DstX]), &(AttrBuff2[SPtr+SrcXStart]), C);
@@ -1494,7 +1518,7 @@
 		SPtr = GetLinePtr(PageStart+SrcYEnd);
 		DPtr = GetLinePtr(PageStart+DstY+L-1);
 		for (i=L; i>0; i--) {
-			memcpy(&(CodeBuff[DPtr+DstX]), &(CodeBuff[SPtr+SrcXStart]), C);
+//			memcpy(&(CodeBuff[DPtr+DstX]), &(CodeBuff[SPtr+SrcXStart]), C);
 			memcpyW(&(CodeBuffW[DPtr+DstX]), &(CodeBuffW[SPtr+SrcXStart]), C);
 //			memcpy(&(AttrBuff[DPtr+DstX]), &(AttrBuff[SPtr+SrcXStart]), C);
 //			memcpy(&(AttrBuff2[DPtr+DstX]), &(AttrBuff2[SPtr+SrcXStart]), C);
@@ -1508,7 +1532,7 @@
 		SPtr = GetLinePtr(PageStart+SrcYStart);
 		DPtr = GetLinePtr(PageStart+DstY);
 		for (i=0; i<L; i++) {
-			memmove(&(CodeBuff[DPtr+DstX]), &(CodeBuff[SPtr+SrcXStart]), C);
+//			memmove(&(CodeBuff[DPtr+DstX]), &(CodeBuff[SPtr+SrcXStart]), C);
 			memmoveW(&(CodeBuffW[DPtr+DstX]), &(CodeBuffW[SPtr+SrcXStart]), C);
 //			memmove(&(AttrBuff[DPtr+DstX]), &(AttrBuff[SPtr+SrcXStart]), C);
 //			memmove(&(AttrBuff2[DPtr+DstX]), &(AttrBuff2[SPtr+SrcXStart]), C);
@@ -1924,8 +1948,13 @@
  *	1\x83Z\x83\x8B\x95\xAA\x82\xF0wchar_t\x95\xB6\x8E\x9A\x97\xF1\x82ɓW\x8AJ\x82\xB7\x82\xE9
  *	@param[in]		b			1\x83Z\x83\x8B\x95\xAA\x82̕\xB6\x8E\x9A\x8F\xEE\x95\xF1\x82ւ̃|\x83C\x83\x93\x83^
  *	@param[in,out]	buf			\x95\xB6\x8E\x9A\x97\xF1\x93W\x8AJ\x90\xE6 NULL\x82̏ꍇ\x82͓W\x8AJ\x82\xB3\x82\xEA\x82Ȃ\xA2
- *	@param[in]		buf_size	buf\x82̕\xB6\x8E\x9A\x90\x94 NULL\x82̏ꍇ\x82͎Q\x8FƂ\xB3\x82\xEA\x82Ȃ\xA2
- *	@retrun			\x95\xB6\x8E\x9A\x90\x94
+ *	@param[in]		buf_size	buf\x82̕\xB6\x8E\x9A\x90\x94(buff == NULL\x82̏ꍇ\x82͎Q\x8FƂ\xB3\x82\xEA\x82Ȃ\xA2)
+ *	@param[out]		too_small	NULL \x82̂Ƃ\xAB\x8F\xEE\x95\xF1\x82\xF0\x95Ԃ\xB3\x82Ȃ\xA2
+ *								TRUE	\x83o\x83b\x83t\x83@\x83T\x83C\x83Y\x95s\x91\xAB
+ *										\x96߂\xE8\x92l\x82͕K\x97v\x82ȕ\xB6\x8E\x9A\x90\x94\x82\xAA\x95Ԃ\xE9
+ *								FALSE	\x95\xB6\x8E\x9A\x82\xF0\x93W\x8AJ\x82ł\xAB\x82\xBD
+ *	@retrun			\x95\xB6\x8E\x9A\x90\x94		\x8Fo\x97͕\xB6\x8E\x9A\x90\x94
+ *								0\x82̂Ƃ\xAB\x81A\x95\xB6\x8E\x9A\x8Fo\x97͂Ȃ\xB5
  */
 static size_t expand_wchar(const buff_char_t *b, wchar_t *buf, size_t buf_size, BOOL *too_samll)
 {
@@ -1983,17 +2012,18 @@
  *	(x,y) \x82\xCC1\x95\xB6\x8E\x9A\x82\xAA str\x82Ɠ\xAF\x88ꂩ\x92\xB2\x82ׂ\xE9
  *		*\x92\x8D 1\x95\xB6\x8E\x9A\x82\xAA\x95\xA1\x90\x94\x82\xCCwchar_t\x82\xA9\x82\xE7\x8D\\x90\xAC\x82\xB3\x82\xEA\x82Ă\xA2\x82\xE9
  *
- *	@param		y		PageStart + CursorY
- *	@param		str		1\x95\xB6\x8E\x9A(wchar_t\x97\xF1)
- *	@param		len		\x95\xB6\x8E\x9A\x97\xF1\x92\xB7
- *	@retval		0=\x83}\x83b\x83`\x82\xB5\x82Ȃ\xA9\x82\xC1\x82\xBD
- *				\x83}\x83b\x83`\x82\xB5\x82\xBD\x95\xB6\x8E\x9A\x97\xF1\x92\xB7
+ *	@param		b
+ *	@param		str		\x94\xE4\x8Ar\x95\xB6\x8E\x9A\x97\xF1(wchar_t)
+ *	@param		len		\x94\xE4\x8Ar\x95\xB6\x8E\x9A\x97\xF1\x92\xB7
+ *	@retval		\x83}\x83b\x83`\x82\xB5\x82\xBD\x95\xB6\x8E\x9A\x97\xF1\x92\xB7
+ *				0=\x83}\x83b\x83`\x82\xB5\x82Ȃ\xA9\x82\xC1\x82\xBD
  */
-static size_t MatchOneString(int x, int y, const wchar_t *str, size_t len)
+static size_t MatchOneStringPtr(const buff_char_t *b, const wchar_t *str, size_t len)
 {
+	if (len == 0) {
+		return 0;
+	}
 	int match_pos = 0;
-	int TmpPtr = GetLinePtr(y);
-	const buff_char_t *b = &CodeBuffW[TmpPtr + x];
 	if (b->wc2[1] == 0) {
 		// \x83T\x83\x8D\x83Q\x81[\x83g\x83y\x83A\x82ł͂Ȃ\xA2
 		if (str[match_pos] != b->wc2[0]) {
@@ -2030,6 +2060,83 @@
 }
 
 /**
+ *	(x,y) \x82\xCC1\x95\xB6\x8E\x9A\x82\xAA str\x82Ɠ\xAF\x88ꂩ\x92\xB2\x82ׂ\xE9
+ *		*\x92\x8D 1\x95\xB6\x8E\x9A\x82\xAA\x95\xA1\x90\x94\x82\xCCwchar_t\x82\xA9\x82\xE7\x8D\\x90\xAC\x82\xB3\x82\xEA\x82Ă\xA2\x82\xE9
+ *
+ *	@param		y		PageStart + CursorY
+ *	@param		str		1\x95\xB6\x8E\x9A(wchar_t\x97\xF1)
+ *	@param		len		\x95\xB6\x8E\x9A\x97\xF1\x92\xB7
+ *	@retval		0=\x83}\x83b\x83`\x82\xB5\x82Ȃ\xA9\x82\xC1\x82\xBD
+ *				\x83}\x83b\x83`\x82\xB5\x82\xBD\x95\xB6\x8E\x9A\x97\xF1\x92\xB7
+ */
+static size_t MatchOneString(int x, int y, const wchar_t *str, size_t len)
+{
+	int TmpPtr = GetLinePtr(y);
+	const buff_char_t *b = &CodeBuffW[TmpPtr + x];
+	return MatchOneStringPtr(b, str, len);
+}
+
+/**
+ *	b \x82\xA9\x82\xE7 str\x82Ɠ\xAF\x88ꂩ\x92\xB2\x82ׂ\xE9
+ *
+ *	@param		b		\x83o\x83b\x83t\x83@\x82ւ̃|\x83C\x83\x93\x83^\x81A\x82\xB1\x82\xB1\x82\xA9\x82猟\x8D\x{142DC2}\xE9
+ *	@param		LineCntinued	TRUE=\x8Ds\x82̌p\x91\xB1\x82\xF0\x8Dl\x97\xB6\x82\xB7\x82\xE9
+ *	@retval		TRUE	\x83}\x83b\x83`\x82\xB5\x82\xBD
+ *	@retval		FALSE	\x83}\x83b\x83`\x82\xB5\x82Ă\xA2\x82Ȃ\xA2
+ */
+static BOOL MatchStringPtr(const buff_char_t *b, const wchar_t *str, BOOL LineContinued)
+{
+	int x;
+	int y;
+	BOOL result;
+	size_t len = wcslen(str);
+	if (len == 0) {
+		return FALSE;
+	}
+	GetPosFromPtr(b, &x, &y);
+	for(;;) {
+		if (IsBuffPadding(b)) {
+			b++;
+			continue;
+		}
+		// 1\x95\xB6\x8E\x9A\x93\xAF\x88ꂩ\x92\xB2\x82ׂ\xE9
+		size_t match_len = MatchOneString(x, y, str, len);
+		if (match_len == 0) {
+			result = FALSE;
+			break;
+		}
+		len -= match_len;
+		if (len == 0) {
+			// \x91S\x95\xB6\x8E\x9A\x92\xB2\x82׏I\x82\xED\x82\xC1\x82\xBD
+			result = TRUE;
+			break;
+		}
+		str += match_len;
+
+		// \x8E\x9F\x82̕\xB6\x8E\x9A
+		x++;
+		if (x == NumOfColumns) {
+			if (LineContinued && ((b->attr & AttrLineContinued) != 0)) {
+				// \x8E\x9F\x82̍s\x82\xD6
+				y++;
+				if (y == NumOfLines) {
+					// \x83o\x83b\x83t\x83@\x8DŏI\x92[
+					return 0;
+				}
+				x = 0;
+				b = &CodeBuffW[GetLinePtr(y)];
+			} else {
+				// \x8Ds\x96\x96
+				result = FALSE;
+				break;
+			}
+		}
+	}
+
+	return result;
+}
+
+/**
  *	(x,y)\x82\xA9\x82\xE7 str\x82Ɠ\xAF\x88ꂩ\x92\xB2\x82ׂ\xE9
  *
  *	@param		x		\x83}\x83C\x83i\x83X\x82̎\x9E\x81A\x8F\xE3\x82̍s\x82\xAA\x91ΏۂɂȂ\xE9
@@ -2270,7 +2377,7 @@
 		}
 
 		while ((IEnd>=IStart) &&
-		       (CodeBuff[TmpPtr+IEnd]==0x20) &&
+		       (CodeBuffW[TmpPtr+IEnd].u32 == 0x20) &&
 		       (CodeBuffW[TmpPtr+IEnd].attr==AttrDefault) &&
 		       (CodeBuffW[TmpPtr+IEnd].attr2==AttrDefault)) {
 			IEnd--;
@@ -2302,8 +2409,27 @@
 				PrnSetAttr(CurAttr);
 				TempAttr = CurAttr;
 			}
-			PrnOutText(&(CodeBuff[TmpPtr+i]),count);
-			i = i+count;
+
+			// TODO \x82Ƃ肠\x82\xA6\x82\xB8 ANSI \x82Ŏ\xC0\x91\x95
+			{
+				char bufA[TermWidthMax+1];
+				int k;
+				char *p = bufA;
+				const buff_char_t *b = &CodeBuffW[TmpPtr + i];
+
+				for (k = 0; k < count; b++,k++) {
+					if (IsBuffPadding(b)) {
+						continue;
+					}
+					unsigned short c = b->ansi_char;
+					*p++ = (c & 0xff);
+					if (c >= 0x100) {
+						*p++ = ((c >> 8) & 0xff);
+					}
+				}
+				PrnOutText(bufA, count);
+				i = i+count;
+			}
 		}
 		PrnNewLine();
 		TmpPtr = NextLinePtr(TmpPtr);
@@ -2313,24 +2439,34 @@
 	VTPrintEnd();
 }
 
-void BuffDumpCurrentLine(BYTE TERM)
+// TODO \x82Ƃ肠\x82\xA6\x82\xB8 ANSI \x82Ŏ\xC0\x91\x95
 // Dumps current line to the file (for path through printing)
 //   HFile: file handle
 //   TERM: terminator character
 //	= LF or VT or FF
+void BuffDumpCurrentLine(BYTE TERM)
 {
 	int i, j;
-#if !ATR
-	PCHAR CodeLine = &CodeBuff[LinePtr];
-#endif
+	buff_char_t *b = &CodeBuffW[LinePtr];
+	char bufA[TermWidthMax+1];
+	char *p = bufA;
 
 	i = NumOfColumns;
-	while ((i>0) && (CodeLine[i-1]==0x20)) {
+	while ((i>0) && (b[i-1].ansi_char == 0x20)) {
 		i--;
 	}
+	p = bufA;
 	for (j=0; j<i; j++) {
-		WriteToPrnFile(CodeLine[j],FALSE);
+		unsigned short c = b[j].ansi_char;
+		*p++ = (c & 0xff);
+		if (c > 0x100) {
+			*p++ = (c & 0xff);
+		}
 	}
+	p = bufA;
+	for (j=0; j<i; j++) {
+		WriteToPrnFile(bufA[j],FALSE);
+	}
 	WriteToPrnFile(0,TRUE);
 	if ((TERM>=LF) && (TERM<=FF)) {
 		WriteToPrnFile(0x0d,FALSE);
@@ -2364,11 +2500,12 @@
 	return url_char[u32] == 0 ? FALSE : TRUE;
 }
 
+#if 0
 static void markURL(int x)
 {
 #if !ATR
 	buff_char_t *CodeLineW = &CodeBuffW[LinePtr];
-	PCHAR CodeLine = &CodeBuff[LinePtr];
+//	PCHAR CodeLine = &CodeBuff[LinePtr];
 //	PCHAR AttrLine = &AttrBuff[LinePtr];
 //	PCHAR AttrLine2 = &AttrBuff2[LinePtr];
 //	PCHAR AttrLineFG = &AttrBuffFG[LinePtr];
@@ -2376,7 +2513,7 @@
 #endif
 	LONG PrevCharPtr;
 //	CHAR PrevCharAttr;
-	CHAR PrevCharCode;
+//	CHAR PrevCharCode;
 
 	// RFC3986(Uniform Resource Identifier (URI): Generic Syntax)\x82ɏ\x80\x8B\x92\x82\xB7\x82\xE9
 	// by sakura editor 1.5.2.1: etc_uty.cpp
@@ -2395,17 +2532,17 @@
 	     * other: url head char --> url_table array number + 1
 	     */
 	};
-	static char *prefix[] = {
-		"https://",
-		"http://",
-		"sftp://",
-		"tftp://",
-		"news://",
-		"ftp://",
-		"mms://",
+	static wchar_t *prefix[] = {
+		L"https://",
+		L"http://",
+		L"sftp://",
+		L"tftp://",
+		L"news://",
+		L"ftp://",
+		L"mms://",
 		NULL
 	};
-	unsigned char ch = CodeLine[x];
+	unsigned char ch = CodeLineW[x].u32;
 
 	if (ts.EnableClickableUrl == FALSE &&
 		(ts.ColorFlag & CF_URLCOLOR) == 0)
@@ -2415,12 +2552,12 @@
 	if (x == 0) {
 		buff_char_t *PrevCodeBufW;
 		PrevCharPtr = PrevLinePtr(LinePtr) + NumOfColumns-1;
-		PrevCharCode = CodeBuff[PrevCharPtr];
+//		PrevCharCode = CodeBuff[PrevCharPtr];
 		//PrevCharAttr = AttrBuff[PrevCharPtr];
 		PrevCodeBufW = &CodeBuffW[PrevCharPtr];
 		if ((PrevCodeBufW[0].attr & AttrURL) && !(PrevCodeBufW[0].attr&(AttrKanji|AttrSpecial)) && !(ch & 0x80) && url_char[ch]) {
 			if ((CodeLineW[0].attr & AttrLineContinued) || (ts.JoinSplitURL &&
-			    (PrevCharCode == ts.JoinSplitURLIgnoreEOLChar || ts.JoinSplitURLIgnoreEOLChar == '\0' ))) {
+			    (PrevCodeBufW[0].u32 == ts.JoinSplitURLIgnoreEOLChar || ts.JoinSplitURLIgnoreEOLChar == '\0' ))) {
 				CodeLineW[0].attr |= AttrURL;
 			}
 		}
@@ -2434,13 +2571,13 @@
 		return;
 	}
 
-	if ((x-2>=0) && !strncmp(&CodeLine[x-2], "://", 3)) {
+	if (x >= 2 && CodeLineW[x - 2].u32 == ':' && CodeLineW[x - 1].u32 == '/' && CodeLineW[x - 0].u32 == ':') {
 		RECT rc;
 		int CaretX, CaretY;
-		char **p = prefix;
+		wchar_t **p = prefix;
 
 		while (*p) {
-			size_t len = strlen(*p) - 1;
+			size_t len = wcslen(*p) - 1;
 			if ((x-len>=0) && !strncmp(&CodeLine[x-len], *p, len)) {
 				size_t i;
 				for (i = 0; i <= len; i++) {
@@ -2466,7 +2603,9 @@
 		InvalidateRect(HVTWin, &rc, FALSE);
 	}
 }
+#endif
 
+#if !UNICODE_INTERNAL_BUFF
 void BuffPutKanji(WORD w, TCharAttr Attr, BOOL Insert)
 // Put a kanji character in the buffer at the current position
 //   b: character
@@ -2584,6 +2723,7 @@
 		StrChangeCount = StrChangeCount + 2;
 	}
 }
+#endif
 
 static BOOL BuffIsHalfWidthFromPropery(char width_property)
 {
@@ -3061,6 +3201,34 @@
 	return p != NULL;
 }
 
+static unsigned short ConverACPChar(const buff_char_t *b)
+{
+	size_t pool_lenW = 128;
+	wchar_t *strW = (wchar_t *)malloc(pool_lenW * sizeof(wchar_t));
+	BOOL too_small = FALSE;
+	size_t lenW = expand_wchar(b, strW, pool_lenW, &too_small);
+	if (too_small) {
+		strW = (wchar_t *)realloc(strW, lenW * sizeof(wchar_t));
+		expand_wchar(b, strW, lenW, &too_small);
+	}
+
+	size_t lenA;
+	char *strA = _WideCharToMultiByte(strW, lenW, CP_ACP, &lenA);
+	unsigned short chA = *strA;
+	if (!IsDBCSLeadByte((BYTE)(*strA))) {
+		// 1byte\x95\xB6\x8E\x9A
+		chA = strA[0];
+	}
+	else {
+		// 2byte\x95\xB6\x8E\x9A
+		chA = strA[0] | (strA[1] << 8);
+	}
+	free(strA);
+	free(strW);
+
+	return chA;
+}
+
 /**
  *	\x83\x86\x83j\x83R\x81[\x83h\x83L\x83\x83\x83\x89\x83N\x83^\x82\xF01\x95\xB6\x8E\x9A\x83o\x83b\x83t\x83@\x82֓\xFC\x97͂\xB7\x82\xE9
  *	@param[in]	u32		unicode character(UTF-32)
@@ -3071,7 +3239,7 @@
 int BuffPutUnicode(unsigned int u32, TCharAttr Attr, BOOL Insert)
 {
 #if !ATR
-	PCHAR CodeLine = &CodeBuff[LinePtr];
+//	PCHAR CodeLine = &CodeBuff[LinePtr];
 //	PCHAR AttrLine = &AttrBuff[LinePtr];
 //	PCHAR AttrLine2 = &AttrBuff2[LinePtr];
 //	PCHAR AttrLineFG = &AttrBuffFG[LinePtr];
@@ -3238,7 +3406,7 @@
 
 			// \x88\xEA\x94ԍŌ\xE3\x82̕\xB6\x8E\x9A\x82\xAA\x91S\x8Ap\x82̏ꍇ\x81A
 			if (LineEnd <= NumOfColumns - 1 && (CodeLineW[LineEnd - 1].attr & AttrKanji)) {
-				CodeLine[LineEnd - 1] = 0x20;
+//				CodeLine[LineEnd - 1] = 0x20;
 				BuffSetChar(&CodeLineW[LineEnd - 1], 0x20, 'H');
 				CodeLineW[LineEnd].attr &= ~AttrKanji;
 				//				CodeLine[LineEnd+1] = 0x20;
@@ -3249,7 +3417,7 @@
 			if (!half_width) {
 				MoveLen = LineEnd - CursorX - 1;
 				if (MoveLen > 0) {
-					memmove(&CodeLine[CursorX + 2], &CodeLine[CursorX], MoveLen);
+//					memmove(&CodeLine[CursorX + 2], &CodeLine[CursorX], MoveLen);
 					memmoveW(&(CodeLineW[CursorX + 2]), &(CodeLineW[CursorX]), MoveLen);
 //					memmove(&AttrLine[CursorX + 2], &AttrLine[CursorX], MoveLen);
 //					memmove(&AttrLine2[CursorX + 2], &AttrLine2[CursorX], MoveLen);
@@ -3260,7 +3428,7 @@
 			else {
 				MoveLen = LineEnd - CursorX;
 				if (MoveLen > 0) {
-					memmove(&CodeLine[CursorX + 1], &CodeLine[CursorX], MoveLen);
+//					memmove(&CodeLine[CursorX + 1], &CodeLine[CursorX], MoveLen);
 					memmoveW(&(CodeLineW[CursorX + 1]), &(CodeLineW[CursorX]), MoveLen);
 //					memmove(&AttrLine[CursorX + 1], &AttrLine[CursorX], MoveLen);
 //					memmove(&AttrLine2[CursorX + 1], &AttrLine2[CursorX], MoveLen);
@@ -3269,7 +3437,7 @@
 				}
 			}
 
-			CodeLine[CursorX] = b1;
+//TODO			CodeLine[CursorX] = b1;
 			BuffSetChar2(&CodeLineW[CursorX], u32, width_property, half_width, emoji);
 			CodeLineW[CursorX].attr = Attr.Attr;
 			CodeLineW[CursorX].attr2 = Attr.Attr2;
@@ -3280,7 +3448,7 @@
 			CodeLineW[CursorX].fg = Attr.Fore;
 			CodeLineW[CursorX].bg = Attr.Back;
 			if (!half_width && CursorX < LineEnd) {
-				CodeLine[CursorX + 1] = 0;
+//				CodeLine[CursorX + 1] = 0;
 				BuffSetChar(&CodeLineW[CursorX + 1], 0, 'H');
 				CodeLineW[CursorX + 1].Padding = TRUE;
 				CodeLineW[CursorX + 1].attr = Attr.Attr;
@@ -3300,7 +3468,7 @@
 			/* last char in current line is kanji first? */
 			if ((CodeLineW[LineEnd].attr & AttrKanji) != 0) {
 				/* then delete it */
-				CodeLine[LineEnd] = 0x20;
+//				CodeLine[LineEnd] = 0x20;
 				BuffSetChar(&CodeLineW[LineEnd], 0x20, 'H');
 				CodeLineW[LineEnd].attr = CurCharAttr.Attr;
 				CodeLineW[LineEnd].attr2 = CurCharAttr.Attr2;
@@ -3349,7 +3517,7 @@
 					}
 				}
 
-				CodeLine[CursorX] = b1;
+// TODO				CodeLine[CursorX] = b1;
 				BuffSetChar2(&CodeLineW[CursorX], u32, width_property, half_width, emoji);
 				if (half_width) {
 					CodeLineW[CursorX].attr = Attr.Attr;
@@ -3370,7 +3538,7 @@
 						buff_char_t *p = &CodeLineW[CursorX + 1];
 						BuffSetChar(p, 0, 'H');
 						p->Padding = TRUE;
-						CodeLine[CursorX + 1] = b2;
+// TODO						CodeLine[CursorX + 1] = b2;
 						CodeLineW[CursorX + 1].attr = 0;
 						CodeLineW[CursorX + 1].attr2 = 0;
 //						AttrLineFG[CursorX + 1] = 0;
@@ -3455,7 +3623,7 @@
 	}
 }
 
-/*
+/**
  *	1\x8Ds\x95`\x89\xE6
  *
  *	@param	DrawX,Y			Clint\x97̈\xE6\x95`\x89\xE6\x88ʒu(pixel)
@@ -3508,6 +3676,7 @@
 
 		BOOL DrawFlag = FALSE;
 		BOOL SetString = FALSE;
+		unsigned short ansi_char;
 
 		// \x83A\x83g\x83\x8A\x83r\x83\x85\x81[\x83g\x8E擾
 		if (count == 0) {
@@ -3527,8 +3696,13 @@
 			CurSelected = CheckSelect(istart+count,SY);
 		}
 
-		bufA[lenA] = CodeBuff[TmpPtr + istart + count];
+		ansi_char = CodeBuffW[TmpPtr + istart + count].ansi_char;
+		bufA[lenA] = ansi_char & 0xff;
 		lenA++;
+		if (ansi_char > 0x100) {
+			bufA[lenA] = ansi_char & 0xff;
+			lenA++;
+		}
 
 		if (b->u32 == 0) {	// TODO IsBuffPadding()
 			// \x91S\x8Ap\x82̎\x9F\x82̕\xB6\x8E\x9A,\x8F\x88\x97\x9D\x95s\x97v
@@ -3781,7 +3955,7 @@
 		DestPtr = GetLinePtr(PageStart+CursorBottom) + CursorLeftM;
 		for (i = CursorBottom-1 ; i >= CursorTop ; i--) {
 			SrcPtr = PrevLinePtr(DestPtr);
-			memcpy(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
+//			memcpy(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
 			memcpyW(&(CodeBuffW[DestPtr]), &(CodeBuffW[SrcPtr]), linelen);
 //			memcpy(&(AttrBuff[DestPtr]), &(AttrBuff[SrcPtr]), linelen);
 //			memcpy(&(AttrBuff2[DestPtr]), &(AttrBuff2[SrcPtr]), linelen);
@@ -3789,7 +3963,7 @@
 //			memcpy(&(AttrBuffBG[DestPtr]), &(AttrBuffBG[SrcPtr]), linelen);
 			DestPtr = SrcPtr;
 		}
-		memset(&(CodeBuff[SrcPtr]), 0x20, linelen);
+//		memset(&(CodeBuff[SrcPtr]), 0x20, linelen);
 		memsetW(&(CodeBuffW[SrcPtr]), 0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, linelen);
 //		memset(&(AttrBuff[SrcPtr]), AttrDefault, linelen);
 //		memset(&(AttrBuff2[SrcPtr]), CurCharAttr.Attr2 & Attr2ColorMask, linelen);
@@ -3854,7 +4028,7 @@
 		if (n<CursorBottom-CursorTop+1) {
 			SrcPtr = GetLinePtr(PageStart+CursorTop+n) + (LONG)CursorLeftM;
 			for (i = CursorTop+n ; i<=CursorBottom ; i++) {
-				memmove(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
+//				memmove(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
 				memmoveW(&(CodeBuffW[DestPtr]), &(CodeBuffW[SrcPtr]), linelen);
 //				memmove(&(AttrBuff[DestPtr]), &(AttrBuff[SrcPtr]), linelen);
 //				memmove(&(AttrBuff2[DestPtr]), &(AttrBuff2[SrcPtr]), linelen);
@@ -3868,7 +4042,7 @@
 			n = CursorBottom-CursorTop+1;
 		}
 		for (i = CursorBottom+1-n ; i<=CursorBottom; i++) {
-			memset(&(CodeBuff[DestPtr]), 0x20, linelen);
+//			memset(&(CodeBuff[DestPtr]), 0x20, linelen);
 			memsetW(&(CodeBuffW[DestPtr]), 0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, linelen);
 //			memset(&(AttrBuff[DestPtr]), AttrDefault, linelen);
 //			memset(&(AttrBuff2[DestPtr]), CurCharAttr.Attr2 & Attr2ColorMask, linelen);
@@ -3917,7 +4091,7 @@
 		if (n < CursorBottom - CursorTop + 1) {
 			SrcPtr = GetLinePtr(PageStart+CursorTop+n) + CursorLeftM;
 			for (i = CursorTop+n ; i<=CursorBottom ; i++) {
-				memmove(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
+//				memmove(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
 				memmoveW(&(CodeBuffW[DestPtr]), &(CodeBuffW[SrcPtr]), linelen);
 //				memmove(&(AttrBuff[DestPtr]), &(AttrBuff[SrcPtr]), linelen);
 //				memmove(&(AttrBuff2[DestPtr]), &(AttrBuff2[SrcPtr]), linelen);
@@ -3931,7 +4105,7 @@
 			n = CursorBottom - CursorTop + 1;
 		}
 		for (i = CursorBottom+1-n ; i<=CursorBottom; i++) {
-			memset(&(CodeBuff[DestPtr]), 0x20, linelen);
+//			memset(&(CodeBuff[DestPtr]), 0x20, linelen);
 			memsetW(&(CodeBuffW[DestPtr]), 0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, linelen);
 //			memset(&(AttrBuff[DestPtr]), AttrDefault, linelen);
 //			memset(&(AttrBuff2[DestPtr]), CurCharAttr.Attr2 & Attr2ColorMask, linelen);
@@ -3971,7 +4145,7 @@
 	if (n < CursorBottom - CursorTop + 1) {
 		SrcPtr = GetLinePtr(PageStart+CursorBottom-n) + CursorLeftM;
 		for (i=CursorBottom-n ; i>=CursorTop ; i--) {
-			memmove(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
+//			memmove(&(CodeBuff[DestPtr]), &(CodeBuff[SrcPtr]), linelen);
 			memmoveW(&(CodeBuffW[DestPtr]), &(CodeBuffW[SrcPtr]), linelen);
 //			memmove(&(AttrBuff[DestPtr]), &(AttrBuff[SrcPtr]), linelen);
 //			memmove(&(AttrBuff2[DestPtr]), &(AttrBuff2[SrcPtr]), linelen);
@@ -3985,7 +4159,7 @@
 		n = CursorBottom - CursorTop + 1;
 	}
 	for (i = CursorTop+n-1; i>=CursorTop; i--) {
-		memset(&(CodeBuff[DestPtr]), 0x20, linelen);
+//		memset(&(CodeBuff[DestPtr]), 0x20, linelen);
 		memsetW(&(CodeBuffW[DestPtr]), 0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, linelen);
 //		memset(&(AttrBuff[DestPtr]), AttrDefault, linelen);
 //		memset(&(AttrBuff2[DestPtr]), CurCharAttr.Attr2 & Attr2ColorMask, linelen);
@@ -4032,14 +4206,21 @@
 	}
 }
 
-// called by BuffDblClk
-//   check if a character is the word delimiter
+/**
+ * called by BuffDblClk
+ *   check if a character is the word delimiter
+ *
+ *	TODO Unicode\x89\xBB
+ */
 static BOOL IsDelimiter(LONG Line, int CharPtr)
 {
+//	whar_t *DelimListW;
+	char *find;
 	if ((CodeBuffW[Line+CharPtr].attr & AttrKanji) !=0) {
 		return (ts.DelimDBCS!=0);
 	}
-	return (strchr(ts.DelimList,CodeBuff[Line+CharPtr])!=NULL);
+	find = strchr(ts.DelimList, CodeBuffW[Line+CharPtr].ansi_char);
+	return (find != NULL);
 }
 
 void GetMinMax(int i1, int i2, int i3,
@@ -4273,9 +4454,9 @@
 		YStart = YEnd = Y;
 
 		if (IsDelimiter(TmpPtr,IStart)) {
-			b = CodeBuff[TmpPtr+IStart];
+			b = CodeBuffW[TmpPtr+IStart].ansi_char;
 			DBCS = (CodeBuffW[TmpPtr+IStart].attr & AttrKanji) != 0;
-			while ((b==CodeBuff[TmpPtr+IStart]) ||
+			while ((b==CodeBuffW[TmpPtr+IStart].ansi_char) ||
 			       DBCS &&
 			       ((CodeBuffW[TmpPtr+IStart].attr & AttrKanji)!=0)) {
 				MoveCharPtr(TmpPtr,&IStart,-1); // move left
@@ -4300,7 +4481,7 @@
 					}
 				}
 			}
-			if ((b!=CodeBuff[TmpPtr+IStart]) &&
+			if ((b!=CodeBuffW[TmpPtr+IStart].ansi_char) &&
 			    ! (DBCS && ((CodeBuffW[TmpPtr+IStart].attr & AttrKanji)!=0))) {
 				// \x8DŏI\x88ʒu\x82\xAA Delimiter \x82łȂ\xA2\x8Fꍇ\x82ɂ͂ЂƂ‰E\x82ɂ\xB8\x82炷
 				if (ts.EnableContinuedLineCopy && IStart == NumOfColumns-1) {
@@ -4317,7 +4498,7 @@
 			// \x8Ds\x82\xAA\x88ړ\xAE\x82\xB5\x82Ă\xA2\x82邩\x82\xE0\x82\xB5\x82\xEA\x82Ȃ\xA2\x82̂ŁA\x83N\x83\x8A\x83b\x83N\x82\xB5\x82\xBD\x8Ds\x82\xF0\x8E\xE6\x82蒼\x82\xB7
 			TmpPtr = GetLinePtr(YEnd);
 			i = 1;
-			while (((b==CodeBuff[TmpPtr+IEnd]) ||
+			while (((b==CodeBuffW[TmpPtr+IEnd].ansi_char) ||
 			        DBCS &&
 			        ((CodeBuffW[TmpPtr+IEnd].attr & AttrKanji)!=0))) {
 				i = MoveCharPtr(TmpPtr,&IEnd,1); // move right
@@ -4631,10 +4812,10 @@
 
 			i = 1;
 			if (IsDelimiter(TmpPtr,X)) {
-				b = CodeBuff[TmpPtr+X];
+				b = CodeBuffW[TmpPtr+X].ansi_char;
 				DBCS = (CodeBuffW[TmpPtr+X].attr & AttrKanji) != 0;
 				while ((i!=0) &&
-				       ((b==CodeBuff[TmpPtr+SelectEnd.x]) ||
+				       ((b==CodeBuffW[TmpPtr+SelectEnd.x].ansi_char) ||
 				        DBCS &&
 				        ((CodeBuffW[TmpPtr+SelectEnd.x].attr & AttrKanji)!=0))) {
 					i = MoveCharPtr(TmpPtr,(int *)&SelectEnd.x,1); // move right
@@ -4659,15 +4840,15 @@
 				SelectEnd.y = Y;
 			}
 			if (IsDelimiter(TmpPtr,SelectEnd.x)) {
-				b = CodeBuff[TmpPtr+SelectEnd.x];
+				b = CodeBuffW[TmpPtr+SelectEnd.x].ansi_char;
 				DBCS = (CodeBuffW[TmpPtr+SelectEnd.x].attr & AttrKanji) != 0;
 				while ((SelectEnd.x>0) &&
-				       ((b==CodeBuff[TmpPtr+SelectEnd.x]) ||
+				       ((b==CodeBuffW[TmpPtr+SelectEnd.x].ansi_char) ||
 				       DBCS &&
 				       ((CodeBuffW[TmpPtr+SelectEnd.x].attr & AttrKanji)!=0))) {
 					MoveCharPtr(TmpPtr,(int *)&SelectEnd.x,-1); // move left
 				}
-				if ((b!=CodeBuff[TmpPtr+SelectEnd.x]) &&
+				if ((b!=CodeBuffW[TmpPtr+SelectEnd.x].ansi_char) &&
 				    ! (DBCS &&
 				    ((CodeBuffW[TmpPtr+SelectEnd.x].attr & AttrKanji)!=0))) {
 					MoveCharPtr(TmpPtr,(int *)&SelectEnd.x,1);
@@ -5012,7 +5193,7 @@
 	Selected = FALSE;
 
 	NewLine(0);
-	memset(&CodeBuff[0],0x20,BufferSize);
+//	memset(&CodeBuff[0],0x20,BufferSize);
 	memsetW(&CodeBuffW[0],0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, BufferSize);
 //	memset(&AttrBuff[0],AttrDefault,BufferSize);
 //	memset(&AttrBuff2[0],CurCharAttr.Attr2 & Attr2ColorMask, BufferSize);
@@ -5242,6 +5423,7 @@
 	DispSetCurCharAttr(Attr);
 }
 
+// TODO
 void BuffSaveScreen()
 {
 	PCHAR CodeDest, AttrDest, AttrDest2, AttrDestFG, AttrDestBG;
@@ -5271,7 +5453,7 @@
 			DestPtr = 0;
 
 			for (i=0; i<NumOfLines; i++) {
-				memcpy(&CodeDest[DestPtr], &CodeBuff[SrcPtr], NumOfColumns);
+//				memcpy(&CodeDest[DestPtr], &CodeBuff[SrcPtr], NumOfColumns);
 				memcpyW(&CodeDestW[DestPtr], &CodeBuffW[SrcPtr], NumOfColumns);
 //				memcpy(&AttrDest[DestPtr], &AttrBuff[SrcPtr], NumOfColumns);
 //				memcpy(&AttrDest2[DestPtr], &AttrBuff2[SrcPtr], NumOfColumns);
@@ -5326,7 +5508,7 @@
 		DestPtr = GetLinePtr(PageStart);
 
 		for (i=0; i<CopyY; i++) {
-			memcpy(&CodeBuff[DestPtr], &CodeSrc[SrcPtr], CopyX);
+//			memcpy(&CodeBuff[DestPtr], &CodeSrc[SrcPtr], CopyX);
 			memcpyW(&CodeBuffW[DestPtr], &CodeSrcW[SrcPtr], CopyX);
 //			memcpy(&AttrBuff[DestPtr], &AttrSrc[SrcPtr], CopyX);
 //			memcpy(&AttrBuff2[DestPtr], &AttrSrc2[SrcPtr], CopyX);
@@ -5333,7 +5515,7 @@
 //			memcpy(&AttrBuffFG[DestPtr], &AttrSrcFG[SrcPtr], CopyX);
 //			memcpy(&AttrBuffBG[DestPtr], &AttrSrcBG[SrcPtr], CopyX);
 			if (CodeBuffW[DestPtr+CopyX-1].attr & AttrKanji) {
-				CodeBuff[DestPtr+CopyX-1] = ' ';
+//				CodeBuff[DestPtr+CopyX-1] = ' ';
 				BuffSetChar(&CodeBuffW[DestPtr+CopyX-1], 0x20, 'H');
 				CodeBuffW[DestPtr+CopyX-1].attr ^= AttrKanji;
 			}
@@ -5386,7 +5568,7 @@
 	for (i = CursorY ; i <= YEnd ; i++) {
 		for (j = TmpPtr + offset; j < TmpPtr + NumOfColumns - offset; j++) {
 			if (!(CodeLineW[j].attr2 & Attr2Protect)) {
-				CodeBuff[j] = 0x20;
+//				CodeBuff[j] = 0x20;
 				BuffSetChar(&CodeBuffW[j], 0x20, 'H');
 				CodeLineW[j].attr &= AttrSgrMask;
 			}
@@ -5432,7 +5614,7 @@
 		}
 		for (j = TmpPtr; j < TmpPtr + offset; j++) {
 			if (!(CodeLineW[j].attr2 & Attr2Protect)) {
-				CodeBuff[j] = 0x20;
+//				CodeBuff[j] = 0x20;
 				BuffSetChar(&CodeBuffW[j], 0x20, 'H');
 				CodeBuffW[j].attr &= AttrSgrMask;
 			}
@@ -5472,7 +5654,7 @@
 		if ((XStart>0) &&
 		    ((CodeBuffW[Ptr+XStart-1].attr & AttrKanji) != 0) &&
 		    ((CodeBuffW[Ptr+XStart-1].attr2 & Attr2Protect) == 0)) {
-			CodeBuff[Ptr+XStart-1] = 0x20;
+//			CodeBuff[Ptr+XStart-1] = 0x20;
 			BuffSetChar(&CodeBuffW[Ptr+XStart-1], 0x20, 'H');
 			CodeBuffW[Ptr+XStart-1].attr &= AttrSgrMask;
 		}
@@ -5479,13 +5661,13 @@
 		if ((XStart+C<NumOfColumns) &&
 		    ((CodeBuffW[Ptr+XStart+C-1].attr & AttrKanji) != 0) &&
 		    ((CodeBuffW[Ptr+XStart+C-1].attr2 & Attr2Protect) == 0)) {
-			CodeBuff[Ptr+XStart+C] = 0x20;
+//			CodeBuff[Ptr+XStart+C] = 0x20;
 			BuffSetChar(&CodeBuffW[Ptr+XStart+C], 0x20, 'H');
 			CodeBuffW[Ptr+XStart+C].attr &= AttrSgrMask;
 		}
 		for (j=Ptr+XStart; j<Ptr+XStart+C; j++) {
 			if (!(CodeBuffW[j].attr2 & Attr2Protect)) {
-				CodeBuff[j] = 0x20;
+//				CodeBuff[j] = 0x20;
 				BuffSetChar(&CodeBuffW[j], 0x20, 'H');
 				CodeBuffW[j].attr &= AttrSgrMask;
 			}
@@ -5501,7 +5683,7 @@
 //  Count: number of characters to be erased
 {
 #if !ATR
-	PCHAR CodeLine = &CodeBuff[LinePtr];
+//	PCHAR CodeLine = &CodeBuff[LinePtr];
 //	PCHAR AttrLine = &AttrBuff[LinePtr];
 //	PCHAR AttrLine2 = &AttrBuff2[LinePtr];
 //	PCHAR AttrLineFG = &AttrBuffFG[LinePtr];
@@ -5524,7 +5706,7 @@
 	NewLine(PageStart+CursorY);
 	for (i=XStart; i < XStart + Count; i++) {
 		if (!(CodeLineW[i].attr2 & Attr2Protect)) {
-			CodeLine[i] = 0x20;
+//			CodeLine[i] = 0x20;
 			BuffSetChar(&CodeLineW[i], 0x20, 'H');
 			CodeLineW[i].attr &= AttrSgrMask;
 		}
@@ -5556,27 +5738,27 @@
 		Ptr = LPtr + CursorLeftM;
 
 		if (CodeBuffW[LPtr+CursorRightM].attr & AttrKanji) {
-			CodeBuff[LPtr+CursorRightM] = 0x20;
+//			CodeBuff[LPtr+CursorRightM] = 0x20;
 			BuffSetChar(&CodeBuffW[LPtr+CursorRightM], 0x20, 'H');
 			CodeBuffW[LPtr+CursorRightM].attr &= ~AttrKanji;
 			if (CursorRightM < NumOfColumns-1) {
-				CodeBuff[LPtr+CursorRightM+1] = 0x20;
+//				CodeBuff[LPtr+CursorRightM+1] = 0x20;
 				BuffSetChar(&CodeBuffW[LPtr+CursorRightM+1], 0x20, 'H');
 			}
 		}
 
 		if (CodeBuffW[Ptr+count-1].attr & AttrKanji) {
-			CodeBuff[Ptr+count] = 0x20;
+//			CodeBuff[Ptr+count] = 0x20;
 			BuffSetChar(&CodeBuffW[Ptr+count], 0x20, 'H');
 		}
 
 		if (CursorLeftM > 0 && CodeBuffW[Ptr-1].attr & AttrKanji) {
-			CodeBuff[Ptr-1] = 0x20;
+//			CodeBuff[Ptr-1] = 0x20;
 			BuffSetChar(&CodeBuffW[Ptr-1], 0x20, 'H');
 			CodeBuffW[Ptr-1].attr &= ~AttrKanji;
 		}
 
-		memmove(&(CodeBuff[Ptr]),   &(CodeBuff[Ptr+count]),   MoveLen);
+//		memmove(&(CodeBuff[Ptr]),   &(CodeBuff[Ptr+count]),   MoveLen);
 		memmoveW(&(CodeBuffW[Ptr]),   &(CodeBuffW[Ptr+count]),   MoveLen);
 //		memmove(&(AttrBuff[Ptr]),   &(AttrBuff[Ptr+count]),   MoveLen);
 //		memmove(&(AttrBuff2[Ptr]),  &(AttrBuff2[Ptr+count]),  MoveLen);
@@ -5583,7 +5765,7 @@
 //		memmove(&(AttrBuffFG[Ptr]), &(AttrBuffFG[Ptr+count]), MoveLen);
 //		memmove(&(AttrBuffBG[Ptr]), &(AttrBuffBG[Ptr+count]), MoveLen);
 
-		memset(&(CodeBuff[Ptr+MoveLen]),   0x20,             count);
+//		memset(&(CodeBuff[Ptr+MoveLen]),   0x20,             count);
 		memsetW(&(CodeBuffW[Ptr+MoveLen]), 0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, count);
 //		memset(&(AttrBuff[Ptr+MoveLen]),   AttrDefault,      count);
 //		memset(&(AttrBuff2[Ptr+MoveLen]),  CurCharAttr.Attr2 & Attr2ColorMask, count);
@@ -5609,19 +5791,19 @@
 		Ptr = LPtr + CursorLeftM;
 
 		if (CursorRightM < NumOfColumns-1 && CodeBuffW[LPtr+CursorRightM].attr & AttrKanji) {
-			CodeBuff[LPtr+CursorRightM+1] = 0x20;
+//			CodeBuff[LPtr+CursorRightM+1] = 0x20;
 			BuffSetChar(&CodeBuffW[LPtr+CursorRightM+1], 0x20, 'H');
 		}
 
 		if (CursorLeftM > 0 && CodeBuffW[Ptr-1].attr & AttrKanji) {
-			CodeBuff[Ptr-1] = 0x20;
+//			CodeBuff[Ptr-1] = 0x20;
 			BuffSetChar(&CodeBuffW[Ptr-1], 0x20, 'H');
 			CodeBuffW[Ptr-1].attr &= ~AttrKanji;
-			CodeBuff[Ptr] = 0x20;
+//			CodeBuff[Ptr] = 0x20;
 			BuffSetChar(&CodeBuffW[Ptr], 0x20, 'H');
 		}
 
-		memmove(&(CodeBuff[Ptr+count]),   &(CodeBuff[Ptr]),   MoveLen);
+//		memmove(&(CodeBuff[Ptr+count]),   &(CodeBuff[Ptr]),   MoveLen);
 		memmoveW(&(CodeBuffW[Ptr+count]),   &(CodeBuffW[Ptr]),   MoveLen);
 //		memmove(&(AttrBuff[Ptr+count]),   &(AttrBuff[Ptr]),   MoveLen);
 //		memmove(&(AttrBuff2[Ptr+count]),  &(AttrBuff2[Ptr]),  MoveLen);
@@ -5628,7 +5810,7 @@
 //		memmove(&(AttrBuffFG[Ptr+count]), &(AttrBuffFG[Ptr]), MoveLen);
 //		memmove(&(AttrBuffBG[Ptr+count]), &(AttrBuffBG[Ptr]), MoveLen);
 
-		memset(&(CodeBuff[Ptr]),   0x20,             count);
+//		memset(&(CodeBuff[Ptr]),   0x20,             count);
 		memsetW(&(CodeBuffW[Ptr]),   0x20, CurCharAttr.Fore, CurCharAttr.Back, AttrDefault, CurCharAttr.Attr2 & Attr2ColorMask, count);
 //		memset(&(AttrBuff[Ptr]),   AttrDefault,      count);
 //		memset(&(AttrBuff2[Ptr]),  CurCharAttr.Attr2 & Attr2ColorMask, count);
@@ -5636,7 +5818,7 @@
 //		memset(&(AttrBuffBG[Ptr]), CurCharAttr.Back, count);
 
 		if (CodeBuffW[LPtr+CursorRightM].attr & AttrKanji) {
-			CodeBuff[LPtr+CursorRightM] = 0x20;
+//			CodeBuff[LPtr+CursorRightM] = 0x20;
 			BuffSetChar(&CodeBuffW[LPtr+CursorRightM], 0x20, 'H');
 			CodeBuffW[LPtr+CursorRightM].attr &= ~AttrKanji;
 		}
@@ -5650,6 +5832,7 @@
 // \x8C\xBB\x8Dݍs\x82\xF0\x82܂邲\x82ƃo\x83b\x83t\x83@\x82Ɋi\x94[\x82\xB7\x82\xE9\x81B\x95Ԃ\xE8\x92l\x82͌\xBB\x8D݂̃J\x81[\x83\\x83\x8B\x88ʒu(X)\x81B
 int BuffGetCurrentLineData(char *buf, int bufsize)
 {
+#if 0
 	LONG Ptr;
 
 	Ptr = GetLinePtr(PageStart + CursorY);
@@ -5656,6 +5839,9 @@
 	memset(buf, 0, bufsize);
 	memcpy(buf, &CodeBuff[Ptr], min(NumOfColumns, bufsize - 1));
 	return (CursorX);
+#endif
+	BuffGetAnyLineData(CursorY, buf, bufsize);
+	return CursorX;
 }
 
 /**
@@ -5707,6 +5893,8 @@
 {
 	LONG Ptr;
 	int copysize = 0;
+	int i;
+	int idx;
 
 	if (offset_y >= BuffEnd)
 		return -1;
@@ -5714,7 +5902,21 @@
 	Ptr = GetLinePtr(offset_y);
 	memset(buf, 0, bufsize);
 	copysize = min(NumOfColumns, bufsize - 1);
-	memcpy(buf, &CodeBuff[Ptr], copysize);
+	idx = 0;
+	for (i = 0; i<copysize; i++) {
+		buff_char_t *b = &CodeBuffW[Ptr];
+		if (IsBuffPadding(b)) {
+			continue;
+		}
+		unsigned short c = b->ansi_char;
+		buf[idx++] = c & 0xff;
+		if (c >= 0x100) {
+			buf[idx++] = (c >> 8) & 0xff;
+		}
+		if (idx >= bufsize - 1) {
+			break;
+		}
+	}
 
 	return (copysize);
 }
@@ -5786,7 +5988,7 @@
 	TmpPtr = GetLinePtr(Y);
 	LockBuffer();
 
-	c = (unsigned char)CodeBuff[TmpPtr+X];
+	c = (unsigned char)CodeBuffW[TmpPtr+X].ansi_char;
 	if (c < 0x20) {
 		cs[0] = '.';
 		cs[1] = 0;
@@ -5806,7 +6008,7 @@
 		mb[1] = 0;
 	} else {
 		if (X+1 < NumOfColumns) {
-			char c2 = CodeBuff[TmpPtr+X+1];
+			char c2 = (CodeBuffW[TmpPtr+X].ansi_char >> 8);
 			if (_ismbblead(c) && _ismbbtrail(c2)) {
 				cs[0] = c;
 				cs[1] = c2;


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