[Ttssh2-commit] [8894] ログ出力部を分離した

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 8月 19日 (水) 00:27:30 JST


Revision: 8894
          https://osdn.net/projects/ttssh2/scm/svn/commits/8894
Author:   zmatsuo
Date:     2020-08-19 00:27:29 +0900 (Wed, 19 Aug 2020)
Log Message:
-----------
ログ出力部を分離した

- filesys.cpp から filesys_log.cpp を分離
- プロジェクトにファイル追加
  - VS2005, VS2019, cmake

Modified Paths:
--------------
    trunk/teraterm/teraterm/CMakeLists.txt
    trunk/teraterm/teraterm/filesys.cpp
    trunk/teraterm/teraterm/filesys.h
    trunk/teraterm/teraterm/ttermpro.v16.vcxproj
    trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters
    trunk/teraterm/teraterm/ttermpro.v8.vcproj

Added Paths:
-----------
    trunk/teraterm/teraterm/filesys_log.cpp

-------------- next part --------------
Modified: trunk/teraterm/teraterm/CMakeLists.txt
===================================================================
--- trunk/teraterm/teraterm/CMakeLists.txt	2020-08-18 15:10:13 UTC (rev 8893)
+++ trunk/teraterm/teraterm/CMakeLists.txt	2020-08-18 15:27:29 UTC (rev 8894)
@@ -27,6 +27,7 @@
   dnddlg.h
   filesys.cpp
   filesys.h
+  filesys_log.cpp
   filesys_log.rc
   filesys_log_res.h
   font_pp.cpp

Modified: trunk/teraterm/teraterm/filesys.cpp
===================================================================
--- trunk/teraterm/teraterm/filesys.cpp	2020-08-18 15:10:13 UTC (rev 8893)
+++ trunk/teraterm/teraterm/filesys.cpp	2020-08-18 15:27:29 UTC (rev 8894)
@@ -63,14 +63,11 @@
 #define FS_BRACKET_START 1
 #define FS_BRACKET_END   2
 
-static PFileVar LogVar = NULL;
 PFileVar SendVar = NULL;
 PFileVar FileVar = NULL;
 static PCHAR ProtoVar = NULL;
 static int ProtoId;
 
-BOOL FileLog = FALSE;
-BOOL BinLog = FALSE;
 static BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode;
 static BYTE FileByte;
 
@@ -121,25 +118,6 @@
 #define IdTTFILESetUILanguageFile 11
 #define IdTTFILESetFileSendFilter 12
 
-/*
-   Line Head flag for timestamping
-   2007.05.24 Gentaro
-*/
-enum enumLineEnd {
-	Line_Other = 0,
-	Line_LineHead = 1,
-	Line_FileHead = 2,
-};
-
-static enum enumLineEnd eLineEnd = Line_LineHead;
-
-
-// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82̃\x81\x83b\x83Z\x81[\x83W
-#define WM_DPC_LOGTHREAD_SEND (WM_APP + 1)
-
-static void CloseFileSync(PFileVar ptr);
-
-
 BOOL LoadTTFILE(void)
 {
 	BOOL Err;
@@ -253,7 +231,6 @@
 	return TRUE;
 }
 
-static PFileTransDlg FLogDlg = NULL;
 static PFileTransDlg SendDlg = NULL;
 static PProtoDlg PtDlg = NULL;
 
@@ -267,10 +244,6 @@
 	fv->ProgStat = 0;
 	cv.FilePause &= ~fv->OpId;
 
-	if (fv->OpId != OpLog) {
-		fv->HideDialog = ts.FTHideDialog;
-	}
-
 	if (FTDlg!=NULL)
 	{
 		FTDlg->Create(hInst, HVTWin, fv, &cv, &ts);
@@ -277,10 +250,7 @@
 		FTDlg->RefreshNum();
 	}
 
-	if (fv->OpId==OpLog)
-		FLogDlg = FTDlg; /* Log */
-	else
-		SendDlg = FTDlg; /* File send */
+	SendDlg = FTDlg; /* File send */
 
 	fv->StartTime = GetTickCount();
 
@@ -289,18 +259,10 @@
 
 static void ShowFTDlg(WORD OpId)
 {
-	if (OpId == OpLog) {
-		if (FLogDlg != NULL) {
-			FLogDlg->ShowWindow(SW_SHOWNORMAL);
-			SetForegroundWindow(FLogDlg->GetSafeHwnd());
-		}
+	if (SendDlg != NULL) {
+		SendDlg->ShowWindow(SW_SHOWNORMAL);
+		SetForegroundWindow(SendDlg->GetSafeHwnd());
 	}
-	else {
-		if (SendDlg != NULL) {
-			SendDlg->ShowWindow(SW_SHOWNORMAL);
-			SetForegroundWindow(SendDlg->GetSafeHwnd());
-		}
-	}
 }
 
 BOOL NewFileVar(PFileVar *fv)
@@ -332,8 +294,7 @@
 {
 	if ((*fv)!=NULL)
 	{
-		CloseFileSync(*fv);
-		//if ((*fv)->FileOpen) _lclose((*fv)->FileHandle);
+		if ((*fv)->FileOpen) CloseHandle((*fv)->FileHandle);
 		if ((*fv)->FnStrMemHandle != 0)
 		{
 			GlobalUnlock((*fv)->FnStrMemHandle);
@@ -344,1031 +305,6 @@
 	}
 }
 
-/**
- *	\x83t\x83@\x83C\x83\x8B\x96\xBC\x95\xB6\x8E\x9A\x97\xF1\x82̒u\x82\xAB\x8A\xB7\x82\xA6
- *		&h	\x83z\x83X\x83g\x96\xBC\x82ɒu\x8A\xB7 (2007.5.14)
- *		&p	TCP\x83|\x81[\x83g\x94ԍ\x86\x82ɒu\x8A\xB7 (2009.6.12)
- *		&u	\x83\x8D\x83O\x83I\x83\x93\x92\x86\x82̃\x86\x81[\x83U\x96\xBC
- */
-static void ConvertLogname(char *c, int destlen)
-{
-	char buf[MAXPATHLEN], buf2[MAXPATHLEN], *p = c;
-	char tmphost[1024];
-	char tmpuser[256+1];
-	DWORD len_user = sizeof(tmpuser);
-
-	memset(buf, 0, sizeof(buf));
-
-	while(*p != '\0') {
-		if (*p == '&' && *(p+1) != '\0') {
-			switch (*(p+1)) {
-			  case 'h':
-				if (cv.Open) {
-					if (cv.PortType == IdTCPIP) {
-						// \x83z\x83X\x83g\x96\xBC\x82\xAAIPv6\x83A\x83h\x83\x8C\x83X\x82\xBE\x82ƁA\x83t\x83@\x83C\x83\x8B\x96\xBC\x82Ɏg\x97p\x82ł\xAB\x82Ȃ\xA2\x95\xB6\x8E\x9A\x82\xAA\x93\xFC\x82邽\x82߁A
-						// \x97]\x8Cv\x82ȕ\xB6\x8E\x9A\x82͍폜\x82\xB7\x82\xE9\x81B
-						// (2013.3.9 yutaka)
-						strncpy_s(tmphost, sizeof(tmphost), ts.HostName, _TRUNCATE);
-						//strncpy_s(tmphost, sizeof(tmphost), "2001:0db8:bd05:01d2:288a:1fc0:0001:10ee", _TRUNCATE);
-						replaceInvalidFileNameChar(tmphost, '_');
-						strncat_s(buf,sizeof(buf), tmphost, _TRUNCATE);
-					}
-					else if (cv.PortType == IdSerial) {
-						strncpy_s(buf2,sizeof(buf2),buf,_TRUNCATE);
-						_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%sCOM%d", buf2, ts.ComPort);
-					}
-				}
-				break;
-			  case 'p':
-				if (cv.Open) {
-					if (cv.PortType == IdTCPIP) {
-						char port[6];
-						_snprintf_s(port, sizeof(port), _TRUNCATE, "%d", ts.TCPPort);
-						strncat_s(buf,sizeof(buf),port,_TRUNCATE);
-					}
-				}
-				break;
-			  case 'u':
-				if (GetUserName(tmpuser, &len_user) != 0) {
-					strncat_s(buf,sizeof(buf),tmpuser,_TRUNCATE);
-				}
-				break;
-			  default:
-				strncpy_s(buf2,sizeof(buf2),p,2);
-				strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
-			}
-			p++;
-		}
-		else {
-			strncpy_s(buf2,sizeof(buf2),p,1);
-			strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
-		}
-		p++;
-	}
-	strncpy_s(c, destlen, buf, _TRUNCATE);
-}
-
-static void FixLogOption(void)
-{
-	if (ts.LogBinary) {
-		ts.LogTypePlainText = false;
-		ts.LogTimestamp = false;
-	}
-}
-
-
-// \x83X\x83\x8C\x83b\x83h\x82̏I\x97\xB9\x82ƃt\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y
-static void CloseFileSync(PFileVar ptr)
-{
-	BOOL ret;
-
-	if (!ptr->FileOpen)
-		return;
-
-	if (ptr->LogThread != INVALID_HANDLE_VALUE) {
-		// \x83X\x83\x8C\x83b\x83h\x82̏I\x97\xB9\x91҂\xBF
-		ret = PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0);
-		if (ret != 0) {
-			// \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82ɃG\x83\x93\x83L\x83\x85\x81[\x82ł\xAB\x82\xBD\x8Fꍇ\x82̂ݑ҂\xBF\x8D\x87\x82킹\x82\xF0\x8Ds\x82\xA4\x81B
-			WaitForSingleObject(ptr->LogThread, INFINITE);
-		}
-		else {
-			//DWORD code = GetLastError();
-		}
-		CloseHandle(ptr->LogThread);
-		ptr->LogThread = INVALID_HANDLE_VALUE;
-	}
-	CloseHandle(ptr->FileHandle);
-}
-
-// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h
-static unsigned _stdcall DeferredLogWriteThread(void *arg)
-{
-	MSG msg;
-	PFileVar fv = (PFileVar)arg;
-	PCHAR buf;
-	DWORD buflen;
-	DWORD wrote;
-
-	PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
-
-	// \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82̍쐬\x82\xAA\x8FI\x82\xED\x82\xC1\x82\xBD\x82\xB1\x82Ƃ\xF0\x83X\x83\x8C\x83b\x83h\x90\xB6\x90\xAC\x8C\xB3\x82֒ʒm\x82\xB7\x82\xE9\x81B
-	if (fv->LogThreadEvent != NULL) {
-		SetEvent(fv->LogThreadEvent);
-	}
-
-	while (GetMessage(&msg, NULL, 0, 0) > 0) {
-		switch (msg.message) {
-			case WM_DPC_LOGTHREAD_SEND:
-				buf = (PCHAR)msg.wParam;
-				buflen = (DWORD)msg.lParam;
-				WriteFile(LogVar->FileHandle, buf, buflen, &wrote, NULL);
-				free(buf);   // \x82\xB1\x82\xB1\x82Ń\x81\x83\x82\x83\x8A\x89\xF0\x95\xFA
-				break;
-
-			case WM_QUIT:
-				goto end;
-				break;
-		}
-	}
-
-end:
-	_endthreadex(0);
-	return (0);
-}
-
-/**
- *	\x83_\x83C\x83A\x83\x8D\x83O\x82̓\xE0\x97e\x82\xF0 ts \x82ɏ\x91\x82\xAB\x96߂\xB5
- *
- *	TODO
- *		\x83_\x83C\x83A\x83\x8D\x83O\x82Őݒ肵\x82\xBD\x92l\x82͈ꎞ\x93I\x82Ȃ\xE0\x82̂\xC5
- *		\x90ݒ\xE8\x82\xF0\x8F㏑\x82\xAB\x82\xB7\x82\xE9\x82̂͗ǂ\xAD\x82Ȃ\xA2\x82̂ł͂Ȃ\xA2\x82\xBE\x82낤\x82\xA9?
- */
-static void SetLogFlags(HWND Dialog)
-{
-	WORD BinFlag, val;
-
-	GetRB(Dialog, &BinFlag, IDC_FOPTBIN, IDC_FOPTBIN);
-	ts.LogBinary = BinFlag;
-
-	GetRB(Dialog, &val, IDC_APPEND, IDC_APPEND);
-	ts.Append = val;
-
-	if (!BinFlag) {
-		GetRB(Dialog, &val, IDC_PLAINTEXT, IDC_PLAINTEXT);
-		ts.LogTypePlainText = val;
-
-		GetRB(Dialog, &val, IDC_TIMESTAMP, IDC_TIMESTAMP);
-		ts.LogTimestamp = val;
-	}
-
-	GetRB(Dialog, &val, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
-	ts.LogHideDialog = val;
-
-	GetRB(Dialog, &val, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
-	ts.LogAllBuffIncludedInFirst = val;
-
-	ts.LogTimestampType = (GetCurSel(Dialog, IDC_TIMESTAMPTYPE) - 1);
-}
-
-/**
- *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x83`\x83F\x83b\x83N
- *
- *	@param[in]	filename
- *	@param[out]	exist	TURE/FALSE
- *	@param[out]	bom		0	no BOM (or file not exist)
- *						1	UTF-8
- *						2	UTF-16LE
- *						3	UTF-16BE
- */
-static void CheckLogFile(const wchar_t *filename, BOOL *exist, int *bom)
-{
-	*exist = FALSE;
-	*bom = 0;
-
-	// \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9?
-	DWORD logdir = _GetFileAttributesW(filename);
-	if ((logdir != INVALID_FILE_ATTRIBUTES) && ((logdir & FILE_ATTRIBUTE_DIRECTORY) == 0)) {
-		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82\xA0\x82\xC1\x82\xBD
-		*exist = TRUE;
-
-		// BOM\x97L\x82\xE8/\x96\xB3\x82\xB5\x83`\x83F\x83b\x83N
-		FILE *fp = __wfopen(filename, L"rb");
-		if (fp != NULL) {
-			unsigned char tmp[4];
-			size_t l = fread(tmp, 1, sizeof(tmp), fp);
-			fclose(fp);
-			if (l < 2) {
-				*bom = 0;
-			} else if (l >= 2 && tmp[0] == 0xff && tmp[1] == 0xfe) {
-				// UTF-16LE
-				*bom = 2;
-			} else if (l >= 2 && tmp[0] == 0xfe && tmp[1] == 0xff) {
-				// UTF-16BE
-				*bom = 3;
-			} else if (l >= 3 && tmp[0] == 0xef && tmp[1] == 0xbb && tmp[2] == 0xbf) {
-				// UTF-8
-				*bom = 1;
-			} else {
-				*bom = 0;
-			}
-		}
-	}
-}
-
-typedef struct {
-	FLogDlgInfo_t *info;
-	// work
-	BOOL file_exist;
-	int current_bom;
-	TTTSet *pts;
-} LogDlgWork_t;
-
-static void ArrangeControls(HWND Dialog, LogDlgWork_t *work)
-{
-	if (work->file_exist) {
-		EnableWindow(GetDlgItem(Dialog, IDC_APPEND), TRUE);
-		if (work->pts->Append > 0) {
-			CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND);
-		}
-	}
-	else {
-		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2 -> \x90V\x8BK
-		EnableWindow(GetDlgItem(Dialog, IDC_APPEND), FALSE);
-		CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE);
-	}
-
-	if (work->file_exist && IsDlgButtonChecked(Dialog, IDC_APPEND) == BST_CHECKED) {
-		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9 && append
-		int bom = work->current_bom;
-		if (bom != 0) {
-			// BOM\x97L\x82\xE8
-			CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
-			int cur =
-				bom == 1 ? 0 :
-				bom == 2 ? 1 :
-				bom == 3 ? 2 : 0;
-			SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, cur, 0);
-		}
-		else {
-			// BOM\x82Ȃ\xB5
-			CheckDlgButton(Dialog, IDC_BOM, BST_UNCHECKED);
-			SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
-		}
-		if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
-			EnableWindow(GetDlgItem(Dialog, IDC_BOM), FALSE);
-			if (bom != 0) {
-				// BOM\x97L\x82\xE8
-				EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE);
-			}
-			else {
-				// BOM\x82Ȃ\xB5
-				EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE);
-			}
-		}
-	}
-	else {
-		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2 \x96\x94\x82\xCD append\x82ł͂Ȃ\xA2(\x8F㏑\x82\xAB)
-		CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE);
-		CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
-		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
-		if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
-			EnableWindow(GetDlgItem(Dialog, IDC_BOM), TRUE);
-		}
-	}
-}
-
-static void CheckLogFile(HWND Dialog, const wchar_t *filename, LogDlgWork_t *work)
-{
-	BOOL exist;
-	int bom;
-	CheckLogFile(filename, &exist, &bom);
-	work->file_exist = exist;
-	work->current_bom = bom;
-	ArrangeControls(Dialog, work);
-}
-
-static INT_PTR CALLBACK LogFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
-{
-	static const DlgTextInfo TextInfos[] = {
-		{ 0, "DLG_TABSHEET_TITLE_LOG" },
-		{ IDC_FOPTBIN, "DLG_FOPT_BINARY" },
-		{ IDC_APPEND, "DLG_FOPT_APPEND" },
-		{ IDC_PLAINTEXT, "DLG_FOPT_PLAIN" },
-		{ IDC_HIDEDIALOG, "DLG_FOPT_HIDEDIALOG" },
-		{ IDC_ALLBUFF_INFIRST, "DLG_FOPT_ALLBUFFINFIRST" },
-		{ IDC_TIMESTAMP, "DLG_FOPT_TIMESTAMP" },
-	};
-	static const I18nTextInfo timestamp_list[] = {
-		{ "DLG_FOPT_TIMESTAMP_LOCAL", L"Local Time" },
-		{ "DLG_FOPT_TIMESTAMP_UTC", L"UTC" },
-		{ "DLG_FOPT_TIMESTAMP_ELAPSED_LOGGING", L"Elapsed Time (Logging)" },
-		{ "DLG_FOPT_TIMESTAMP_ELAPSED_CONNECTION", L"Elapsed Time (Connection)" },
-	};
-	LogDlgWork_t *work = (LogDlgWork_t *)GetWindowLongPtr(Dialog, DWLP_USER);
-
-	if (Message == 	RegisterWindowMessage(HELPMSGSTRING)) {
-		// \x83R\x83\x82\x83\x93\x83_\x83C\x83A\x83\x8D\x83O\x82\xA9\x82\xE7\x82̃w\x83\x8B\x83v\x83\x81\x83b\x83Z\x81[\x83W\x82\xF0\x95t\x82\xAF\x91ւ\xA6\x82\xE9
-		Message = WM_COMMAND;
-		wParam = IDHELP;
-	}
-	switch (Message) {
-	case WM_INITDIALOG: {
-		work = (LogDlgWork_t *)lParam;
-		TTTSet *pts = work->pts;
-		const char *UILanguageFile = pts->UILanguageFile;
-		SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)work);
-		::DragAcceptFiles(Dialog, TRUE);
-
-		SetDlgTexts(Dialog, TextInfos, _countof(TextInfos), UILanguageFile);
-		SetI18nList("Tera Term", Dialog, IDC_TIMESTAMPTYPE, timestamp_list, _countof(timestamp_list),
-					UILanguageFile, 0);
-
-		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-8");
-		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16LE");
-		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16BE");
-		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
-
-		_SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, work->info->filename);
-		work->info->filename = NULL;
-
-		// Binary/Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
-		if (pts->LogBinary) {
-			CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTBIN);
-		}
-		else {
-			CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTTEXT);
-		}
-
-		// Plain Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
-		if (pts->LogBinary) {
-			// Binary\x83t\x83\x89\x83O\x82\xAA\x97L\x8C\xF8\x82ȂƂ\xAB\x82̓`\x83F\x83b\x83N\x82ł\xAB\x82Ȃ\xA2
-			DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_PLAINTEXT);
-		}
-		else if (pts->LogTypePlainText) {
-			SetRB(Dialog, 1, IDC_PLAINTEXT, IDC_PLAINTEXT);
-		}
-
-		// Hide dialog\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2008.1.30 maya)
-		if (pts->LogHideDialog) {
-			SetRB(Dialog, 1, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
-		}
-
-		// Include screen buffer\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2013.9.29 yutaka)
-		if (pts->LogAllBuffIncludedInFirst) {
-			SetRB(Dialog, 1, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
-		}
-
-		// timestamp\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2006.7.23 maya)
-		if (pts->LogBinary) {
-			// Binary\x83t\x83\x89\x83O\x82\xAA\x97L\x8C\xF8\x82ȂƂ\xAB\x82̓`\x83F\x83b\x83N\x82ł\xAB\x82Ȃ\xA2
-			DisableDlgItem(Dialog, IDC_TIMESTAMP, IDC_TIMESTAMP);
-		}
-		else if (pts->LogTimestamp) {
-			SetRB(Dialog, 1, IDC_TIMESTAMP, IDC_TIMESTAMP);
-		}
-
-		// timestamp \x8E\xED\x95\xCA
-		int tstype = pts->LogTimestampType == TIMESTAMP_LOCAL ? 0 :
-				pts->LogTimestampType == TIMESTAMP_UTC ? 1 :
-				pts->LogTimestampType == TIMESTAMP_ELAPSED_LOGSTART ? 2 :
-				pts->LogTimestampType == TIMESTAMP_ELAPSED_CONNECTED ? 3 : 0;
-		SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, CB_SETCURSEL, tstype, 0);
-		if (pts->LogBinary || !pts->LogTimestamp) {
-			DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
-		}
-
-		CenterWindow(Dialog, GetParent(Dialog));
-
-		return TRUE;
-	}
-
-	case WM_COMMAND:
-		switch (LOWORD(wParam)) {
-		case IDOK: {
-			wchar_t filename[MAX_PATH];
-			_GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename, _countof(filename));
-			work->info->filename = _wcsdup(filename);
-			work->info->append = IsDlgButtonChecked(Dialog, IDC_APPEND) == BST_CHECKED;
-			work->info->bom = IsDlgButtonChecked(Dialog, IDC_BOM) == BST_CHECKED;
-			work->info->code = (int)SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_GETCURSEL, 0, 0);
-			SetLogFlags(Dialog);
-			EndDialog(Dialog, IDOK);
-			break;
-		}
-		case IDCANCEL:
-			EndDialog(Dialog, IDCANCEL);
-			break;
-		case IDHELP:
-			OpenHelp(HH_HELP_CONTEXT, HlpFileLog, work->pts->UILanguageFile);
-			break;
-		case IDC_FOPT_FILENAME_BUTTON: {
-			/* save current dir */
-			const char *UILanguageFile = work->pts->UILanguageFile;
-			wchar_t curdir[MAXPATHLEN];
-			_GetCurrentDirectoryW(_countof(curdir), curdir);
-
-			wchar_t fname[MAX_PATH];
-			GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname, _countof(fname));
-
-			wchar_t FNFilter[128*3];
-			get_lang_msgW("FILEDLG_ALL_FILTER", FNFilter, sizeof(FNFilter), L"All(*.*)\\0*.*\\0\\0", UILanguageFile);
-
-			wchar_t caption[MAX_PATH];
-			wchar_t uimsg[MAX_UIMSG];
-#define TitLogW      L"Log"
-			get_lang_msgW("FILEDLG_TRANS_TITLE_LOG", uimsg, _countof(uimsg), TitLogW, UILanguageFile);
-			wcsncpy_s(caption, _countof(caption), L"Tera Term: ", _TRUNCATE);
-			wcsncat_s(caption, _countof(caption), uimsg, _TRUNCATE);
-
-			OPENFILENAMEW ofn = {};
-			ofn.lStructSize = get_OPENFILENAME_SIZEW();
-			//ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
-			ofn.Flags |= OFN_EXPLORER | OFN_ENABLESIZING;
-			ofn.Flags |= OFN_SHOWHELP;
-			ofn.Flags |= OFN_NOCHANGEDIR;		// \x82\xA4\x82܂\xAD\x93\xAE\x8D삵\x82Ȃ\xA2\x8A‹\xAB\x82\xE0\x82\xA0\x82\xE9\x82悤\x82\xBE
-			ofn.hwndOwner = Dialog;
-			ofn.lpstrFilter = FNFilter;
-			ofn.nFilterIndex = 1;
-			ofn.lpstrFile = fname;
-			ofn.nMaxFile = _countof(fname);
-			ofn.lpstrTitle = caption;
-			BOOL Ok = GetSaveFileNameW(&ofn);
-			if (Ok) {
-				SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname);
-			}
-
-			/* restore dir */
-			_SetCurrentDirectoryW(curdir);
-
-			break;
-		}
-		case IDC_FOPTBIN:
-			EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE);
-			EnableWindow(GetDlgItem(Dialog, IDC_BOM), FALSE);
-			DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_TIMESTAMP);
-			DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
-			break;
-		case IDC_FOPTTEXT:
-			ArrangeControls(Dialog, work);
-			EnableDlgItem(Dialog, IDC_PLAINTEXT, IDC_TIMESTAMP);
-			// FALLTHROUGH -- BinFlag \x82\xAA off \x82̎\x9E\x82\xCD Timestamp \x8E\xED\x95ʂ̗L\x8C\xF8/\x96\xB3\x8C\xF8\x82\xF0\x90ݒ肷\x82\xE9
-		case IDC_TIMESTAMP:
-			if (IsDlgButtonChecked(Dialog, IDC_TIMESTAMP) == BST_CHECKED) {
-				EnableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
-			}
-			else {
-				DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
-			}
-			break;
-		case IDC_FOPT_FILENAME_EDIT:
-			if (HIWORD(wParam) == EN_CHANGE){
-				wchar_t filename[MAX_PATH];
-				GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename, _countof(filename));
-				CheckLogFile(Dialog, filename, work);
-			}
-			break;
-		case IDC_NEW_OVERWRITE:
-			if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
-				EnableWindow(GetDlgItem(Dialog, IDC_BOM), TRUE);
-				EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE);
-				CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
-				SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
-			}
-			break;
-		case IDC_APPEND:
-			ArrangeControls(Dialog, work);
-			break;
-		}
-		break;
-	case WM_DROPFILES: {
-		// \x95\xA1\x90\x94\x83h\x83\x8D\x83b\x83v\x82\xB3\x82\xEA\x82Ă\xE0\x8Dŏ\x89\x82\xCC1\x82‚\xBE\x82\xAF\x82\xF0\x88\xB5\x82\xA4
-		HDROP hDrop = (HDROP)wParam;
-		const UINT len = _DragQueryFileW(hDrop, 0, NULL, 0);
-		if (len == 0) {
-			DragFinish(hDrop);
-			return TRUE;
-		}
-		wchar_t *filename = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1));
-		_DragQueryFileW(hDrop, 0, filename, len + 1);
-		filename[len] = '\0';
-		CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND);
-		_SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename);
-		SendDlgItemMessage(Dialog, IDC_FOPT_FILENAME_EDIT, EM_SETSEL, len, len);
-		free(filename);
-		DragFinish(hDrop);
-		return TRUE;
-	}
-	}
-	return FALSE;
-}
-
-static BOOL LogStart(void)
-{
-	unsigned tid;
-
-	if ((FileLog) || (BinLog)) return FALSE;
-
-	assert(LogVar != NULL);
-
-	if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0) {
-		// \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xAA\x90ݒ肳\x82\xEA\x82Ă\xA2\x82Ȃ\xA2
-		return FALSE;
-	}
-
-	if (! LoadTTFILE()) return FALSE;
-
-	LogVar->OpId = OpLog;
-	(*SetFileVar)(LogVar);
-	FixLogOption();
-
-	if (ts.LogBinary > 0)
-	{
-		BinLog = TRUE;
-		FileLog = FALSE;
-		if (! CreateBinBuf())
-		{
-			FileTransEnd(OpLog);
-			return FALSE;
-		}
-	}
-	else {
-		BinLog = FALSE;
-		FileLog = TRUE;
-		if (! CreateLogBuf())
-		{
-			FileTransEnd(OpLog);
-			return FALSE;
-		}
-	}
-	cv.LStart = cv.LogPtr;
-	cv.LCount = 0;
-	if (ts.LogHideDialog)
-		LogVar->HideDialog = 1;
-
-	/* 2007.05.24 Gentaro */
-	eLineEnd = Line_LineHead;
-
-	if (ts.Append > 0)
-	{
-		int dwShareMode = FILE_SHARE_READ;
-		if (!ts.LogLockExclusive) {
-			dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
-		}
-		LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
-		                                OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-		if (LogVar->FileHandle != INVALID_HANDLE_VALUE){
-			SetFilePointer(LogVar->FileHandle, 0, NULL, FILE_END);
-			/* 2007.05.24 Gentaro
-				If log file already exists,
-				a newline is inserted before the first timestamp.
-			*/
-			eLineEnd = Line_FileHead;
-		}
-	}
-	else {
-		int dwShareMode = FILE_SHARE_READ;
-		if (!ts.LogLockExclusive) {
-			dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
-		}
-		LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
-		                                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-	}
-	LogVar->FileOpen = (LogVar->FileHandle != INVALID_HANDLE_VALUE);
-	if (! LogVar->FileOpen)
-	{
-		char msg[128];
-
-		// \x83t\x83@\x83C\x83\x8B\x83I\x81[\x83v\x83\x93\x83G\x83\x89\x81[\x8E\x9E\x82̃\x81\x83b\x83Z\x81[\x83W\x95\\x8E\xA6\x82\xF0\x92lj\xC1\x82\xB5\x82\xBD\x81B(2008.7.9 yutaka)
-		if (LogVar->NoMsg == FALSE) {
-			_snprintf_s(msg, sizeof(msg), _TRUNCATE, "Can not create a `%s' file. (%d)", LogVar->FullName, GetLastError());
-			MessageBox(NULL, msg, "Tera Term: File open error", MB_OK | MB_ICONERROR);
-		}
-
-		FileTransEnd(OpLog);
-		return FALSE;
-	}
-	LogVar->ByteCount = 0;
-
-	// Log rotate configuration
-	LogVar->RotateMode = ts.LogRotate;
-	LogVar->RotateSize = ts.LogRotateSize;
-	LogVar->RotateStep = ts.LogRotateStep;
-
-	// Log rotate\x82\xAA\x97L\x8C\xF8\x82̏ꍇ\x81A\x8F\x89\x8A\xFA\x83t\x83@\x83C\x83\x8B\x83T\x83C\x83Y\x82\xF0\x90ݒ肷\x82\xE9\x81B
-	// \x8Dŏ\x89\x82̃t\x83@\x83C\x83\x8B\x82\xAA\x90ݒ肵\x82\xBD\x83T\x83C\x83Y\x82Ń\x8D\x81[\x83e\x81[\x83g\x82\xB5\x82Ȃ\xA2\x96\xE2\x91\xE8\x82̏C\x90\xB3\x81B
-	// (2016.4.9 yutaka)
-	if (LogVar->RotateMode != ROTATE_NONE) {
-		DWORD size = GetFileSize(LogVar->FileHandle, NULL);
-		if (size != -1)
-			LogVar->ByteCount = size;
-	}
-
-	if (! OpenFTDlg(LogVar)) {
-		FileTransEnd(OpLog);
-		return FALSE;
-	}
-
-	// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82\xF0\x8BN\x82\xB1\x82\xB7\x81B
-	// (2013.4.19 yutaka)
-	// DeferredLogWriteThread \x83X\x83\x8C\x83b\x83h\x82\xAA\x8BN\x8F\xB0\x82\xB5\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D쐬\x82\xB3\x82\xEA\x82\xE9\x82\xE6\x82\xE8\x91O\x82ɁA
-	// \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y(CloseFileSync)\x82\xAA\x8Ds\x82\xED\x82\xEA\x82\xE9\x82ƁA\x83G\x83\x93\x83L\x83\x85\x81[\x82\xAA\x8E\xB8\x94s\x82\xB5\x81A\x83f\x83b\x83h\x83\x8D\x83b\x83N
-	// \x82\xB7\x82\xE9\x82Ƃ\xA2\x82\xA4\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B
-	// \x83X\x83\x8C\x83b\x83h\x8AԂ̓\xAF\x8A\xFA\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x96\xBC\x91O\x82Ȃ\xB5\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xC1\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xCC
-	// \x8D쐬\x82܂ő҂\xBF\x8D\x87\x82킹\x82\xB7\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B\x96\xBC\x91O\x95t\x82\xAB\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xA4\x8Fꍇ\x82́A
-	// \x83V\x83X\x83e\x83\x80(Windows OS)\x8F\xE3\x82Ń\x86\x83j\x81[\x83N\x82Ȗ\xBC\x91O\x82ɂ\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9\x81B
-	// (2016.9.23 yutaka)
-	LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-	LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
-	LogVar->LogThreadId = tid;
-	if (LogVar->LogThreadEvent != NULL) {
-		WaitForSingleObject(LogVar->LogThreadEvent, INFINITE);
-		CloseHandle(LogVar->LogThreadEvent);
-	}
-
-	// \x8C\xBB\x8D݃o\x83b\x83t\x83@\x82ɂ\xA0\x82\xE9\x83f\x81[\x83^\x82\xF0\x82\xB7\x82ׂď\x91\x82\xAB\x8Fo\x82\xB5\x82Ă\xA9\x82\xE7\x81A
-	// \x83\x8D\x83O\x8D̎\xE6\x82\xF0\x8AJ\x8En\x82\xB7\x82\xE9\x81B
-	// (2013.9.29 yutaka)
-	if (ts.LogAllBuffIncludedInFirst) {
-		DWORD ofs, size, written_size;
-		char buf[512];
-		const char *crlf = "\r\n";
-		DWORD crlf_len = 2;
-		for (ofs = 0 ;  ; ofs++ ) {
-			// 1\x82‚̍s\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B\x95\xB6\x8E\x9A\x82\xBE\x82\xAF\x82Ȃ̂ŁA\x83G\x83X\x83P\x81[\x83v\x83V\x81[\x83P\x83\x93\x83X\x82͊܂܂\xEA\x82Ȃ\xA2\x81B
-			size = BuffGetAnyLineData(ofs, buf, sizeof(buf));
-			if (size == -1)
-				break;
-
-#if 0
-			if (ts.DeferredLogWriteMode) { // \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82\xDD
-				char *pbuf = (char *)malloc(size + 2);
-				memcpy(pbuf, buf, size);
-				pbuf[size] = '\r';
-				pbuf[size+1] = '\n';
-				Sleep(1);  // \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D\xEC\x82\xE7\x82\xEA\x82\xE9\x82悤\x82ɁA\x83R\x83\x93\x83e\x83L\x83X\x83g\x83X\x83C\x83b\x83`\x82𑣂\xB7\x81B
-				PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)pbuf, size + 2);
-			} else { // \x92\xBC\x8F\x91\x82\xAB\x81B\x83l\x83b\x83g\x83\x8F\x81[\x83N\x8Co\x97R\x82\xBE\x82ƒx\x82\xA2\x81B
-#endif
-				WriteFile(LogVar->FileHandle, buf, size, &written_size, NULL);
-				WriteFile(LogVar->FileHandle, crlf, crlf_len, &written_size, NULL);
-#if 0
-			}
-#endif
-		}
-	}
-
-	return TRUE;
-}
-
-void LogPut1(BYTE b)
-{
-	cv.LogBuf[cv.LogPtr] = b;
-	cv.LogPtr++;
-	if (cv.LogPtr>=InBuffSize)
-		cv.LogPtr = cv.LogPtr-InBuffSize;
-
-	if (FileLog)
-	{
-		if (cv.LCount>=InBuffSize)
-		{
-			cv.LCount = InBuffSize;
-			cv.LStart = cv.LogPtr;
-		}
-		else
-			cv.LCount++;
-	}
-	else
-		cv.LCount = 0;
-}
-
-static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
-{
-	if (*Count<=0) return FALSE;
-	*b = Buf[*Start];
-	(*Start)++;
-	if (*Start>=InBuffSize)
-		*Start = *Start-InBuffSize;
-	(*Count)--;
-	return TRUE;
-}
-
-
-
-static CRITICAL_SECTION g_filelog_lock;   /* \x83\x8D\x83b\x83N\x97p\x95ϐ\x94 */
-
-void logfile_lock_initialize(void)
-{
-	InitializeCriticalSection(&g_filelog_lock);
-}
-
-static inline void logfile_lock(void)
-{
-	EnterCriticalSection(&g_filelog_lock);
-}
-
-static inline void logfile_unlock(void)
-{
-	LeaveCriticalSection(&g_filelog_lock);
-}
-
- // \x83R\x83\x81\x83\x93\x83g\x82\xF0\x83\x8D\x83O\x82֒lj\xC1\x82\xB7\x82\xE9
-static void CommentLogToFile(char *buf, int size)
-{
-	DWORD wrote;
-
-	if (LogVar == NULL || !LogVar->FileOpen) {
-		char uimsg[MAX_UIMSG];
-		get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile);
-		get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg),
-		             "It is not opened by the log file yet.", ts.UILanguageFile);
-		::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
-		return;
-	}
-
-	logfile_lock();
-	WriteFile(LogVar->FileHandle, buf, size, &wrote, NULL);
-	WriteFile(LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // \x89\xFC\x8Ds
-	/* Set Line End Flag
-		2007.05.24 Gentaro
-	*/
-	eLineEnd = Line_LineHead;
-	logfile_unlock();
-}
-
-// \x83\x8D\x83O\x82\xF0\x83\x8D\x81[\x83e\x81[\x83g\x82\xB7\x82\xE9\x81B
-// (2013.3.21 yutaka)
-static void LogRotate(void)
-{
-	int loopmax = 10000;  // XXX
-	char filename[1024];
-	char newfile[1024], oldfile[1024];
-	int i, k;
-	int dwShareMode = FILE_SHARE_READ;
-	unsigned tid;
-
-	if (! LogVar->FileOpen) return;
-
-	if (LogVar->RotateMode == ROTATE_NONE)
-		return;
-
-	if (LogVar->RotateMode == ROTATE_SIZE) {
-		if (LogVar->ByteCount <= LogVar->RotateSize)
-			return;
-		//OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, LogVar->RotateMode, LogVar->ByteCount);
-	} else {
-		return;
-	}
-
-	logfile_lock();
-	// \x83\x8D\x83O\x83T\x83C\x83Y\x82\xF0\x8Dď\x89\x8A\x{227B0B7}\x82\xE9\x81B
-	LogVar->ByteCount = 0;
-
-	// \x82\xA2\x82\xC1\x82\xBD\x82񍡂̃t\x83@\x83C\x83\x8B\x82\xF0\x83N\x83\x8D\x81[\x83Y\x82\xB5\x82āA\x95ʖ\xBC\x82̃t\x83@\x83C\x83\x8B\x82\xF0\x83I\x81[\x83v\x83\x93\x82\xB7\x82\xE9\x81B
-	CloseFileSync(LogVar);
-	//_lclose(LogVar->FileHandle);
-
-	// \x90\xA2\x91ネ\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82̃X\x83e\x83b\x83v\x90\x94\x82̎w\x92肪\x82\xA0\x82邩
-	if (LogVar->RotateStep > 0)
-		loopmax = LogVar->RotateStep;
-
-	for (i = 1 ; i <= loopmax ; i++) {
-		_snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i);
-		if (_access_s(filename, 0) != 0)
-			break;
-	}
-	if (i > loopmax) {
-		// \x90\xA2\x91オ\x82\xA2\x82\xC1\x82ς\xA2\x82ɂȂ\xC1\x82\xBD\x82\xE7\x81A\x8DŌẪt\x83@\x83C\x83\x8B\x82\xA9\x82\xE7\x94p\x8A\xFC\x82\xB7\x82\xE9\x81B
-		i = loopmax;
-	}
-
-	// \x95ʃt\x83@\x83C\x83\x8B\x82Ƀ\x8A\x83l\x81[\x83\x80\x81B
-	for (k = i-1 ; k >= 0 ; k--) {
-		if (k == 0)
-			strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE);
-		else
-			_snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k);
-		_snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1);
-		remove(newfile);
-		if (rename(oldfile, newfile) != 0) {
-			OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno);
-		}
-	}
-
-	// \x8DăI\x81[\x83v\x83\x93
-	if (!ts.LogLockExclusive) {
-		dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
-	}
-	LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
-	                                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-
-	// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82\xF0\x8BN\x82\xB1\x82\xB7\x81B
-	// (2013.4.19 yutaka)
-	// DeferredLogWriteThread \x83X\x83\x8C\x83b\x83h\x82\xAA\x8BN\x8F\xB0\x82\xB5\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D쐬\x82\xB3\x82\xEA\x82\xE9\x82\xE6\x82\xE8\x91O\x82ɁA
-	// \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y(CloseFileSync)\x82\xAA\x8Ds\x82\xED\x82\xEA\x82\xE9\x82ƁA\x83G\x83\x93\x83L\x83\x85\x81[\x82\xAA\x8E\xB8\x94s\x82\xB5\x81A\x83f\x83b\x83h\x83\x8D\x83b\x83N
-	// \x82\xB7\x82\xE9\x82Ƃ\xA2\x82\xA4\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B
-	// \x83X\x83\x8C\x83b\x83h\x8AԂ̓\xAF\x8A\xFA\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x96\xBC\x91O\x82Ȃ\xB5\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xC1\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xCC
-	// \x8D쐬\x82܂ő҂\xBF\x8D\x87\x82킹\x82\xB7\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B\x96\xBC\x91O\x95t\x82\xAB\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xA4\x8Fꍇ\x82́A
-	// \x83V\x83X\x83e\x83\x80(Windows OS)\x8F\xE3\x82Ń\x86\x83j\x81[\x83N\x82Ȗ\xBC\x91O\x82ɂ\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9\x81B
-	// (2016.9.26 yutaka)
-	LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-	LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
-	LogVar->LogThreadId = tid;
-	if (LogVar->LogThreadEvent != NULL) {
-		WaitForSingleObject(LogVar->LogThreadEvent, INFINITE);
-		CloseHandle(LogVar->LogThreadEvent);
-	}
-
-	logfile_unlock();
-
-}
-
-void LogToFile(void)
-{
-	PCHAR Buf;
-	int Start, Count;
-	BYTE b;
-	PCHAR WriteBuf;
-	DWORD WriteBufMax, WriteBufLen;
-	CHAR tmp[128];
-	DWORD wrote;
-
-	if (! LogVar->FileOpen) return;
-	if (FileLog)
-	{
-		Buf = cv.LogBuf;
-		Start = cv.LStart;
-		Count = cv.LCount;
-	}
-	else if (BinLog)
-	{
-		Buf = cv.BinBuf;
-		Start = cv.BStart;
-		Count = cv.BCount;
-	}
-	else
-		return;
-
-	if (Buf==NULL) return;
-	if (Count==0) return;
-
-	// \x83\x8D\x83b\x83N\x82\xF0\x8E\xE6\x82\xE9(2004.8.6 yutaka)
-	logfile_lock();
-
-	if (ts.DeferredLogWriteMode) {
-		WriteBufMax = 8192;
-		WriteBufLen = 0;
-		WriteBuf = (PCHAR)malloc(WriteBufMax);
-		while (Get1(Buf,&Start,&Count,&b)) {
-			if (!FLogIsPause() && (! cv.ProtoFlag))
-			{
-				tmp[0] = 0;
-				if ( ts.LogTimestamp && eLineEnd ) {
-					char *strtime = NULL;
-
-					switch (ts.LogTimestampType) {
-					case TIMESTAMP_LOCAL:
-						strtime = mctimelocal(ts.LogTimestampFormat, FALSE);
-						break;
-					case TIMESTAMP_UTC:
-						strtime = mctimelocal(ts.LogTimestampFormat, TRUE);
-						break;
-					case TIMESTAMP_ELAPSED_LOGSTART:
-						strtime = strelapsed(LogVar->StartTime);
-						break;
-					case TIMESTAMP_ELAPSED_CONNECTED:
-						strtime = strelapsed(cv.ConnectedTime);
-						break;
-					}
-
-					/* 2007.05.24 Gentaro */
-					if( eLineEnd == Line_FileHead ){
-						strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE);
-					}
-					strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
-					strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
-					strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
-				}
-
-				/* 2007.05.24 Gentaro */
-				if( b == 0x0a ){
-					eLineEnd = Line_LineHead; /* set endmark*/
-				}
-				else {
-					eLineEnd = Line_Other; /* clear endmark*/
-				}
-
-				if (WriteBufLen >= (WriteBufMax*4/5)) {
-					WriteBufMax *= 2;
-					WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax);
-				}
-				memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp));
-				WriteBufLen += strlen(tmp);
-				WriteBuf[WriteBufLen++] = b;
-
-				(LogVar->ByteCount)++;
-			}
-		}
-
-		PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen);
-
-	} else {
-
-		while (Get1(Buf,&Start,&Count,&b))
-		{
-			if (!FLogIsPause() && (! cv.ProtoFlag))
-			{
-				if ( ts.LogTimestamp && eLineEnd ) {
-					char *strtime = NULL;
-
-					switch (ts.LogTimestampType) {
-					case TIMESTAMP_LOCAL:
-						strtime = mctimelocal(ts.LogTimestampFormat, FALSE);
-						break;
-					case TIMESTAMP_UTC:
-						strtime = mctimelocal(ts.LogTimestampFormat, TRUE);
-						break;
-					case TIMESTAMP_ELAPSED_LOGSTART:
-						strtime = strelapsed(LogVar->StartTime);
-						break;
-					case TIMESTAMP_ELAPSED_CONNECTED:
-						strtime = strelapsed(cv.ConnectedTime);
-						break;
-					}
-					WriteFile(LogVar->FileHandle, "[", 1, &wrote, NULL);
-					WriteFile(LogVar->FileHandle, strtime, strlen(strtime), &wrote, NULL);
-					WriteFile(LogVar->FileHandle, "] ", 2, &wrote, NULL);
-				}
-
-				/* 2007.05.24 Gentaro */
-				if( b == 0x0a ){
-					eLineEnd = Line_LineHead; /* set endmark*/
-				}
-				else {
-					eLineEnd = Line_Other; /* clear endmark*/
-				}
-
-				WriteFile(LogVar->FileHandle, (PCHAR)&b, 1, &wrote, NULL);
-				(LogVar->ByteCount)++;
-			}
-		}
-
-	}
-
-	logfile_unlock();
-
-	if (FileLog)
-	{
-		cv.LStart = Start;
-		cv.LCount = Count;
-	}
-	else {
-		cv.BStart = Start;
-		cv.BCount = Count;
-	}
-	if (FLogIsPause() || cv.ProtoFlag) return;
-	if (FLogDlg!=NULL)
-		FLogDlg->RefreshNum();
-
-	// \x83\x8D\x83O\x81E\x83\x8D\x81[\x83e\x81[\x83g
-	LogRotate();
-
-}
-
-BOOL CreateLogBuf(void)
-{
-	if (cv.HLogBuf==NULL)
-	{
-		cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
-		cv.LogBuf = NULL;
-		cv.LogPtr = 0;
-		cv.LStart = 0;
-		cv.LCount = 0;
-	}
-	return (cv.HLogBuf!=NULL);
-}
-
-void FreeLogBuf(void)
-{
-	if ((cv.HLogBuf==NULL) || FileLog)
-		return;
-	if (cv.LogBuf!=NULL)
-		GlobalUnlock(cv.HLogBuf);
-	GlobalFree(cv.HLogBuf);
-	cv.HLogBuf = NULL;
-	cv.LogBuf = NULL;
-	cv.LogPtr = 0;
-	cv.LStart = 0;
-	cv.LCount = 0;
-}
-
-BOOL CreateBinBuf(void)
-{
-	if (cv.HBinBuf==NULL)
-	{
-		cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
-		cv.BinBuf = NULL;
-		cv.BinPtr = 0;
-		cv.BStart = 0;
-		cv.BCount = 0;
-	}
-	return (cv.HBinBuf!=NULL);
-}
-
-void FreeBinBuf(void)
-{
-	if ((cv.HBinBuf==NULL) || BinLog)
-		return;
-	if (cv.BinBuf!=NULL)
-		GlobalUnlock(cv.HBinBuf);
-	GlobalFree(cv.HBinBuf);
-	cv.HBinBuf = NULL;
-	cv.BinBuf = NULL;
-	cv.BinPtr = 0;
-	cv.BStart = 0;
-	cv.BCount = 0;
-}
-
 void FileSendStart(void)
 {
 	LONG Option = 0;
@@ -1447,17 +383,7 @@
 {
 	if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
 	{
-		FileLog = FALSE;
-		BinLog = FALSE;
-		if (FLogDlg!=NULL)
-		{
-			FLogDlg->DestroyWindow();
-			FLogDlg = NULL;
-		}
-		FreeFileVar(&LogVar);
-		FreeLogBuf();
-		FreeBinBuf();
-		FreeTTFILE();
+		FLogClose();
 	}
 
 	if (((OpId==0) || (OpId==OpSendFile)) && FSend)
@@ -1509,7 +435,7 @@
 // - FileBracketMode == false
 // - cv.TelFlag == false
 // - ts.LocalEcho == 0
-void FileSendBinayBoost(void)
+static void FileSendBinayBoost(void)
 {
 	WORD c, fc;
 	LONG BCOld;
@@ -1669,17 +595,6 @@
 	FileTransEnd(OpSendFile);
 }
 
-/**
- *	\x83\x8D\x83O\x82\xF0\x83|\x81[\x83Y\x82\xB7\x82\xE9
- *	\x8C\xB3\x82\xCD FLogChangeButton() \x82\xBE\x82\xC1\x82\xBD
- */
-void FLogPause(BOOL Pause)
-{
-	if (FLogDlg!=NULL)
-		FLogDlg->ChangeButton(Pause);
-	FileTransPause(OpLog, Pause);
-}
-
 static BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
 {
 	int vsize;
@@ -2158,256 +1073,3 @@
 	if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
 		ProtoEnd();
 }
-
-/**
- *	\x83\x8D\x83O\x83\x8D\x81[\x83e\x81[\x83g\x82̐ݒ\xE8
- *	\x83\x8D\x83O\x82̃T\x83C\x83Y\x82\xAA<size>\x83o\x83C\x83g\x82𒴂\xA6\x82Ă\xA2\x82\xEA\x82΁A\x83\x8D\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82\xB7\x82\xE9\x82悤\x90ݒ肷\x82\xE9
- */
-void FLogRotateSize(size_t size)
-{
-	if (LogVar == NULL) {
-		return;
-	}
-	LogVar->RotateMode = ROTATE_SIZE;
-	LogVar->RotateSize = size;
-}
-
-/**
- *	\x83\x8D\x83O\x83\x8D\x81[\x83e\x81[\x83g\x82̐ݒ\xE8
- *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̐\xA2\x91\xE3\x82\xF0\x90ݒ肷\x82\xE9
- */
-void FLogRotateRotate(int step)
-{
-	if (LogVar == NULL) {
-		return;
-	}
-	LogVar->RotateStep = step;
-}
-
-/**
- *	\x83\x8D\x83O\x83\x8D\x81[\x83e\x81[\x83g\x82̐ݒ\xE8
- *	\x83\x8D\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82\xF0\x92\xE2\x8E~
- */
-void FLogRotateHalt(void)
-{
-	if (LogVar == NULL) {
-		return;
-	}
-	LogVar->RotateMode = ROTATE_NONE;
-	LogVar->RotateSize = 0;
-	LogVar->RotateStep = 0;
-}
-
-static INT_PTR CALLBACK OnCommentDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
-{
-	static const DlgTextInfo TextInfos[] = {
-		{ 0, "DLG_COMMENT_TITLE" },
-		{ IDOK, "BTN_OK" }
-	};
-	char buf[256];
-	UINT ret;
-
-	switch (msg) {
-		case WM_INITDIALOG:
-			//SetDlgItemText(hDlgWnd, IDC_EDIT_COMMENT, "\x83T\x83\x93\x83v\x83\x8B");
-			// \x83G\x83f\x83B\x83b\x83g\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82Ƀt\x83H\x81[\x83J\x83X\x82\xF0\x82\xA0\x82Ă\xE9
-			SetFocus(GetDlgItem(hDlgWnd, IDC_EDIT_COMMENT));
-			SetDlgTexts(hDlgWnd, TextInfos, _countof(TextInfos), ts.UILanguageFile);
-			return FALSE;
-
-		case WM_COMMAND:
-			switch (LOWORD(wp)) {
-				case IDOK:
-					memset(buf, 0, sizeof(buf));
-					ret = GetDlgItemTextA(hDlgWnd, IDC_EDIT_COMMENT, buf, sizeof(buf) - 1);
-					if (ret > 0) { // \x83e\x83L\x83X\x83g\x8E擾\x90\xAC\x8C\xF7
-						//buf[sizeof(buf) - 1] = '\0';  // null-terminate
-						CommentLogToFile(buf, ret);
-					}
-					TTEndDialog(hDlgWnd, IDOK);
-					break;
-				default:
-					return FALSE;
-			}
-			break;
-		case WM_CLOSE:
-			TTEndDialog(hDlgWnd, 0);
-			return TRUE;
-
-		default:
-			return FALSE;
-	}
-	return TRUE;
-}
-
-void FLogAddCommentDlg(HINSTANCE hInst, HWND hWnd)
-{
-	// \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82փR\x83\x81\x83\x93\x83g\x82\xF0\x92lj\xC1\x82\xB7\x82\xE9 (2004.8.6 yutaka)
-	TTDialogBox(hInst, MAKEINTRESOURCE(IDD_COMMENT_DIALOG),
-				HVTWin, OnCommentDlgProc);
-}
-
-void FLogClose(void)
-{
-	if (LogVar != NULL)
-		FileTransEnd(OpLog);
-}
-
-BOOL FLogOpen(const char *fname)
-{
-	BOOL ret;
-
-	if ((LogVar==NULL) && !NewFileVar(&LogVar)) {
-		return FALSE;
-	}
-
-	LogVar->DirLen = 0;
-	LogVar->NoMsg = TRUE;
-	strncpy_s(LogVar->FullName, sizeof(LogVar->FullName), fname, _TRUNCATE);
-	ret = LogStart();
-	return ret;
-}
-
-BOOL FLogIsOpend(void)
-{
-	// LogVar->FileOpen
-	return LogVar != NULL;
-}
-
-void FLogWriteStr(const char *str)
-{
-	if (LogVar != NULL)
-	{
-		DWORD wrote;
-		size_t len = strlen(str);
-		WriteFile(LogVar->FileHandle, str, len, &wrote, NULL);
-		LogVar->ByteCount =
-			LogVar->ByteCount + len;
-		if (FLogDlg!=NULL)
-			FLogDlg->RefreshNum();
-	}
-}
-
-void FLogInfo(char *param_ptr, size_t param_len)
-{
-	if (LogVar) {
-		param_ptr[0] = '0'
-			+ (ts.LogBinary != 0)
-			+ ((ts.Append != 0) << 1)
-			+ ((ts.LogTypePlainText != 0) << 2)
-			+ ((ts.LogTimestamp != 0) << 3)
-			+ ((ts.LogHideDialog != 0) << 4);
-		strncpy_s(param_ptr + 1, param_len - 1, LogVar->FullName, _TRUNCATE);
-	}
-	else {
-		param_ptr[0] = '0' - 1;
-		param_ptr[1] = 0;
-	}
-}
-
-/**
- *	\x8C\xBB\x8D݂̃\x8D\x83O\x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x8E擾
- */
-const char *FLogGetFilename()
-{
-	if (LogVar == NULL) {
-		return NULL;
-	}
-	return LogVar->FullName;
-}
-
-/**
- *	\x83\x8D\x83O\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8AJ\x82\xAD
- *	@param[in,out]	info.filename	\x83t\x83@\x83C\x83\x8B\x96\xBC\x8F\x89\x8A\xFA\x92l
- *									OK\x8E\x9E\x81A\x83t\x83@\x83C\x83\x8B\x96\xBC\x81A\x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7free()\x82\xB7\x82邱\x82\xC6
- *	@retval	TRUE	[ok] \x82\xAA\x89\x9F\x82\xB3\x82ꂽ
- *	@retval	FALSE	\x83L\x83\x83\x83\x93\x83Z\x83\x8B\x82\xB3\x82ꂽ
- */
-BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info)
-{
-	LogDlgWork_t *work = (LogDlgWork_t *)calloc(sizeof(LogDlgWork_t), 1);
-	char *filenameA = ToCharW(info->filename);
-	char *srcfnameA = FLogGetLogFilename(filenameA);
-	wchar_t *srcfnameW = ToWcharA(srcfnameA);
-	free(filenameA);
-	free(srcfnameA);
-	work->info = info;
-	work->info->filename = srcfnameW;
-	work->pts = &ts;
-	INT_PTR ret = TTDialogBoxParam(
-		hInst, MAKEINTRESOURCE(IDD_LOGDLG),
-		hWnd, LogFnHook, (LPARAM)work);
-	free(srcfnameW);
-	free(work);
-	return ret == IDOK ? TRUE : FALSE;
-}
-
-/**
- *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x8E擾
- *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x96\xBC\x97p\x82̏C\x8F\xFC\x82\xF0\x8Ds\x82\xA4
- *	- strftime() \x82Ɠ\xAF\x82\xB6\x93\xFA\x95t\x93W\x8AJ
- *	- \x90ݒ肳\x82ꂽ\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x83t\x83H\x83\x8B\x83_\x82\xF0\x92lj\xC1
- *	- \x83z\x83X\x83g\x96\xBC,\x83|\x81[\x83g\x94ԍ\x86\x93W\x8AJ
- *
- *	@param[in]	log_filename	\x83t\x83@\x83C\x83\x8B\x96\xBC(\x91\x8A\x91\xCE/\x90\xE2\x91΂ǂ\xBF\x82\xE7\x82ł\xE0ok)
- *								NULL\x82̏ꍇ\x83f\x83t\x83H\x83\x8B\x83g\x83t\x83@\x83C\x83\x8B\x96\xBC\x82ƂȂ\xE9
- *								strftime\x8C`\x8E\xAEok
- *	@return						\x83t\x83\x8B\x83p\x83X\x83t\x83@\x83C\x83\x8B\x96\xBC
- *								\x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7 free() \x82\xB7\x82邱\x82\xC6
- */
-char *FLogGetLogFilename(const char *log_filename)
-{
-	// \x83t\x83H\x83\x8B\x83_
-	char FileDirExpanded[MAX_PATH];
-	char *logdir;
-	if (strlen(ts.LogDefaultPath) > 0) {
-		logdir = ts.LogDefaultPath;
-	}
-	else if (strlen(ts.FileDir) > 0) {
-		ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
-		logdir = FileDirExpanded;
-	}
-	else {
-		logdir = ts.HomeDir;
-	}
-
-	// \x8C\xB3\x82ƂȂ\xE9\x83t\x83@\x83C\x83\x8B\x96\xBC
-	char base_name[MAX_PATH];
-	if (log_filename == NULL) {
-		strncpy_s(base_name, _countof(base_name), ts.LogDefaultName, _TRUNCATE);
-	}
-	else {
-		strncpy_s(base_name, _countof(base_name), log_filename, _TRUNCATE);
-	}
-
-	// \x83t\x83\x8B\x83p\x83X\x89\xBB
-	char full_path[MAX_PATH];
-	ConvFName(logdir, base_name, sizeof(base_name), "", full_path, sizeof(full_path));
-	ParseStrftimeFileName(full_path, sizeof(full_path));
-	ConvertLogname(full_path, sizeof(full_path));
-
-	return _strdup(full_path);
-}
-
-BOOL FLogIsPause()
-{
-	return ((cv.FilePause & OpLog) !=0);
-}
-
-void FLogWindow(int nCmdShow)
-{
-	if (FLogDlg == NULL)
-		return;
-
-	HWND HWndLog = FLogDlg->m_hWnd;
-	ShowWindow(HWndLog, nCmdShow);
-	if (nCmdShow == SW_RESTORE) {
-		// \x8Ag\x92\xA3\x83X\x83^\x83C\x83\x8B WS_EX_NOACTIVATE \x8F\xF3\x91Ԃ\xF0\x89\xF0\x8F\x9C\x82\xB7\x82\xE9
-		SetForegroundWindow(HWndLog);
-	}
-}
-
-void FLogShowDlg(void)
-{
-	ShowFTDlg(OpLog);
-}

Modified: trunk/teraterm/teraterm/filesys.h
===================================================================
--- trunk/teraterm/teraterm/filesys.h	2020-08-18 15:10:13 UTC (rev 8893)
+++ trunk/teraterm/teraterm/filesys.h	2020-08-18 15:27:29 UTC (rev 8894)
@@ -74,17 +74,8 @@
 BOOL NewFileVar(PFileVar *FV);
 void FreeFileVar(PFileVar *FV);
 
-void LogPut1(BYTE b);
-void LogToFile(void);
-BOOL CreateLogBuf(void);
-void FreeLogBuf(void);
-BOOL CreateBinBuf(void);
-void FreeBinBuf(void);
-
 void FileSendStart(void);
 void FileSend(void);
-//void FLogChangeButton(BOOL Pause);
-void FLogPause(BOOL Pause);
 void FileTransEnd(WORD OpId);
 void FileTransPause(WORD OpId, BOOL Pause);
 
@@ -100,7 +91,6 @@
 void QVStart(int mode);
 
 extern PFileVar SendVar, FileVar;
-extern BOOL FileLog, BinLog;
 
 // log
 typedef struct {
@@ -109,7 +99,15 @@
 	BOOL bom;				// TRUE = BOM\x82\xA0\x82\xE8
 	int code;				// 0/1/2 = UTF-8/UTF-16LE/UTF-16BE
 } FLogDlgInfo_t;
+extern BOOL FileLog, BinLog;
 void logfile_lock_initialize(void);
+void LogPut1(BYTE b);
+void LogToFile(void);
+BOOL CreateLogBuf(void);
+void FreeLogBuf(void);
+BOOL CreateBinBuf(void);
+void FreeBinBuf(void);
+void FLogPause(BOOL Pause);
 void FLogRotateSize(size_t size);
 void FLogRotateRotate(int step);
 void FLogRotateHalt(void);

Copied: trunk/teraterm/teraterm/filesys_log.cpp (from rev 8893, trunk/teraterm/teraterm/filesys.cpp)
===================================================================
--- trunk/teraterm/teraterm/filesys_log.cpp	                        (rev 0)
+++ trunk/teraterm/teraterm/filesys_log.cpp	2020-08-18 15:27:29 UTC (rev 8894)
@@ -0,0 +1,1557 @@
+/*
+ * (C) 2020 TeraTerm Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* TERATERM.EXE, file transfer routines */
+#include <stdio.h>
+#include <io.h>
+#include <process.h>
+#include <windows.h>
+#include <htmlhelp.h>
+#include <assert.h>
+
+#include "teraterm.h"
+#include "tttypes.h"
+#include "ttftypes.h"
+#include "ftdlg.h"
+#include "ttwinman.h"
+#include "commlib.h"
+#include "ttcommon.h"
+#include "ttlib.h"
+#include "dlglib.h"
+#include "vtterm.h"
+#include "ftlib.h"
+#include "buffer.h"
+#include "helpid.h"
+#include "layer_for_unicode.h"
+#include "layer_for_unicode_crt.h"
+#include "codeconv.h"
+
+#include "filesys_log_res.h"
+#include "filesys.h"
+
+#if 0
+typedef struct {
+  HWND HMainWin;
+  HWND HWin;
+  WORD OpId;
+  char DlgCaption[40];
+
+  char FullName[MAX_PATH];
+  int DirLen;
+
+  int NumFname, FNCount;
+  HANDLE FnStrMemHandle;
+  PCHAR FnStrMem;
+  int FnPtr;
+
+  BOOL FileOpen;
+  HANDLE FileHandle;
+  LONG FileSize, ByteCount;
+  BOOL OverWrite;
+
+  BOOL LogFlag;
+  HANDLE LogFile;
+  WORD LogState;
+  WORD LogCount;
+
+  BOOL Success;
+  BOOL NoMsg;
+
+  char LogDefaultPath[MAX_PATH];
+  BOOL HideDialog;
+
+  BYTE LogLineBuf[16];
+  int FlushLogLineBuf;
+
+  int ProgStat;
+
+  DWORD StartTime;
+
+  // log rotate
+  int RotateMode;  //  enum rotate_mode RotateMode;
+  LONG RotateSize;
+  int RotateStep;
+
+  HANDLE LogThread;
+  DWORD LogThreadId;
+
+  DWORD FileMtime;
+  HANDLE LogThreadEvent;
+} TFileVar_;
+typedef TFileVar_ *PFileVar_;
+
+#define PFileVar PFileVar_
+#define TFileVar TFileVar_
+#endif
+
+static PFileVar LogVar = NULL;
+
+BOOL FileLog = FALSE;
+BOOL BinLog = FALSE;
+
+/*
+   Line Head flag for timestamping
+   2007.05.24 Gentaro
+*/
+enum enumLineEnd {
+	Line_Other = 0,
+	Line_LineHead = 1,
+	Line_FileHead = 2,
+};
+
+static enum enumLineEnd eLineEnd = Line_LineHead;
+
+
+// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82̃\x81\x83b\x83Z\x81[\x83W
+#define WM_DPC_LOGTHREAD_SEND (WM_APP + 1)
+
+static void CloseFileSync(PFileVar ptr);
+static void FileTransEnd_(WORD OpId);
+
+
+static PFileTransDlg FLogDlg = NULL;
+
+static BOOL OpenFTDlg_(PFileVar fv)
+{
+	PFileTransDlg FTDlg;
+
+	FTDlg = new CFileTransDlg();
+
+	fv->StartTime = 0;
+	fv->ProgStat = 0;
+	cv.FilePause &= ~fv->OpId;
+
+	if (fv->OpId != OpLog) {
+		fv->HideDialog = ts.FTHideDialog;
+	}
+
+	if (FTDlg!=NULL)
+	{
+		FTDlg->Create(hInst, HVTWin, fv, &cv, &ts);
+		FTDlg->RefreshNum();
+	}
+
+//	if (fv->OpId==OpLog)
+		FLogDlg = FTDlg; /* Log */
+#if 0
+	else
+		SendDlg = FTDlg; /* File send */
+#endif
+
+	fv->StartTime = GetTickCount();
+
+	return (FTDlg!=NULL);
+}
+
+static void ShowFTDlg(WORD OpId)
+{
+//	if (OpId == OpLog)
+	{
+		if (FLogDlg != NULL) {
+			FLogDlg->ShowWindow(SW_SHOWNORMAL);
+			SetForegroundWindow(FLogDlg->GetSafeHwnd());
+		}
+	}
+#if 0
+	else {
+		if (SendDlg != NULL) {
+			SendDlg->ShowWindow(SW_SHOWNORMAL);
+			SetForegroundWindow(SendDlg->GetSafeHwnd());
+		}
+	}
+#endif
+}
+
+static BOOL NewFileVar_(PFileVar *fv)
+{
+	if ((*fv)==NULL)
+	{
+		*fv = (PFileVar)malloc(sizeof(TFileVar));
+		if ((*fv)!=NULL)
+		{
+			char FileDirExpanded[MAX_PATH];
+			ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
+			memset(*fv, 0, sizeof(TFileVar));
+			strncpy_s((*fv)->FullName, sizeof((*fv)->FullName), FileDirExpanded, _TRUNCATE);
+			AppendSlash((*fv)->FullName,sizeof((*fv)->FullName));
+			(*fv)->DirLen = strlen((*fv)->FullName);
+			(*fv)->FileOpen = FALSE;
+			(*fv)->OverWrite = ((ts.FTFlag & FT_RENAME) == 0);
+			(*fv)->HMainWin = HVTWin;
+			(*fv)->Success = FALSE;
+			(*fv)->NoMsg = FALSE;
+			(*fv)->HideDialog = FALSE;
+		}
+	}
+
+	return ((*fv)!=NULL);
+}
+
+static void FreeFileVar_(PFileVar *fv)
+{
+	if ((*fv)!=NULL)
+	{
+		CloseFileSync(*fv);
+		//if ((*fv)->FileOpen) _lclose((*fv)->FileHandle);
+		if ((*fv)->FnStrMemHandle != 0)
+		{
+			GlobalUnlock((*fv)->FnStrMemHandle);
+			GlobalFree((*fv)->FnStrMemHandle);
+		}
+		free(*fv);
+		*fv = NULL;
+	}
+}
+
+/**
+ *	\x83t\x83@\x83C\x83\x8B\x96\xBC\x95\xB6\x8E\x9A\x97\xF1\x82̒u\x82\xAB\x8A\xB7\x82\xA6
+ *		&h	\x83z\x83X\x83g\x96\xBC\x82ɒu\x8A\xB7 (2007.5.14)
+ *		&p	TCP\x83|\x81[\x83g\x94ԍ\x86\x82ɒu\x8A\xB7 (2009.6.12)
+ *		&u	\x83\x8D\x83O\x83I\x83\x93\x92\x86\x82̃\x86\x81[\x83U\x96\xBC
+ */
+static void ConvertLogname(char *c, int destlen)
+{
+	char buf[MAXPATHLEN], buf2[MAXPATHLEN], *p = c;
+	char tmphost[1024];
+	char tmpuser[256+1];
+	DWORD len_user = sizeof(tmpuser);
+
+	memset(buf, 0, sizeof(buf));
+
+	while(*p != '\0') {
+		if (*p == '&' && *(p+1) != '\0') {
+			switch (*(p+1)) {
+			  case 'h':
+				if (cv.Open) {
+					if (cv.PortType == IdTCPIP) {
+						// \x83z\x83X\x83g\x96\xBC\x82\xAAIPv6\x83A\x83h\x83\x8C\x83X\x82\xBE\x82ƁA\x83t\x83@\x83C\x83\x8B\x96\xBC\x82Ɏg\x97p\x82ł\xAB\x82Ȃ\xA2\x95\xB6\x8E\x9A\x82\xAA\x93\xFC\x82邽\x82߁A
+						// \x97]\x8Cv\x82ȕ\xB6\x8E\x9A\x82͍폜\x82\xB7\x82\xE9\x81B
+						// (2013.3.9 yutaka)
+						strncpy_s(tmphost, sizeof(tmphost), ts.HostName, _TRUNCATE);
+						//strncpy_s(tmphost, sizeof(tmphost), "2001:0db8:bd05:01d2:288a:1fc0:0001:10ee", _TRUNCATE);
+						replaceInvalidFileNameChar(tmphost, '_');
+						strncat_s(buf,sizeof(buf), tmphost, _TRUNCATE);
+					}
+					else if (cv.PortType == IdSerial) {
+						strncpy_s(buf2,sizeof(buf2),buf,_TRUNCATE);
+						_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%sCOM%d", buf2, ts.ComPort);
+					}
+				}
+				break;
+			  case 'p':
+				if (cv.Open) {
+					if (cv.PortType == IdTCPIP) {
+						char port[6];
+						_snprintf_s(port, sizeof(port), _TRUNCATE, "%d", ts.TCPPort);
+						strncat_s(buf,sizeof(buf),port,_TRUNCATE);
+					}
+				}
+				break;
+			  case 'u':
+				if (GetUserName(tmpuser, &len_user) != 0) {
+					strncat_s(buf,sizeof(buf),tmpuser,_TRUNCATE);
+				}
+				break;
+			  default:
+				strncpy_s(buf2,sizeof(buf2),p,2);
+				strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
+			}
+			p++;
+		}
+		else {
+			strncpy_s(buf2,sizeof(buf2),p,1);
+			strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
+		}
+		p++;
+	}
+	strncpy_s(c, destlen, buf, _TRUNCATE);
+}
+
+static void FixLogOption(void)
+{
+	if (ts.LogBinary) {
+		ts.LogTypePlainText = false;
+		ts.LogTimestamp = false;
+	}
+}
+
+
+// \x83X\x83\x8C\x83b\x83h\x82̏I\x97\xB9\x82ƃt\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y
+static void CloseFileSync(PFileVar ptr)
+{
+	BOOL ret;
+
+	if (!ptr->FileOpen)
+		return;
+
+	if (ptr->LogThread != INVALID_HANDLE_VALUE) {
+		// \x83X\x83\x8C\x83b\x83h\x82̏I\x97\xB9\x91҂\xBF
+		ret = PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0);
+		if (ret != 0) {
+			// \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82ɃG\x83\x93\x83L\x83\x85\x81[\x82ł\xAB\x82\xBD\x8Fꍇ\x82̂ݑ҂\xBF\x8D\x87\x82킹\x82\xF0\x8Ds\x82\xA4\x81B
+			WaitForSingleObject(ptr->LogThread, INFINITE);
+		}
+		else {
+			//DWORD code = GetLastError();
+		}
+		CloseHandle(ptr->LogThread);
+		ptr->LogThread = INVALID_HANDLE_VALUE;
+	}
+	CloseHandle(ptr->FileHandle);
+}
+
+// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h
+static unsigned _stdcall DeferredLogWriteThread(void *arg)
+{
+	MSG msg;
+	PFileVar fv = (PFileVar)arg;
+	PCHAR buf;
+	DWORD buflen;
+	DWORD wrote;
+
+	PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
+
+	// \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82̍쐬\x82\xAA\x8FI\x82\xED\x82\xC1\x82\xBD\x82\xB1\x82Ƃ\xF0\x83X\x83\x8C\x83b\x83h\x90\xB6\x90\xAC\x8C\xB3\x82֒ʒm\x82\xB7\x82\xE9\x81B
+	if (fv->LogThreadEvent != NULL) {
+		SetEvent(fv->LogThreadEvent);
+	}
+
+	while (GetMessage(&msg, NULL, 0, 0) > 0) {
+		switch (msg.message) {
+			case WM_DPC_LOGTHREAD_SEND:
+				buf = (PCHAR)msg.wParam;
+				buflen = (DWORD)msg.lParam;
+				WriteFile(LogVar->FileHandle, buf, buflen, &wrote, NULL);
+				free(buf);   // \x82\xB1\x82\xB1\x82Ń\x81\x83\x82\x83\x8A\x89\xF0\x95\xFA
+				break;
+
+			case WM_QUIT:
+				goto end;
+				break;
+		}
+	}
+
+end:
+	_endthreadex(0);
+	return (0);
+}
+
+/**
+ *	\x83_\x83C\x83A\x83\x8D\x83O\x82̓\xE0\x97e\x82\xF0 ts \x82ɏ\x91\x82\xAB\x96߂\xB5
+ *
+ *	TODO
+ *		\x83_\x83C\x83A\x83\x8D\x83O\x82Őݒ肵\x82\xBD\x92l\x82͈ꎞ\x93I\x82Ȃ\xE0\x82̂\xC5
+ *		\x90ݒ\xE8\x82\xF0\x8F㏑\x82\xAB\x82\xB7\x82\xE9\x82̂͗ǂ\xAD\x82Ȃ\xA2\x82̂ł͂Ȃ\xA2\x82\xBE\x82낤\x82\xA9?
+ */
+static void SetLogFlags(HWND Dialog)
+{
+	WORD BinFlag, val;
+
+	GetRB(Dialog, &BinFlag, IDC_FOPTBIN, IDC_FOPTBIN);
+	ts.LogBinary = BinFlag;
+
+	GetRB(Dialog, &val, IDC_APPEND, IDC_APPEND);
+	ts.Append = val;
+
+	if (!BinFlag) {
+		GetRB(Dialog, &val, IDC_PLAINTEXT, IDC_PLAINTEXT);
+		ts.LogTypePlainText = val;
+
+		GetRB(Dialog, &val, IDC_TIMESTAMP, IDC_TIMESTAMP);
+		ts.LogTimestamp = val;
+	}
+
+	GetRB(Dialog, &val, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
+	ts.LogHideDialog = val;
+
+	GetRB(Dialog, &val, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
+	ts.LogAllBuffIncludedInFirst = val;
+
+	ts.LogTimestampType = (GetCurSel(Dialog, IDC_TIMESTAMPTYPE) - 1);
+}
+
+/**
+ *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x83`\x83F\x83b\x83N
+ *
+ *	@param[in]	filename
+ *	@param[out]	exist	TURE/FALSE
+ *	@param[out]	bom		0	no BOM (or file not exist)
+ *						1	UTF-8
+ *						2	UTF-16LE
+ *						3	UTF-16BE
+ */
+static void CheckLogFile(const wchar_t *filename, BOOL *exist, int *bom)
+{
+	*exist = FALSE;
+	*bom = 0;
+
+	// \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9?
+	DWORD logdir = _GetFileAttributesW(filename);
+	if ((logdir != INVALID_FILE_ATTRIBUTES) && ((logdir & FILE_ATTRIBUTE_DIRECTORY) == 0)) {
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82\xA0\x82\xC1\x82\xBD
+		*exist = TRUE;
+
+		// BOM\x97L\x82\xE8/\x96\xB3\x82\xB5\x83`\x83F\x83b\x83N
+		FILE *fp = __wfopen(filename, L"rb");
+		if (fp != NULL) {
+			unsigned char tmp[4];
+			size_t l = fread(tmp, 1, sizeof(tmp), fp);
+			fclose(fp);
+			if (l < 2) {
+				*bom = 0;
+			} else if (l >= 2 && tmp[0] == 0xff && tmp[1] == 0xfe) {
+				// UTF-16LE
+				*bom = 2;
+			} else if (l >= 2 && tmp[0] == 0xfe && tmp[1] == 0xff) {
+				// UTF-16BE
+				*bom = 3;
+			} else if (l >= 3 && tmp[0] == 0xef && tmp[1] == 0xbb && tmp[2] == 0xbf) {
+				// UTF-8
+				*bom = 1;
+			} else {
+				*bom = 0;
+			}
+		}
+	}
+}
+
+typedef struct {
+	FLogDlgInfo_t *info;
+	// work
+	BOOL file_exist;
+	int current_bom;
+	TTTSet *pts;
+} LogDlgWork_t;
+
+static void ArrangeControls(HWND Dialog, LogDlgWork_t *work)
+{
+	if (work->file_exist) {
+		EnableWindow(GetDlgItem(Dialog, IDC_APPEND), TRUE);
+		if (work->pts->Append > 0) {
+			CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND);
+		}
+	}
+	else {
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2 -> \x90V\x8BK
+		EnableWindow(GetDlgItem(Dialog, IDC_APPEND), FALSE);
+		CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE);
+	}
+
+	if (work->file_exist && IsDlgButtonChecked(Dialog, IDC_APPEND) == BST_CHECKED) {
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9 && append
+		int bom = work->current_bom;
+		if (bom != 0) {
+			// BOM\x97L\x82\xE8
+			CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
+			int cur =
+				bom == 1 ? 0 :
+				bom == 2 ? 1 :
+				bom == 3 ? 2 : 0;
+			SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, cur, 0);
+		}
+		else {
+			// BOM\x82Ȃ\xB5
+			CheckDlgButton(Dialog, IDC_BOM, BST_UNCHECKED);
+			SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
+		}
+		if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
+			EnableWindow(GetDlgItem(Dialog, IDC_BOM), FALSE);
+			if (bom != 0) {
+				// BOM\x97L\x82\xE8
+				EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE);
+			}
+			else {
+				// BOM\x82Ȃ\xB5
+				EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE);
+			}
+		}
+	}
+	else {
+		// \x83t\x83@\x83C\x83\x8B\x82\xAA\x82Ȃ\xA2 \x96\x94\x82\xCD append\x82ł͂Ȃ\xA2(\x8F㏑\x82\xAB)
+		CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE);
+		CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
+		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
+		if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
+			EnableWindow(GetDlgItem(Dialog, IDC_BOM), TRUE);
+		}
+	}
+}
+
+static void CheckLogFile(HWND Dialog, const wchar_t *filename, LogDlgWork_t *work)
+{
+	BOOL exist;
+	int bom;
+	CheckLogFile(filename, &exist, &bom);
+	work->file_exist = exist;
+	work->current_bom = bom;
+	ArrangeControls(Dialog, work);
+}
+
+static INT_PTR CALLBACK LogFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
+{
+	static const DlgTextInfo TextInfos[] = {
+		{ 0, "DLG_TABSHEET_TITLE_LOG" },
+		{ IDC_FOPTBIN, "DLG_FOPT_BINARY" },
+		{ IDC_APPEND, "DLG_FOPT_APPEND" },
+		{ IDC_PLAINTEXT, "DLG_FOPT_PLAIN" },
+		{ IDC_HIDEDIALOG, "DLG_FOPT_HIDEDIALOG" },
+		{ IDC_ALLBUFF_INFIRST, "DLG_FOPT_ALLBUFFINFIRST" },
+		{ IDC_TIMESTAMP, "DLG_FOPT_TIMESTAMP" },
+	};
+	static const I18nTextInfo timestamp_list[] = {
+		{ "DLG_FOPT_TIMESTAMP_LOCAL", L"Local Time" },
+		{ "DLG_FOPT_TIMESTAMP_UTC", L"UTC" },
+		{ "DLG_FOPT_TIMESTAMP_ELAPSED_LOGGING", L"Elapsed Time (Logging)" },
+		{ "DLG_FOPT_TIMESTAMP_ELAPSED_CONNECTION", L"Elapsed Time (Connection)" },
+	};
+	LogDlgWork_t *work = (LogDlgWork_t *)GetWindowLongPtr(Dialog, DWLP_USER);
+
+	if (Message == 	RegisterWindowMessage(HELPMSGSTRING)) {
+		// \x83R\x83\x82\x83\x93\x83_\x83C\x83A\x83\x8D\x83O\x82\xA9\x82\xE7\x82̃w\x83\x8B\x83v\x83\x81\x83b\x83Z\x81[\x83W\x82\xF0\x95t\x82\xAF\x91ւ\xA6\x82\xE9
+		Message = WM_COMMAND;
+		wParam = IDHELP;
+	}
+	switch (Message) {
+	case WM_INITDIALOG: {
+		work = (LogDlgWork_t *)lParam;
+		TTTSet *pts = work->pts;
+		const char *UILanguageFile = pts->UILanguageFile;
+		SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)work);
+		::DragAcceptFiles(Dialog, TRUE);
+
+		SetDlgTexts(Dialog, TextInfos, _countof(TextInfos), UILanguageFile);
+		SetI18nList("Tera Term", Dialog, IDC_TIMESTAMPTYPE, timestamp_list, _countof(timestamp_list),
+					UILanguageFile, 0);
+
+		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-8");
+		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16LE");
+		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)"UTF-16BE");
+		SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
+
+		_SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, work->info->filename);
+		work->info->filename = NULL;
+
+		// Binary/Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
+		if (pts->LogBinary) {
+			CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTBIN);
+		}
+		else {
+			CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, IDC_FOPTTEXT);
+		}
+
+		// Plain Text \x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X
+		if (pts->LogBinary) {
+			// Binary\x83t\x83\x89\x83O\x82\xAA\x97L\x8C\xF8\x82ȂƂ\xAB\x82̓`\x83F\x83b\x83N\x82ł\xAB\x82Ȃ\xA2
+			DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_PLAINTEXT);
+		}
+		else if (pts->LogTypePlainText) {
+			SetRB(Dialog, 1, IDC_PLAINTEXT, IDC_PLAINTEXT);
+		}
+
+		// Hide dialog\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2008.1.30 maya)
+		if (pts->LogHideDialog) {
+			SetRB(Dialog, 1, IDC_HIDEDIALOG, IDC_HIDEDIALOG);
+		}
+
+		// Include screen buffer\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2013.9.29 yutaka)
+		if (pts->LogAllBuffIncludedInFirst) {
+			SetRB(Dialog, 1, IDC_ALLBUFF_INFIRST, IDC_ALLBUFF_INFIRST);
+		}
+
+		// timestamp\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X (2006.7.23 maya)
+		if (pts->LogBinary) {
+			// Binary\x83t\x83\x89\x83O\x82\xAA\x97L\x8C\xF8\x82ȂƂ\xAB\x82̓`\x83F\x83b\x83N\x82ł\xAB\x82Ȃ\xA2
+			DisableDlgItem(Dialog, IDC_TIMESTAMP, IDC_TIMESTAMP);
+		}
+		else if (pts->LogTimestamp) {
+			SetRB(Dialog, 1, IDC_TIMESTAMP, IDC_TIMESTAMP);
+		}
+
+		// timestamp \x8E\xED\x95\xCA
+		int tstype = pts->LogTimestampType == TIMESTAMP_LOCAL ? 0 :
+				pts->LogTimestampType == TIMESTAMP_UTC ? 1 :
+				pts->LogTimestampType == TIMESTAMP_ELAPSED_LOGSTART ? 2 :
+				pts->LogTimestampType == TIMESTAMP_ELAPSED_CONNECTED ? 3 : 0;
+		SendDlgItemMessage(Dialog, IDC_TIMESTAMPTYPE, CB_SETCURSEL, tstype, 0);
+		if (pts->LogBinary || !pts->LogTimestamp) {
+			DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
+		}
+
+		CenterWindow(Dialog, GetParent(Dialog));
+
+		return TRUE;
+	}
+
+	case WM_COMMAND:
+		switch (LOWORD(wParam)) {
+		case IDOK: {
+			wchar_t filename[MAX_PATH];
+			_GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename, _countof(filename));
+			work->info->filename = _wcsdup(filename);
+			work->info->append = IsDlgButtonChecked(Dialog, IDC_APPEND) == BST_CHECKED;
+			work->info->bom = IsDlgButtonChecked(Dialog, IDC_BOM) == BST_CHECKED;
+			work->info->code = (int)SendDlgItemMessageA(Dialog, IDC_TEXTCODING_DROPDOWN, CB_GETCURSEL, 0, 0);
+			SetLogFlags(Dialog);
+			EndDialog(Dialog, IDOK);
+			break;
+		}
+		case IDCANCEL:
+			EndDialog(Dialog, IDCANCEL);
+			break;
+		case IDHELP:
+			OpenHelp(HH_HELP_CONTEXT, HlpFileLog, work->pts->UILanguageFile);
+			break;
+		case IDC_FOPT_FILENAME_BUTTON: {
+			/* save current dir */
+			const char *UILanguageFile = work->pts->UILanguageFile;
+			wchar_t curdir[MAXPATHLEN];
+			_GetCurrentDirectoryW(_countof(curdir), curdir);
+
+			wchar_t fname[MAX_PATH];
+			GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname, _countof(fname));
+
+			wchar_t FNFilter[128*3];
+			get_lang_msgW("FILEDLG_ALL_FILTER", FNFilter, sizeof(FNFilter), L"All(*.*)\\0*.*\\0\\0", UILanguageFile);
+
+			wchar_t caption[MAX_PATH];
+			wchar_t uimsg[MAX_UIMSG];
+#define TitLogW      L"Log"
+			get_lang_msgW("FILEDLG_TRANS_TITLE_LOG", uimsg, _countof(uimsg), TitLogW, UILanguageFile);
+			wcsncpy_s(caption, _countof(caption), L"Tera Term: ", _TRUNCATE);
+			wcsncat_s(caption, _countof(caption), uimsg, _TRUNCATE);
+
+			OPENFILENAMEW ofn = {};
+			ofn.lStructSize = get_OPENFILENAME_SIZEW();
+			//ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
+			ofn.Flags |= OFN_EXPLORER | OFN_ENABLESIZING;
+			ofn.Flags |= OFN_SHOWHELP;
+			ofn.Flags |= OFN_NOCHANGEDIR;		// \x82\xA4\x82܂\xAD\x93\xAE\x8D삵\x82Ȃ\xA2\x8A‹\xAB\x82\xE0\x82\xA0\x82\xE9\x82悤\x82\xBE
+			ofn.hwndOwner = Dialog;
+			ofn.lpstrFilter = FNFilter;
+			ofn.nFilterIndex = 1;
+			ofn.lpstrFile = fname;
+			ofn.nMaxFile = _countof(fname);
+			ofn.lpstrTitle = caption;
+			BOOL Ok = GetSaveFileNameW(&ofn);
+			if (Ok) {
+				SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname);
+			}
+
+			/* restore dir */
+			_SetCurrentDirectoryW(curdir);
+
+			break;
+		}
+		case IDC_FOPTBIN:
+			EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), FALSE);
+			EnableWindow(GetDlgItem(Dialog, IDC_BOM), FALSE);
+			DisableDlgItem(Dialog, IDC_PLAINTEXT, IDC_TIMESTAMP);
+			DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
+			break;
+		case IDC_FOPTTEXT:
+			ArrangeControls(Dialog, work);
+			EnableDlgItem(Dialog, IDC_PLAINTEXT, IDC_TIMESTAMP);
+			// FALLTHROUGH -- BinFlag \x82\xAA off \x82̎\x9E\x82\xCD Timestamp \x8E\xED\x95ʂ̗L\x8C\xF8/\x96\xB3\x8C\xF8\x82\xF0\x90ݒ肷\x82\xE9
+		case IDC_TIMESTAMP:
+			if (IsDlgButtonChecked(Dialog, IDC_TIMESTAMP) == BST_CHECKED) {
+				EnableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
+			}
+			else {
+				DisableDlgItem(Dialog, IDC_TIMESTAMPTYPE, IDC_TIMESTAMPTYPE);
+			}
+			break;
+		case IDC_FOPT_FILENAME_EDIT:
+			if (HIWORD(wParam) == EN_CHANGE){
+				wchar_t filename[MAX_PATH];
+				GetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename, _countof(filename));
+				CheckLogFile(Dialog, filename, work);
+			}
+			break;
+		case IDC_NEW_OVERWRITE:
+			if (IsDlgButtonChecked(Dialog, IDC_FOPTTEXT) == BST_CHECKED) {
+				EnableWindow(GetDlgItem(Dialog, IDC_BOM), TRUE);
+				EnableWindow(GetDlgItem(Dialog, IDC_TEXTCODING_DROPDOWN), TRUE);
+				CheckDlgButton(Dialog, IDC_BOM, BST_CHECKED);
+				SendDlgItemMessage(Dialog, IDC_TEXTCODING_DROPDOWN, CB_SETCURSEL, 0, 0);
+			}
+			break;
+		case IDC_APPEND:
+			ArrangeControls(Dialog, work);
+			break;
+		}
+		break;
+	case WM_DROPFILES: {
+		// \x95\xA1\x90\x94\x83h\x83\x8D\x83b\x83v\x82\xB3\x82\xEA\x82Ă\xE0\x8Dŏ\x89\x82\xCC1\x82‚\xBE\x82\xAF\x82\xF0\x88\xB5\x82\xA4
+		HDROP hDrop = (HDROP)wParam;
+		const UINT len = _DragQueryFileW(hDrop, 0, NULL, 0);
+		if (len == 0) {
+			DragFinish(hDrop);
+			return TRUE;
+		}
+		wchar_t *filename = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1));
+		_DragQueryFileW(hDrop, 0, filename, len + 1);
+		filename[len] = '\0';
+		CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_APPEND);
+		_SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, filename);
+		SendDlgItemMessage(Dialog, IDC_FOPT_FILENAME_EDIT, EM_SETSEL, len, len);
+		free(filename);
+		DragFinish(hDrop);
+		return TRUE;
+	}
+	}
+	return FALSE;
+}
+
+static BOOL LogStart(void)
+{
+	unsigned tid;
+
+	if ((FileLog) || (BinLog)) return FALSE;
+
+	assert(LogVar != NULL);
+
+	if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0) {
+		// \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xAA\x90ݒ肳\x82\xEA\x82Ă\xA2\x82Ȃ\xA2
+		return FALSE;
+	}
+
+	if (! LoadTTFILE()) return FALSE;
+
+	LogVar->OpId = OpLog;
+	(*SetFileVar)(LogVar);
+	FixLogOption();
+
+	if (ts.LogBinary > 0)
+	{
+		BinLog = TRUE;
+		FileLog = FALSE;
+		if (! CreateBinBuf())
+		{
+			FileTransEnd_(OpLog);
+			return FALSE;
+		}
+	}
+	else {
+		BinLog = FALSE;
+		FileLog = TRUE;
+		if (! CreateLogBuf())
+		{
+			FileTransEnd_(OpLog);
+			return FALSE;
+		}
+	}
+	cv.LStart = cv.LogPtr;
+	cv.LCount = 0;
+	if (ts.LogHideDialog)
+		LogVar->HideDialog = 1;
+
+	/* 2007.05.24 Gentaro */
+	eLineEnd = Line_LineHead;
+
+	if (ts.Append > 0)
+	{
+		int dwShareMode = FILE_SHARE_READ;
+		if (!ts.LogLockExclusive) {
+			dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
+		}
+		LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
+		                                OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+		if (LogVar->FileHandle != INVALID_HANDLE_VALUE){
+			SetFilePointer(LogVar->FileHandle, 0, NULL, FILE_END);
+			/* 2007.05.24 Gentaro
+				If log file already exists,
+				a newline is inserted before the first timestamp.
+			*/
+			eLineEnd = Line_FileHead;
+		}
+	}
+	else {
+		int dwShareMode = FILE_SHARE_READ;
+		if (!ts.LogLockExclusive) {
+			dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
+		}
+		LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
+		                                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+	}
+	LogVar->FileOpen = (LogVar->FileHandle != INVALID_HANDLE_VALUE);
+	if (! LogVar->FileOpen)
+	{
+		char msg[128];
+
+		// \x83t\x83@\x83C\x83\x8B\x83I\x81[\x83v\x83\x93\x83G\x83\x89\x81[\x8E\x9E\x82̃\x81\x83b\x83Z\x81[\x83W\x95\\x8E\xA6\x82\xF0\x92lj\xC1\x82\xB5\x82\xBD\x81B(2008.7.9 yutaka)
+		if (LogVar->NoMsg == FALSE) {
+			_snprintf_s(msg, sizeof(msg), _TRUNCATE, "Can not create a `%s' file. (%d)", LogVar->FullName, GetLastError());
+			MessageBox(NULL, msg, "Tera Term: File open error", MB_OK | MB_ICONERROR);
+		}
+
+		FileTransEnd_(OpLog);
+		return FALSE;
+	}
+	LogVar->ByteCount = 0;
+
+	// Log rotate configuration
+	LogVar->RotateMode = ts.LogRotate;
+	LogVar->RotateSize = ts.LogRotateSize;
+	LogVar->RotateStep = ts.LogRotateStep;
+
+	// Log rotate\x82\xAA\x97L\x8C\xF8\x82̏ꍇ\x81A\x8F\x89\x8A\xFA\x83t\x83@\x83C\x83\x8B\x83T\x83C\x83Y\x82\xF0\x90ݒ肷\x82\xE9\x81B
+	// \x8Dŏ\x89\x82̃t\x83@\x83C\x83\x8B\x82\xAA\x90ݒ肵\x82\xBD\x83T\x83C\x83Y\x82Ń\x8D\x81[\x83e\x81[\x83g\x82\xB5\x82Ȃ\xA2\x96\xE2\x91\xE8\x82̏C\x90\xB3\x81B
+	// (2016.4.9 yutaka)
+	if (LogVar->RotateMode != ROTATE_NONE) {
+		DWORD size = GetFileSize(LogVar->FileHandle, NULL);
+		if (size != -1)
+			LogVar->ByteCount = size;
+	}
+
+	if (! OpenFTDlg_(LogVar)) {
+		FileTransEnd_(OpLog);
+		return FALSE;
+	}
+
+	// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82\xF0\x8BN\x82\xB1\x82\xB7\x81B
+	// (2013.4.19 yutaka)
+	// DeferredLogWriteThread \x83X\x83\x8C\x83b\x83h\x82\xAA\x8BN\x8F\xB0\x82\xB5\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D쐬\x82\xB3\x82\xEA\x82\xE9\x82\xE6\x82\xE8\x91O\x82ɁA
+	// \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y(CloseFileSync)\x82\xAA\x8Ds\x82\xED\x82\xEA\x82\xE9\x82ƁA\x83G\x83\x93\x83L\x83\x85\x81[\x82\xAA\x8E\xB8\x94s\x82\xB5\x81A\x83f\x83b\x83h\x83\x8D\x83b\x83N
+	// \x82\xB7\x82\xE9\x82Ƃ\xA2\x82\xA4\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B
+	// \x83X\x83\x8C\x83b\x83h\x8AԂ̓\xAF\x8A\xFA\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x96\xBC\x91O\x82Ȃ\xB5\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xC1\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xCC
+	// \x8D쐬\x82܂ő҂\xBF\x8D\x87\x82킹\x82\xB7\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B\x96\xBC\x91O\x95t\x82\xAB\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xA4\x8Fꍇ\x82́A
+	// \x83V\x83X\x83e\x83\x80(Windows OS)\x8F\xE3\x82Ń\x86\x83j\x81[\x83N\x82Ȗ\xBC\x91O\x82ɂ\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9\x81B
+	// (2016.9.23 yutaka)
+	LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+	LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
+	LogVar->LogThreadId = tid;
+	if (LogVar->LogThreadEvent != NULL) {
+		WaitForSingleObject(LogVar->LogThreadEvent, INFINITE);
+		CloseHandle(LogVar->LogThreadEvent);
+	}
+
+	// \x8C\xBB\x8D݃o\x83b\x83t\x83@\x82ɂ\xA0\x82\xE9\x83f\x81[\x83^\x82\xF0\x82\xB7\x82ׂď\x91\x82\xAB\x8Fo\x82\xB5\x82Ă\xA9\x82\xE7\x81A
+	// \x83\x8D\x83O\x8D̎\xE6\x82\xF0\x8AJ\x8En\x82\xB7\x82\xE9\x81B
+	// (2013.9.29 yutaka)
+	if (ts.LogAllBuffIncludedInFirst) {
+		DWORD ofs, size, written_size;
+		char buf[512];
+		const char *crlf = "\r\n";
+		DWORD crlf_len = 2;
+		for (ofs = 0 ;  ; ofs++ ) {
+			// 1\x82‚̍s\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B\x95\xB6\x8E\x9A\x82\xBE\x82\xAF\x82Ȃ̂ŁA\x83G\x83X\x83P\x81[\x83v\x83V\x81[\x83P\x83\x93\x83X\x82͊܂܂\xEA\x82Ȃ\xA2\x81B
+			size = BuffGetAnyLineData(ofs, buf, sizeof(buf));
+			if (size == -1)
+				break;
+
+#if 0
+			if (ts.DeferredLogWriteMode) { // \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82\xDD
+				char *pbuf = (char *)malloc(size + 2);
+				memcpy(pbuf, buf, size);
+				pbuf[size] = '\r';
+				pbuf[size+1] = '\n';
+				Sleep(1);  // \x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D\xEC\x82\xE7\x82\xEA\x82\xE9\x82悤\x82ɁA\x83R\x83\x93\x83e\x83L\x83X\x83g\x83X\x83C\x83b\x83`\x82𑣂\xB7\x81B
+				PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)pbuf, size + 2);
+			} else { // \x92\xBC\x8F\x91\x82\xAB\x81B\x83l\x83b\x83g\x83\x8F\x81[\x83N\x8Co\x97R\x82\xBE\x82ƒx\x82\xA2\x81B
+#endif
+				WriteFile(LogVar->FileHandle, buf, size, &written_size, NULL);
+				WriteFile(LogVar->FileHandle, crlf, crlf_len, &written_size, NULL);
+#if 0
+			}
+#endif
+		}
+	}
+
+	return TRUE;
+}
+
+void LogPut1(BYTE b)
+{
+	cv.LogBuf[cv.LogPtr] = b;
+	cv.LogPtr++;
+	if (cv.LogPtr>=InBuffSize)
+		cv.LogPtr = cv.LogPtr-InBuffSize;
+
+	if (FileLog)
+	{
+		if (cv.LCount>=InBuffSize)
+		{
+			cv.LCount = InBuffSize;
+			cv.LStart = cv.LogPtr;
+		}
+		else
+			cv.LCount++;
+	}
+	else
+		cv.LCount = 0;
+}
+
+static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
+{
+	if (*Count<=0) return FALSE;
+	*b = Buf[*Start];
+	(*Start)++;
+	if (*Start>=InBuffSize)
+		*Start = *Start-InBuffSize;
+	(*Count)--;
+	return TRUE;
+}
+
+
+
+static CRITICAL_SECTION g_filelog_lock;   /* \x83\x8D\x83b\x83N\x97p\x95ϐ\x94 */
+
+void logfile_lock_initialize(void)
+{
+	InitializeCriticalSection(&g_filelog_lock);
+}
+
+static inline void logfile_lock(void)
+{
+	EnterCriticalSection(&g_filelog_lock);
+}
+
+static inline void logfile_unlock(void)
+{
+	LeaveCriticalSection(&g_filelog_lock);
+}
+
+ // \x83R\x83\x81\x83\x93\x83g\x82\xF0\x83\x8D\x83O\x82֒lj\xC1\x82\xB7\x82\xE9
+static void CommentLogToFile(char *buf, int size)
+{
+	DWORD wrote;
+
+	if (LogVar == NULL || !LogVar->FileOpen) {
+		char uimsg[MAX_UIMSG];
+		get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile);
+		get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg),
+		             "It is not opened by the log file yet.", ts.UILanguageFile);
+		::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
+		return;
+	}
+
+	logfile_lock();
+	WriteFile(LogVar->FileHandle, buf, size, &wrote, NULL);
+	WriteFile(LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // \x89\xFC\x8Ds
+	/* Set Line End Flag
+		2007.05.24 Gentaro
+	*/
+	eLineEnd = Line_LineHead;
+	logfile_unlock();
+}
+
+// \x83\x8D\x83O\x82\xF0\x83\x8D\x81[\x83e\x81[\x83g\x82\xB7\x82\xE9\x81B
+// (2013.3.21 yutaka)
+static void LogRotate(void)
+{
+	int loopmax = 10000;  // XXX
+	char filename[1024];
+	char newfile[1024], oldfile[1024];
+	int i, k;
+	int dwShareMode = FILE_SHARE_READ;
+	unsigned tid;
+
+	if (! LogVar->FileOpen) return;
+
+	if (LogVar->RotateMode == ROTATE_NONE)
+		return;
+
+	if (LogVar->RotateMode == ROTATE_SIZE) {
+		if (LogVar->ByteCount <= LogVar->RotateSize)
+			return;
+		//OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, LogVar->RotateMode, LogVar->ByteCount);
+	} else {
+		return;
+	}
+
+	logfile_lock();
+	// \x83\x8D\x83O\x83T\x83C\x83Y\x82\xF0\x8Dď\x89\x8A\x{227B0B7}\x82\xE9\x81B
+	LogVar->ByteCount = 0;
+
+	// \x82\xA2\x82\xC1\x82\xBD\x82񍡂̃t\x83@\x83C\x83\x8B\x82\xF0\x83N\x83\x8D\x81[\x83Y\x82\xB5\x82āA\x95ʖ\xBC\x82̃t\x83@\x83C\x83\x8B\x82\xF0\x83I\x81[\x83v\x83\x93\x82\xB7\x82\xE9\x81B
+	CloseFileSync(LogVar);
+	//_lclose(LogVar->FileHandle);
+
+	// \x90\xA2\x91ネ\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82̃X\x83e\x83b\x83v\x90\x94\x82̎w\x92肪\x82\xA0\x82邩
+	if (LogVar->RotateStep > 0)
+		loopmax = LogVar->RotateStep;
+
+	for (i = 1 ; i <= loopmax ; i++) {
+		_snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i);
+		if (_access_s(filename, 0) != 0)
+			break;
+	}
+	if (i > loopmax) {
+		// \x90\xA2\x91オ\x82\xA2\x82\xC1\x82ς\xA2\x82ɂȂ\xC1\x82\xBD\x82\xE7\x81A\x8DŌẪt\x83@\x83C\x83\x8B\x82\xA9\x82\xE7\x94p\x8A\xFC\x82\xB7\x82\xE9\x81B
+		i = loopmax;
+	}
+
+	// \x95ʃt\x83@\x83C\x83\x8B\x82Ƀ\x8A\x83l\x81[\x83\x80\x81B
+	for (k = i-1 ; k >= 0 ; k--) {
+		if (k == 0)
+			strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE);
+		else
+			_snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k);
+		_snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1);
+		remove(newfile);
+		if (rename(oldfile, newfile) != 0) {
+			OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno);
+		}
+	}
+
+	// \x8DăI\x81[\x83v\x83\x93
+	if (!ts.LogLockExclusive) {
+		dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
+	}
+	LogVar->FileHandle = CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
+	                                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+
+	// \x92x\x89\x84\x8F\x91\x82\xAB\x8D\x9E\x82ݗp\x83X\x83\x8C\x83b\x83h\x82\xF0\x8BN\x82\xB1\x82\xB7\x81B
+	// (2013.4.19 yutaka)
+	// DeferredLogWriteThread \x83X\x83\x8C\x83b\x83h\x82\xAA\x8BN\x8F\xB0\x82\xB5\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xAA\x8D쐬\x82\xB3\x82\xEA\x82\xE9\x82\xE6\x82\xE8\x91O\x82ɁA
+	// \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̃N\x83\x8D\x81[\x83Y(CloseFileSync)\x82\xAA\x8Ds\x82\xED\x82\xEA\x82\xE9\x82ƁA\x83G\x83\x93\x83L\x83\x85\x81[\x82\xAA\x8E\xB8\x94s\x82\xB5\x81A\x83f\x83b\x83h\x83\x8D\x83b\x83N
+	// \x82\xB7\x82\xE9\x82Ƃ\xA2\x82\xA4\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B
+	// \x83X\x83\x8C\x83b\x83h\x8AԂ̓\xAF\x8A\xFA\x82\xF0\x8Ds\x82\xA4\x82\xBD\x82߁A\x96\xBC\x91O\x82Ȃ\xB5\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xC1\x82āA\x83X\x83\x8C\x83b\x83h\x83L\x83\x85\x81[\x82\xCC
+	// \x8D쐬\x82܂ő҂\xBF\x8D\x87\x82킹\x82\xB7\x82\xE9\x82悤\x82ɂ\xB5\x82\xBD\x81B\x96\xBC\x91O\x95t\x82\xAB\x83C\x83x\x83\x93\x83g\x83I\x83u\x83W\x83F\x83N\x83g\x82\xF0\x8Eg\x82\xA4\x8Fꍇ\x82́A
+	// \x83V\x83X\x83e\x83\x80(Windows OS)\x8F\xE3\x82Ń\x86\x83j\x81[\x83N\x82Ȗ\xBC\x91O\x82ɂ\xB7\x82\xE9\x95K\x97v\x82\xAA\x82\xA0\x82\xE9\x81B
+	// (2016.9.26 yutaka)
+	LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+	LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
+	LogVar->LogThreadId = tid;
+	if (LogVar->LogThreadEvent != NULL) {
+		WaitForSingleObject(LogVar->LogThreadEvent, INFINITE);
+		CloseHandle(LogVar->LogThreadEvent);
+	}
+
+	logfile_unlock();
+
+}
+
+void LogToFile(void)
+{
+	PCHAR Buf;
+	int Start, Count;
+	BYTE b;
+	PCHAR WriteBuf;
+	DWORD WriteBufMax, WriteBufLen;
+	CHAR tmp[128];
+	DWORD wrote;
+
+	if (! LogVar->FileOpen) return;
+	if (FileLog)
+	{
+		Buf = cv.LogBuf;
+		Start = cv.LStart;
+		Count = cv.LCount;
+	}
+	else if (BinLog)
+	{
+		Buf = cv.BinBuf;
+		Start = cv.BStart;
+		Count = cv.BCount;
+	}
+	else
+		return;
+
+	if (Buf==NULL) return;
+	if (Count==0) return;
+
+	// \x83\x8D\x83b\x83N\x82\xF0\x8E\xE6\x82\xE9(2004.8.6 yutaka)
+	logfile_lock();
+
+	if (ts.DeferredLogWriteMode) {
+		WriteBufMax = 8192;
+		WriteBufLen = 0;
+		WriteBuf = (PCHAR)malloc(WriteBufMax);
+		while (Get1(Buf,&Start,&Count,&b)) {
+			if (!FLogIsPause() && (! cv.ProtoFlag))
+			{
+				tmp[0] = 0;
+				if ( ts.LogTimestamp && eLineEnd ) {
+					char *strtime = NULL;
+
+					switch (ts.LogTimestampType) {
+					case TIMESTAMP_LOCAL:
+						strtime = mctimelocal(ts.LogTimestampFormat, FALSE);
+						break;
+					case TIMESTAMP_UTC:
+						strtime = mctimelocal(ts.LogTimestampFormat, TRUE);
+						break;
+					case TIMESTAMP_ELAPSED_LOGSTART:
+						strtime = strelapsed(LogVar->StartTime);
+						break;
+					case TIMESTAMP_ELAPSED_CONNECTED:
+						strtime = strelapsed(cv.ConnectedTime);
+						break;
+					}
+
+					/* 2007.05.24 Gentaro */
+					if( eLineEnd == Line_FileHead ){
+						strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE);
+					}
+					strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
+					strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
+					strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
+				}
+
+				/* 2007.05.24 Gentaro */
+				if( b == 0x0a ){
+					eLineEnd = Line_LineHead; /* set endmark*/
+				}
+				else {
+					eLineEnd = Line_Other; /* clear endmark*/
+				}
+
+				if (WriteBufLen >= (WriteBufMax*4/5)) {
+					WriteBufMax *= 2;
+					WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax);
+				}
+				memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp));
+				WriteBufLen += strlen(tmp);
+				WriteBuf[WriteBufLen++] = b;
+
+				(LogVar->ByteCount)++;
+			}
+		}
+
+		PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen);
+
+	} else {
+
+		while (Get1(Buf,&Start,&Count,&b))
+		{
+			if (!FLogIsPause() && (! cv.ProtoFlag))
+			{
+				if ( ts.LogTimestamp && eLineEnd ) {
+					char *strtime = NULL;
+
+					switch (ts.LogTimestampType) {
+					case TIMESTAMP_LOCAL:
+						strtime = mctimelocal(ts.LogTimestampFormat, FALSE);
+						break;
+					case TIMESTAMP_UTC:
+						strtime = mctimelocal(ts.LogTimestampFormat, TRUE);
+						break;
+					case TIMESTAMP_ELAPSED_LOGSTART:
+						strtime = strelapsed(LogVar->StartTime);
+						break;
+					case TIMESTAMP_ELAPSED_CONNECTED:
+						strtime = strelapsed(cv.ConnectedTime);
+						break;
+					}
+					WriteFile(LogVar->FileHandle, "[", 1, &wrote, NULL);
+					WriteFile(LogVar->FileHandle, strtime, strlen(strtime), &wrote, NULL);
+					WriteFile(LogVar->FileHandle, "] ", 2, &wrote, NULL);
+				}
+
+				/* 2007.05.24 Gentaro */
+				if( b == 0x0a ){
+					eLineEnd = Line_LineHead; /* set endmark*/
+				}
+				else {
+					eLineEnd = Line_Other; /* clear endmark*/
+				}
+
+				WriteFile(LogVar->FileHandle, (PCHAR)&b, 1, &wrote, NULL);
+				(LogVar->ByteCount)++;
+			}
+		}
+
+	}
+
+	logfile_unlock();
+
+	if (FileLog)
+	{
+		cv.LStart = Start;
+		cv.LCount = Count;
+	}
+	else {
+		cv.BStart = Start;
+		cv.BCount = Count;
+	}
+	if (FLogIsPause() || cv.ProtoFlag) return;
+	if (FLogDlg!=NULL)
+		FLogDlg->RefreshNum();
+
+	// \x83\x8D\x83O\x81E\x83\x8D\x81[\x83e\x81[\x83g
+	LogRotate();
+
+}
+
+BOOL CreateLogBuf(void)
+{
+	if (cv.HLogBuf==NULL)
+	{
+		cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
+		cv.LogBuf = NULL;
+		cv.LogPtr = 0;
+		cv.LStart = 0;
+		cv.LCount = 0;
+	}
+	return (cv.HLogBuf!=NULL);
+}
+
+void FreeLogBuf(void)
+{
+	if ((cv.HLogBuf==NULL) || FileLog)
+		return;
+	if (cv.LogBuf!=NULL)
+		GlobalUnlock(cv.HLogBuf);
+	GlobalFree(cv.HLogBuf);
+	cv.HLogBuf = NULL;
+	cv.LogBuf = NULL;
+	cv.LogPtr = 0;
+	cv.LStart = 0;
+	cv.LCount = 0;
+}
+
+BOOL CreateBinBuf(void)
+{
+	if (cv.HBinBuf==NULL)
+	{
+		cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
+		cv.BinBuf = NULL;
+		cv.BinPtr = 0;
+		cv.BStart = 0;
+		cv.BCount = 0;
+	}
+	return (cv.HBinBuf!=NULL);
+}
+
+void FreeBinBuf(void)
+{
+	if ((cv.HBinBuf==NULL) || BinLog)
+		return;
+	if (cv.BinBuf!=NULL)
+		GlobalUnlock(cv.HBinBuf);
+	GlobalFree(cv.HBinBuf);
+	cv.HBinBuf = NULL;
+	cv.BinBuf = NULL;
+	cv.BinPtr = 0;
+	cv.BStart = 0;
+	cv.BCount = 0;
+}
+
+static void FileTransEnd_(WORD OpId)
+/* OpId = 0: close Log and FileSend
+      OpLog: close Log
+ OpSendFile: close FileSend */
+{
+	if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
+	{
+		FileLog = FALSE;
+		BinLog = FALSE;
+		if (FLogDlg!=NULL)
+		{
+			FLogDlg->DestroyWindow();
+			FLogDlg = NULL;
+		}
+		FreeFileVar_(&LogVar);
+		FreeLogBuf();
+		FreeBinBuf();
+		FreeTTFILE();
+	}
+
+#if 0
+	if (((OpId==0) || (OpId==OpSendFile)) && FSend)
+	{
+		FSend = FALSE;
+		TalkStatus = IdTalkKeyb;
+		if (SendDlg!=NULL)
+		{
+			SendDlg->DestroyWindow();
+			SendDlg = NULL;
+		}
+		FreeFileVar_(&SendVar);
+		FreeTTFILE();
+	}
+#endif
+
+//	EndDdeCmnd(0);
+}
+
+
+/**
+ *	\x83\x8D\x83O\x82\xF0\x83|\x81[\x83Y\x82\xB7\x82\xE9
+ *	\x8C\xB3\x82\xCD FLogChangeButton() \x82\xBE\x82\xC1\x82\xBD
+ */
+void FLogPause(BOOL Pause)
+{
+	if (FLogDlg!=NULL)
+		FLogDlg->ChangeButton(Pause);
+	FileTransPause(OpLog, Pause);
+}
+
+/**
+ *	\x83\x8D\x83O\x83\x8D\x81[\x83e\x81[\x83g\x82̐ݒ\xE8
+ *	\x83\x8D\x83O\x82̃T\x83C\x83Y\x82\xAA<size>\x83o\x83C\x83g\x82𒴂\xA6\x82Ă\xA2\x82\xEA\x82΁A\x83\x8D\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82\xB7\x82\xE9\x82悤\x90ݒ肷\x82\xE9
+ */
+void FLogRotateSize(size_t size)
+{
+	if (LogVar == NULL) {
+		return;
+	}
+	LogVar->RotateMode = ROTATE_SIZE;
+	LogVar->RotateSize = size;
+}
+
+/**
+ *	\x83\x8D\x83O\x83\x8D\x81[\x83e\x81[\x83g\x82̐ݒ\xE8
+ *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82̐\xA2\x91\xE3\x82\xF0\x90ݒ肷\x82\xE9
+ */
+void FLogRotateRotate(int step)
+{
+	if (LogVar == NULL) {
+		return;
+	}
+	LogVar->RotateStep = step;
+}
+
+/**
+ *	\x83\x8D\x83O\x83\x8D\x81[\x83e\x81[\x83g\x82̐ݒ\xE8
+ *	\x83\x8D\x81[\x83e\x81[\x83V\x83\x87\x83\x93\x82\xF0\x92\xE2\x8E~
+ */
+void FLogRotateHalt(void)
+{
+	if (LogVar == NULL) {
+		return;
+	}
+	LogVar->RotateMode = ROTATE_NONE;
+	LogVar->RotateSize = 0;
+	LogVar->RotateStep = 0;
+}
+
+static INT_PTR CALLBACK OnCommentDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
+{
+	static const DlgTextInfo TextInfos[] = {
+		{ 0, "DLG_COMMENT_TITLE" },
+		{ IDOK, "BTN_OK" }
+	};
+	char buf[256];
+	UINT ret;
+
+	switch (msg) {
+		case WM_INITDIALOG:
+			//SetDlgItemText(hDlgWnd, IDC_EDIT_COMMENT, "\x83T\x83\x93\x83v\x83\x8B");
+			// \x83G\x83f\x83B\x83b\x83g\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82Ƀt\x83H\x81[\x83J\x83X\x82\xF0\x82\xA0\x82Ă\xE9
+			SetFocus(GetDlgItem(hDlgWnd, IDC_EDIT_COMMENT));
+			SetDlgTexts(hDlgWnd, TextInfos, _countof(TextInfos), ts.UILanguageFile);
+			return FALSE;
+
+		case WM_COMMAND:
+			switch (LOWORD(wp)) {
+				case IDOK:
+					memset(buf, 0, sizeof(buf));
+					ret = GetDlgItemTextA(hDlgWnd, IDC_EDIT_COMMENT, buf, sizeof(buf) - 1);
+					if (ret > 0) { // \x83e\x83L\x83X\x83g\x8E擾\x90\xAC\x8C\xF7
+						//buf[sizeof(buf) - 1] = '\0';  // null-terminate
+						CommentLogToFile(buf, ret);
+					}
+					TTEndDialog(hDlgWnd, IDOK);
+					break;
+				default:
+					return FALSE;
+			}
+			break;
+		case WM_CLOSE:
+			TTEndDialog(hDlgWnd, 0);
+			return TRUE;
+
+		default:
+			return FALSE;
+	}
+	return TRUE;
+}
+
+void FLogAddCommentDlg(HINSTANCE hInst, HWND hWnd)
+{
+	// \x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x82փR\x83\x81\x83\x93\x83g\x82\xF0\x92lj\xC1\x82\xB7\x82\xE9 (2004.8.6 yutaka)
+	TTDialogBox(hInst, MAKEINTRESOURCE(IDD_COMMENT_DIALOG),
+				HVTWin, OnCommentDlgProc);
+}
+
+void FLogClose(void)
+{
+	if (LogVar != NULL)
+		FileTransEnd_(OpLog);
+}
+
+BOOL FLogOpen(const char *fname)
+{
+	BOOL ret;
+
+	if (LogVar != NULL) {
+		return FALSE;
+	}
+
+	LogVar->DirLen = 0;
+	LogVar->NoMsg = TRUE;
+	strncpy_s(LogVar->FullName, sizeof(LogVar->FullName), fname, _TRUNCATE);
+	ret = LogStart();
+	return ret;
+}
+
+BOOL FLogIsOpend(void)
+{
+	// LogVar->FileOpen
+	return LogVar != NULL;
+}
+
+void FLogWriteStr(const char *str)
+{
+	if (LogVar != NULL)
+	{
+		DWORD wrote;
+		size_t len = strlen(str);
+		WriteFile(LogVar->FileHandle, str, len, &wrote, NULL);
+		LogVar->ByteCount =
+			LogVar->ByteCount + len;
+		if (FLogDlg!=NULL)
+			FLogDlg->RefreshNum();
+	}
+}
+
+void FLogInfo(char *param_ptr, size_t param_len)
+{
+	if (LogVar) {
+		param_ptr[0] = '0'
+			+ (ts.LogBinary != 0)
+			+ ((ts.Append != 0) << 1)
+			+ ((ts.LogTypePlainText != 0) << 2)
+			+ ((ts.LogTimestamp != 0) << 3)
+			+ ((ts.LogHideDialog != 0) << 4);
+		strncpy_s(param_ptr + 1, param_len - 1, LogVar->FullName, _TRUNCATE);
+	}
+	else {
+		param_ptr[0] = '0' - 1;
+		param_ptr[1] = 0;
+	}
+}
+
+/**
+ *	\x8C\xBB\x8D݂̃\x8D\x83O\x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x8E擾
+ */
+const char *FLogGetFilename()
+{
+	if (LogVar == NULL) {
+		return NULL;
+	}
+	return LogVar->FullName;
+}
+
+/**
+ *	\x83\x8D\x83O\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8AJ\x82\xAD
+ *	@param[in,out]	info.filename	\x83t\x83@\x83C\x83\x8B\x96\xBC\x8F\x89\x8A\xFA\x92l
+ *									OK\x8E\x9E\x81A\x83t\x83@\x83C\x83\x8B\x96\xBC\x81A\x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7free()\x82\xB7\x82邱\x82\xC6
+ *	@retval	TRUE	[ok] \x82\xAA\x89\x9F\x82\xB3\x82ꂽ
+ *	@retval	FALSE	\x83L\x83\x83\x83\x93\x83Z\x83\x8B\x82\xB3\x82ꂽ
+ */
+BOOL FLogOpenDialog(HINSTANCE hInst, HWND hWnd, FLogDlgInfo_t *info)
+{
+	LogDlgWork_t *work = (LogDlgWork_t *)calloc(sizeof(LogDlgWork_t), 1);
+	char *filenameA = ToCharW(info->filename);
+	char *srcfnameA = FLogGetLogFilename(filenameA);
+	wchar_t *srcfnameW = ToWcharA(srcfnameA);
+	free(filenameA);
+	free(srcfnameA);
+	work->info = info;
+	work->info->filename = srcfnameW;
+	work->pts = &ts;
+	INT_PTR ret = TTDialogBoxParam(
+		hInst, MAKEINTRESOURCE(IDD_LOGDLG),
+		hWnd, LogFnHook, (LPARAM)work);
+	free(srcfnameW);
+	free(work);
+	return ret == IDOK ? TRUE : FALSE;
+}
+
+/**
+ *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x8E擾
+ *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x96\xBC\x97p\x82̏C\x8F\xFC\x82\xF0\x8Ds\x82\xA4
+ *	- strftime() \x82Ɠ\xAF\x82\xB6\x93\xFA\x95t\x93W\x8AJ
+ *	- \x90ݒ肳\x82ꂽ\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x83t\x83H\x83\x8B\x83_\x82\xF0\x92lj\xC1
+ *	- \x83z\x83X\x83g\x96\xBC,\x83|\x81[\x83g\x94ԍ\x86\x93W\x8AJ
+ *
+ *	@param[in]	log_filename	\x83t\x83@\x83C\x83\x8B\x96\xBC(\x91\x8A\x91\xCE/\x90\xE2\x91΂ǂ\xBF\x82\xE7\x82ł\xE0ok)
+ *								NULL\x82̏ꍇ\x83f\x83t\x83H\x83\x8B\x83g\x83t\x83@\x83C\x83\x8B\x96\xBC\x82ƂȂ\xE9
+ *								strftime\x8C`\x8E\xAEok
+ *	@return						\x83t\x83\x8B\x83p\x83X\x83t\x83@\x83C\x83\x8B\x96\xBC
+ *								\x95s\x97v\x82ɂȂ\xC1\x82\xBD\x82\xE7 free() \x82\xB7\x82邱\x82\xC6
+ */
+char *FLogGetLogFilename(const char *log_filename)
+{
+	// \x83t\x83H\x83\x8B\x83_
+	char FileDirExpanded[MAX_PATH];
+	char *logdir;
+	if (strlen(ts.LogDefaultPath) > 0) {
+		logdir = ts.LogDefaultPath;
+	}
+	else if (strlen(ts.FileDir) > 0) {
+		ExpandEnvironmentStrings(ts.FileDir, FileDirExpanded, sizeof(FileDirExpanded));
+		logdir = FileDirExpanded;
+	}
+	else {
+		logdir = ts.HomeDir;
+	}
+
+	// \x8C\xB3\x82ƂȂ\xE9\x83t\x83@\x83C\x83\x8B\x96\xBC
+	char base_name[MAX_PATH];
+	if (log_filename == NULL) {
+		strncpy_s(base_name, _countof(base_name), ts.LogDefaultName, _TRUNCATE);
+	}
+	else {
+		strncpy_s(base_name, _countof(base_name), log_filename, _TRUNCATE);
+	}
+
+	// \x83t\x83\x8B\x83p\x83X\x89\xBB
+	char full_path[MAX_PATH];
+	ConvFName(logdir, base_name, sizeof(base_name), "", full_path, sizeof(full_path));
+	ParseStrftimeFileName(full_path, sizeof(full_path));
+	ConvertLogname(full_path, sizeof(full_path));
+
+	return _strdup(full_path);
+}
+
+BOOL FLogIsPause()
+{
+	return ((cv.FilePause & OpLog) !=0);
+}
+
+void FLogWindow(int nCmdShow)
+{
+	if (FLogDlg == NULL)
+		return;
+
+	HWND HWndLog = FLogDlg->m_hWnd;
+	ShowWindow(HWndLog, nCmdShow);
+	if (nCmdShow == SW_RESTORE) {
+		// \x8Ag\x92\xA3\x83X\x83^\x83C\x83\x8B WS_EX_NOACTIVATE \x8F\xF3\x91Ԃ\xF0\x89\xF0\x8F\x9C\x82\xB7\x82\xE9
+		SetForegroundWindow(HWndLog);
+	}
+}
+
+void FLogShowDlg(void)
+{
+	ShowFTDlg(OpLog);
+}

Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj
===================================================================
--- trunk/teraterm/teraterm/ttermpro.v16.vcxproj	2020-08-18 15:10:13 UTC (rev 8893)
+++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj	2020-08-18 15:27:29 UTC (rev 8894)
@@ -145,6 +145,7 @@
     <ClCompile Include="commlib.c" />
     <ClCompile Include="dnddlg.cpp" />
     <ClCompile Include="filesys.cpp" />
+    <ClCompile Include="filesys_log.cpp" />
     <ClCompile Include="font_pp.cpp" />
     <ClCompile Include="ftdlg.cpp" />
     <ClCompile Include="keyboard.c" />

Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters
===================================================================
--- trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters	2020-08-18 15:10:13 UTC (rev 8893)
+++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters	2020-08-18 15:27:29 UTC (rev 8894)
@@ -147,6 +147,9 @@
     <ClCompile Include="broadcast.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="filesys_log.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <Image Include="..\..\cygterm\cygterm.ico">

Modified: trunk/teraterm/teraterm/ttermpro.v8.vcproj
===================================================================
--- trunk/teraterm/teraterm/ttermpro.v8.vcproj	2020-08-18 15:10:13 UTC (rev 8893)
+++ trunk/teraterm/teraterm/ttermpro.v8.vcproj	2020-08-18 15:27:29 UTC (rev 8894)
@@ -217,6 +217,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\filesys_log.cpp"
+				>
+			</File>
+			<File
 				RelativePath="..\susie_plugin\libsusieplugin.cpp"
 				>
 			</File>


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