[Ttssh2-commit] [7337] 文字列変数の内容がutf8化するのでその対応

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2018年 12月 18日 (火) 23:47:23 JST


Revision: 7337
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/7337
Author:   zmatsuo
Date:     2018-12-18 23:47:23 +0900 (Tue, 18 Dec 2018)
Log Message:
-----------
文字列変数の内容がutf8化するのでその対応
ttl.cをttl.cppに変更

Modified Paths:
--------------
    branches/cmake/teraterm/ttpmacro/CMakeLists.txt

Added Paths:
-----------
    branches/cmake/teraterm/ttpmacro/ttl.cpp

Removed Paths:
-------------
    branches/cmake/teraterm/ttpmacro/ttl.c

-------------- next part --------------
Modified: branches/cmake/teraterm/ttpmacro/CMakeLists.txt
===================================================================
--- branches/cmake/teraterm/ttpmacro/CMakeLists.txt	2018-12-18 14:47:12 UTC (rev 7336)
+++ branches/cmake/teraterm/ttpmacro/CMakeLists.txt	2018-12-18 14:47:23 UTC (rev 7337)
@@ -48,7 +48,6 @@
   )
 
 set(SRC
-  #
   ttm_res.h
   errdlg.cpp
   errdlg.h
@@ -60,7 +59,7 @@
   msgdlg.h
   statdlg.cpp
   statdlg.h
-  ttl.c
+  ttl.cpp
   ttl.h
   ttl_gui.cpp
   ttm_res.h

Deleted: branches/cmake/teraterm/ttpmacro/ttl.c
===================================================================
--- branches/cmake/teraterm/ttpmacro/ttl.c	2018-12-18 14:47:12 UTC (rev 7336)
+++ branches/cmake/teraterm/ttpmacro/ttl.c	2018-12-18 14:47:23 UTC (rev 7337)
@@ -1,6604 +0,0 @@
-/*
- * Copyright (C) 1994-1998 T. Teranishi
- * (C) 2005-2018 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.
- */
-
-/* TTMACRO.EXE, Tera Term Language interpreter */
-
-#undef UNICODE
-#undef _UNICODE
-
-#include "teraterm.h"
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <mbstring.h>
-#include <time.h>
-#include <errno.h>
-#include "tt-version.h"
-#include "ttmdlg.h"
-#include "ttmbuff.h"
-#include "ttmparse.h"
-#include "ttmdde.h"
-#include "ttmlib.h"
-#include "ttlib.h"
-#include "ttmenc.h"
-#include "tttypes.h"
-#include "ttmonig.h"
-#include <shellapi.h>
-#include <sys/stat.h>
-#include <io.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <share.h>
-
-// for _findXXXX() functions
-#include <io.h>
-
-// for _ismbblead
-#include <mbctype.h>
-
-#include "ttl.h"
-#include "SFMT.h"
-
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#include <iptypes.h>
-#include <iphlpapi.h>
-#include "win16api.h"
-#include "ttl_gui.h"
-#include "codeconv.h"
-
-#define TTERMCOMMAND "TTERMPRO /D="
-#define CYGTERMCOMMAND "cyglaunch -o /D="
-
-// for 'ExecCmnd' command
-static BOOL ParseAgain;
-static int IfNest;
-static int ElseFlag;
-static int EndIfFlag;
-// Window handle of the main window
-static HWND HMainWin;
-// Timeout
-static DWORD TimeLimit;
-static DWORD TimeStart;
-// for 'WaitEvent' command
-static int WakeupCondition;
-
-// exit code of TTMACRO
-int ExitCode = 0;
-
-// for "FindXXXX" commands
-#define NumDirHandle 8
-static intptr_t DirHandle[NumDirHandle] = {-1,-1, -1, -1, -1, -1, -1, -1};
-/* for "FileMarkPtr" and "FileSeekBack" commands */
-#define NumFHandle 16
-static HANDLE FHandle[NumFHandle];
-static long FPointer[NumFHandle];
-
-// forward declaration
-int ExecCmnd();
-
-static void HandleInit()
-{
-	int i;
-	for (i=0; i<_countof(FHandle); i++) {
-		FHandle[i] = INVALID_HANDLE_VALUE;
-	}
-}
-
-/**
- *	@retval	ファイルハンドルインデックス(0~)
- *			-1のときエラー
- */
-static int HandlePut(HANDLE FH)
-{
-	int i;
-	if (FH == INVALID_HANDLE_VALUE) {
-		return -1;
-	}
-	for (i=0; i<_countof(FHandle); i++) {
-		if (FHandle[i] == INVALID_HANDLE_VALUE) {
-			FHandle[i] = FH;
-			FPointer[i] = 0;
-			return i;
-		}
-	}
-	return -1;
-}
-
-static HANDLE HandleGet(int fhi)
-{
-	if (fhi < 0 || _countof(FHandle) < fhi) {
-		return INVALID_HANDLE_VALUE;
-	}
-	return FHandle[fhi];
-}
-
-static void HandleFree(int fhi)
-{
-	FHandle[fhi] = INVALID_HANDLE_VALUE;
-}
-
-BOOL InitTTL(HWND HWin)
-{
-	int i;
-	TStrVal Dir;
-	TVarId ParamsVarId;
-	char tmpname[10];
-	WORD Err;
-
-	HMainWin = HWin;
-
-	if (! InitVar()) return FALSE;
-	LockVar();
-
-	// System variables
-	NewIntVar("result",0);
-	NewIntVar("timeout",0);
-	NewIntVar("mtimeout",0);    // ミリ秒単位のタイムアウト用 (2009.1.23 maya)
-	NewStrVar("inputstr","");
-	NewStrVar("matchstr","");   // for 'waitregex' command (2005.10.7 yutaka)
-	NewStrVar("groupmatchstr1","");   // for 'waitregex' command (2005.10.15 yutaka)
-	NewStrVar("groupmatchstr2","");   // for 'waitregex' command (2005.10.15 yutaka)
-	NewStrVar("groupmatchstr3","");   // for 'waitregex' command (2005.10.15 yutaka)
-	NewStrVar("groupmatchstr4","");   // for 'waitregex' command (2005.10.15 yutaka)
-	NewStrVar("groupmatchstr5","");   // for 'waitregex' command (2005.10.15 yutaka)
-	NewStrVar("groupmatchstr6","");   // for 'waitregex' command (2005.10.15 yutaka)
-	NewStrVar("groupmatchstr7","");   // for 'waitregex' command (2005.10.15 yutaka)
-	NewStrVar("groupmatchstr8","");   // for 'waitregex' command (2005.10.15 yutaka)
-	NewStrVar("groupmatchstr9","");   // for 'waitregex' command (2005.10.15 yutaka)
-
-	if (ParamCnt == 0) {
-		ParamCnt++;
-	}
-	NewIntVar("paramcnt",ParamCnt);  // ファイル名も含む引数の個数 (2012.4.10 yutaka)
-
-	// 旧形式のパラメータ設定 (param1 〜 param9)
-	NewStrVar("param1", ShortName);
-	if (Params) {
-		for (i=2; i<=9; i++) {
-			_snprintf_s(tmpname, sizeof(tmpname), _TRUNCATE, "param%d", i);
-			if (ParamCnt >= i && Params[i] != NULL) {
-				NewStrVar(tmpname, Params[i]);
-			}
-			else {
-				NewStrVar(tmpname, "");
-			}
-		}
-	}
-
-	// 新形式のパラメータ設定 (params[1〜ParamCnt])
-	if (NewStrAryVar("params", ParamCnt+1) == 0) {
-		Err = 0;
-		GetStrAryVarByName(&ParamsVarId, "params", &Err);
-		if (Err == 0) {
-			if (ShortName[0] != 0) {
-				SetStrValInArray(ParamsVarId, 1, ShortName, &Err);
-			}
-			if (Params) {
-				for (i=0; i<=ParamCnt; i++) {
-					if (i == 1) {
-						continue;
-					}
-					if (Params[i]) {
-						SetStrValInArray(ParamsVarId, i, Params[i], &Err);
-						free(Params[i]);
-					}
-				}
-				free(Params);
-				Params = NULL;
-			}
-		}
-	}
-
-	ParseAgain = FALSE;
-	IfNest = 0;
-	ElseFlag = 0;
-	EndIfFlag = 0;
-
-	for (i=0; i<NumDirHandle; i++)
-		DirHandle[i] = -1L;
-	HandleInit();
-
-	if (! InitBuff(FileName))
-	{
-		TTLStatus = IdTTLEnd;
-		return FALSE;
-	}
-
-	UnlockVar();
-
-	ExtractDirName(FileName,Dir);
-	TTMSetDir(Dir);
-
-	if (SleepFlag)
-	{ // synchronization for startup macro
-		// sleep until Tera Term is ready
-		WakeupCondition = IdWakeupInit;
-		// WakeupCondition = IdWakeupConnect | IdWakeupDisconn | IdWakeupUnlink;
-		TTLStatus = IdTTLSleep;
-	}
-	else
-		TTLStatus = IdTTLRun;
-
-	return TRUE;
-}
-
-void EndTTL()
-{
-	int i;
-
-	CloseStatDlg();
-
-	for (i=0; i<NumDirHandle; i++)
-	{
-		if (DirHandle[i]!=-1L)
-			_findclose(DirHandle[i]);
-		DirHandle[i] = -1L;
-	}
-
-	UnlockVar();
-	if (TTLStatus==IdTTLWait)
-		KillTimer(HMainWin,IdTimeOutTimer);
-	CloseBuff(0);
-	EndVar();
-}
-
-long int CalcTime()
-{
-	time_t time1;
-	struct tm *ptm;
-
-	time1 = time(NULL);
-	ptm = localtime(&time1);
-	return ((long int)ptm->tm_hour * 3600 +
-	        (long int)ptm->tm_min * 60 +
-	        (long int)ptm->tm_sec
-	       );
-}
-
-//////////////// Beginning of TTL commands //////////////
-WORD TTLCommCmd(char Cmd, int Wait)
-{
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-	else if (! Linked)
-		return ErrLinkFirst;
-	else
-		return SendCmnd(Cmd,Wait);
-}
-
-WORD TTLCommCmdFile(char Cmd, int Wait)
-{
-	TStrVal Str;
-	WORD Err;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-
-	if ((Err==0) &&
-	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err==0)
-	{
-		SetFile(Str);
-		Err = SendCmnd(Cmd,Wait);
-	}
-	return Err;
-}
-
-WORD TTLCommCmdBin(char Cmd, int Wait)
-{
-	int Val;
-	WORD Err;
-
-	Err = 0;
-	GetIntVal(&Val,&Err);
-
-	if ((Err==0) &&
-	    (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err==0)
-	{
-		SetBinary(Val);
-		Err = SendCmnd(Cmd,Wait);
-	}
-	return Err;
-}
-
-
-WORD TTLCommCmdDeb()
-{
-	int Val;
-	WORD Err;
-
-	Err = 0;
-	GetIntVal(&Val,&Err);
-
-	if ((Err==0) &&
-	    (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err==0)
-	{
-		SetDebug(Val);
-	}
-	return Err;
-}
-
-WORD TTLCommCmdInt(char Cmd, int Wait)
-{
-	int Val;
-	char Str[21];
-	WORD Err;
-
-	Err = 0;
-	GetIntVal(&Val,&Err);
-
-	if ((Err==0) &&
-	    (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err==0)
-	{
-		_snprintf_s(Str,sizeof(Str),_TRUNCATE,"%d",Val);
-		SetFile(Str);
-		Err = SendCmnd(Cmd,Wait);
-	}
-	return Err;
-}
-
-WORD TTLBeep()
-{
-	int val = 0;
-	WORD Err = 0;
-	UINT type = MB_OK;
-
-	if (CheckParameterGiven()) {
-		GetIntVal(&val, &Err);
-		if (Err!=0) return Err;
-
-		switch (val) {
-		case 0:
-			type = -1;
-			break;
-		case 1:
-			type = MB_ICONASTERISK;
-			break;
-		case 2:
-			type = MB_ICONEXCLAMATION;
-			break;
-		case 3:
-			type = MB_ICONHAND;
-			break;
-		case 4:
-			type = MB_ICONQUESTION;
-			break;
-		case 5:
-			type = MB_OK;
-			break;
-		default:
-			return ErrSyntax;
-			break;
-		}
-	}
-
-	MessageBeep(type);
-
-	return 0;
-}
-
-WORD TTLBreak(WORD WId) {
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-
-	return BreakLoop(WId);
-}
-
-WORD TTLBringupBox()
-{
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-	BringupStatDlg();
-	return 0;
-}
-
-WORD TTLCall()
-{
-	TName LabName;
-	WORD Err, VarType;
-	TVarId VarId;
-
-	if (GetLabelName(LabName) && (GetFirstChar()==0)) {
-		if (CheckVar(LabName, &VarType, &VarId) && (VarType==TypLabel))
-			Err = CallToLabel(VarId);
-		else
-			Err = ErrLabelReq;
-	}
-	else
-	Err = ErrSyntax;
-
-	return Err;
-}
-
-#if 0
-// add 'clipb2var' (2006.9.17 maya)
-WORD TTLClipb2Var()
-{
-	WORD Err;
-	TVarId VarId;
-	HANDLE hText;
-	PTSTR clipbText;
-	char buf[MaxStrLen];
-	int Num = 0;
-	char *newbuff;
-	static char *cbbuff;
-	static int cbbuffsize, cblen;
-	HANDLE wide_hText;
-	LPWSTR wide_buf;
-	int mb_len;
-	UINT Cf;
-
-	Err = 0;
-	GetStrVar(&VarId, &Err);
-	if (Err!=0) return Err;
-
-	// get 2nd arg(optional) if given
-	if (CheckParameterGiven()) {
-		GetIntVal(&Num, &Err);
-	}
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (Num == 0) {
-		if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
-			Cf = CF_UNICODETEXT;
-		}
-		else if (IsClipboardFormatAvailable(CF_TEXT)) {
-			Cf = CF_TEXT;
-		}
-		else {
-			cblen = 0;
-			SetResult(0);
-			return Err;
-		}
-		if (OpenClipboard(NULL) == 0) {
-			cblen = 0;
-			SetResult(0);
-			return Err;
-		}
-
-		if (Cf == CF_UNICODETEXT) {
-			wide_hText = GetClipboardData(CF_UNICODETEXT);
-			if (wide_hText != NULL) {
-				wide_buf = GlobalLock(wide_hText);
-				mb_len = WideCharToMultiByte(CP_ACP, 0, wide_buf, -1, NULL, 0, NULL, NULL);
-				hText = GlobalAlloc(GMEM_MOVEABLE, sizeof(CHAR) * mb_len);
-				clipbText = GlobalLock(hText);
-				if (hText != NULL) {
-					WideCharToMultiByte(CP_ACP, 0, wide_buf, -1, clipbText, mb_len, NULL, NULL);
-
-					cblen = strlen(clipbText);
-					if (cbbuffsize <= cblen) {
-						if ((newbuff = realloc(cbbuff, cblen + 1)) == NULL) {
-							// realloc failed. fall back to old mode.
-							cblen = 0;
-							strncpy_s(buf,sizeof(buf),clipbText,_TRUNCATE);
-							GlobalUnlock(hText);
-							CloseClipboard();
-							SetStrVal(VarId, buf);
-							SetResult(3);
-							return Err;
-						}
-						cbbuff = newbuff;
-						cbbuffsize = cblen + 1;
-					}
-					strncpy_s(cbbuff, cbbuffsize, clipbText, _TRUNCATE);
-
-					GlobalUnlock(hText);
-					GlobalFree(hText);
-				}
-				GlobalUnlock(wide_hText);
-			}
-			else {
-				cblen = 0;
-			}
-		}
-		else if (Cf == CF_TEXT) {
-			hText = GetClipboardData(CF_TEXT);
-			if (hText != NULL) {
-				clipbText = GlobalLock(hText);
-				cblen = strlen(clipbText);
-				if (cbbuffsize <= cblen) {
-					if ((newbuff = realloc(cbbuff, cblen + 1)) == NULL) {
-						// realloc failed. fall back to old mode.
-						cblen = 0;
-						strncpy_s(buf,sizeof(buf),clipbText,_TRUNCATE);
-						GlobalUnlock(hText);
-						CloseClipboard();
-						SetStrVal(VarId, buf);
-						SetResult(3);
-						return Err;
-					}
-					cbbuff = newbuff;
-					cbbuffsize = cblen + 1;
-				}
-				strncpy_s(cbbuff, cbbuffsize, clipbText, _TRUNCATE);
-				GlobalUnlock(hText);
-			}
-			else {
-				cblen = 0;
-			}
-		}
-		CloseClipboard();
-	}
-
-	if (cbbuff != NULL && Num >= 0 && Num * (MaxStrLen - 1) < cblen) {
-		if (strncpy_s(buf ,sizeof(buf), cbbuff + Num * (MaxStrLen-1), _TRUNCATE) == STRUNCATE)
-			SetResult(2); // Copied string is truncated.
-		else {
-			SetResult(1);
-		}
-		SetStrVal(VarId, buf);
-	}
-	else {
-		SetResult(0);
-	}
-
-	return Err;
-}
-#endif
-
-#if 0
-// add 'var2clipb' (2006.9.17 maya)
-WORD TTLVar2Clipb()
-{
-	WORD Err;
-	TStrVal Str;
-	HGLOBAL hText;
-	PTSTR clipbText;
-	int wide_len;
-	HGLOBAL wide_hText;
-	LPWSTR wide_buf;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	if (Err!=0) return Err;
-
-	hText = GlobalAlloc(GHND, sizeof(Str));
-	clipbText = GlobalLock(hText);
-	strncpy_s(clipbText, sizeof(Str), Str, _TRUNCATE);
-	GlobalUnlock(hText);
-
-	wide_len = MultiByteToWideChar(CP_ACP, 0, clipbText, -1, NULL, 0);
-	wide_hText = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * wide_len);
-	if (wide_hText) {
-		wide_buf = (LPWSTR)GlobalLock(wide_hText);
-		MultiByteToWideChar(CP_ACP, 0, clipbText, -1, wide_buf, wide_len);
-		GlobalUnlock(wide_hText);
-	}
-
-	if (OpenClipboard(NULL) == 0) {
-		SetResult(0);
-	}
-	else {
-		EmptyClipboard();
-		SetClipboardData(CF_TEXT, hText);
-
-		if (wide_buf) {
-			SetClipboardData(CF_UNICODETEXT, wide_hText);
-		}
-
-		CloseClipboard();
-		SetResult(1);
-	}
-
-	return Err;
-}
-#endif
-
-WORD TTLCloseSBox()
-{
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-	CloseStatDlg();
-	return 0;
-}
-
-WORD TTLCloseTT()
-{
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-
-	if (! Linked)
-		return ErrLinkFirst;
-	else {
-		// Close Tera Term
-		SendCmnd(CmdCloseWin,IdTTLWaitCmndEnd);
-		EndDDE();
-		return 0;
-	}
-}
-
-WORD TTLCode2Str()
-{
-	TVarId VarId;
-	WORD Err;
-	int Num, Len, c, i;
-	BYTE d;
-	TStrVal Str;
-
-	Err = 0;
-	GetStrVar(&VarId, &Err);
-
-	GetIntVal(&Num,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	Len = sizeof(Num);
-	i = 0;
-	for (c=0; c<=Len-1; c++)
-	{
-		d = (Num >> ((Len-1-c)*8)) & 0xff;
-		if ((i>0) || (d!=0))
-		{
-			Str[i] = d;
-			i++;
-		}
-	}
-	Str[i] = 0;
-	SetStrVal(VarId, Str);
-	return Err;
-}
-
-WORD TTLConnect(WORD mode)
-{
-	TStrVal Cmnd, Str;
-	WORD Err;
-	WORD w;
-
-	Str[0] = 0;
-	Err = 0;
-
-	if (mode == RsvConnect || CheckParameterGiven()) {
-		GetStrVal(Str,&Err);
-		if (Err!=0) return Err;
-	}
-
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-
-	if (Linked)
-	{
-		if (ComReady!=0)
-		{
-			SetResult(2);
-			return Err;
-		}
-
-		if (mode == RsvConnect) {
-			// new connection
-			SetFile(Str);
-			SendCmnd(CmdConnect,0);
-
-			WakeupCondition = IdWakeupInit;
-			TTLStatus = IdTTLSleep;
-			return Err;
-		}
-		else {	// cygwin connection
-			TTLCloseTT();
-		}
-	}
-
-	SetResult(0);
-	// link to Tera Term
-	if (strlen(TopicName)==0)
-	{
-		switch (mode) {
-		case RsvConnect:
-			strncpy_s(Cmnd, sizeof(Cmnd),TTERMCOMMAND, _TRUNCATE);
-			break;
-		case RsvCygConnect:
-			strncpy_s(Cmnd, sizeof(Cmnd),CYGTERMCOMMAND, _TRUNCATE);
-			break;
-		}
-		w = HIWORD(HMainWin);
-		Word2HexStr(w,TopicName);
-		w = LOWORD(HMainWin);
-		Word2HexStr(w,&(TopicName[4]));
-		strncat_s(Cmnd,sizeof(Cmnd),TopicName,_TRUNCATE);
-		strncat_s(Cmnd,sizeof(Cmnd)," ",_TRUNCATE);
-		strncat_s(Cmnd,sizeof(Cmnd),Str,_TRUNCATE);
-		if (WinExec(Cmnd,SW_SHOW)<32)
-			return ErrCantConnect;
-		TTLStatus = IdTTLInitDDE;
-	}
-	return Err;
-}
-
-
-/*
- * cf. http://oku.edu.mie-u.ac.jp/~okumura/algo/
- */
-
-enum checksum_type {
-	CHECKSUM8,
-	CHECKSUM16,
-	CHECKSUM32,
-	CRC16,
-	CRC32
-};
-
-static unsigned int checksum32(int n, unsigned char c[])
-{
-	unsigned long value = 0;
-	int i;
-
-	for (i = 0; i < n; i++) {
-		value += (c[i] & 0xFF);
-	}
-	return (value & 0xFFFFFFFF);
-}
-
-static unsigned int checksum16(int n, unsigned char c[])
-{
-	unsigned long value = 0;
-	int i;
-
-	for (i = 0; i < n; i++) {
-		value += (c[i] & 0xFF);
-	}
-	return (value & 0xFFFF);
-}
-
-static unsigned int checksum8(int n, unsigned char c[])
-{
-	unsigned long value = 0;
-	int i;
-
-	for (i = 0; i < n; i++) {
-		value += (c[i] & 0xFF);
-	}
-	return (value & 0xFF);
-}
-
-// CRC-16-CCITT
-static unsigned int crc16(int n, unsigned char c[])
-{
-#define CRC16POLY1  0x1021U  /* x^{16}+x^{12}+x^5+1 */
-#define CRC16POLY2  0x8408U  /* 左右逆転 */
-
-	int i, j;
-	unsigned long r;
-
-	r = 0xFFFFU;
-	for (i = 0; i < n; i++) {
-		r ^= c[i];
-		for (j = 0; j < CHAR_BIT; j++)
-			if (r & 1) r = (r >> 1) ^ CRC16POLY2;
-			else       r >>= 1;
-	}
-	return r ^ 0xFFFFU;
-}
-
-static unsigned long crc32(int n, unsigned char c[])
-{
-#define CRC32POLY1 0x04C11DB7UL
-	/* x^{32}+x^{26}+x^{23}+x^{22}+x^{16}+x^{12}+x^{11]+
-	   x^{10}+x^8+x^7+x^5+x^4+x^2+x^1+1 */
-#define CRC32POLY2 0xEDB88320UL  /* 左右逆転 */
-	int i, j;
-	unsigned long r;
-
-	r = 0xFFFFFFFFUL;
-	for (i = 0; i < n; i++) {
-		r ^= c[i];
-		for (j = 0; j < CHAR_BIT; j++)
-			if (r & 1) r = (r >> 1) ^ CRC32POLY2;
-			else       r >>= 1;
-	}
-	return r ^ 0xFFFFFFFFUL;
-}
-
-// チェックサムアルゴリズム・共通ルーチン
-WORD TTLDoChecksum(enum checksum_type type)
-{
-	TStrVal Str;
-	WORD Err;
-	TVarId VarId;
-	DWORD cksum;
-
-	Err = 0;
-	GetIntVar(&VarId, &Err);
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	if (Str[0]==0) return Err;
-
-	switch (type) {
-		case CHECKSUM8:
-			cksum = checksum8(strlen(Str), Str);
-			break;
-		case CHECKSUM16:
-			cksum = checksum16(strlen(Str), Str);
-			break;
-		case CHECKSUM32:
-			cksum = checksum32(strlen(Str), Str);
-			break;
-		case CRC16:
-			cksum = crc16(strlen(Str), Str);
-			break;
-		case CRC32:
-			cksum = crc32(strlen(Str), Str);
-			break;
-		default:
-			cksum = 0;
-			break;
-	}
-
-	SetIntVal(VarId, cksum);
-
-	return Err;
-}
-
-WORD TTLDoChecksumFile(enum checksum_type type)
-{
-	TStrVal Str;
-	int result = 0;
-	WORD Err;
-	TVarId VarId;
-	HANDLE fh = INVALID_HANDLE_VALUE, hMap = NULL;
-	LPBYTE lpBuf = NULL;
-	DWORD fsize;
-	DWORD cksum;
-
-	Err = 0;
-	GetIntVar(&VarId, &Err);
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	if (Str[0]==0) return Err;
-
-	fh = CreateFile(Str,GENERIC_READ,0,NULL,OPEN_EXISTING,
-		FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */
-	if (fh == INVALID_HANDLE_VALUE) {
-		result = -1;
-		goto error;
-	}
-	/* ファイルマッピングオブジェクト作成 */
-	hMap = CreateFileMapping(fh,NULL,PAGE_READONLY,0,0,NULL);
-	if (hMap == NULL) {
-		result = -1;
-		goto error;
-	}
-
-	/* ファイルをマップし、先頭アドレスをlpBufに取得 */
-	lpBuf = (LPBYTE)MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
-	if (lpBuf == NULL) {
-		result = -1;
-		goto error;
-	}
-
-	fsize = GetFileSize(fh,NULL);
-
-	switch (type) {
-		case CHECKSUM8:
-			cksum = checksum8(fsize, lpBuf);
-			break;
-		case CHECKSUM16:
-			cksum = checksum16(fsize, lpBuf);
-			break;
-		case CHECKSUM32:
-			cksum = checksum32(fsize, lpBuf);
-			break;
-		case CRC16:
-			cksum = crc16(fsize, lpBuf);
-			break;
-		case CRC32:
-			cksum = crc32(fsize, lpBuf);
-			break;
-		default:
-			cksum = 0;
-			break;
-	}
-
-	SetIntVal(VarId, cksum);
-
-error:
-	if (lpBuf != NULL) {
-		UnmapViewOfFile(lpBuf);
-	}
-
-	if (hMap != NULL) {
-		CloseHandle(hMap);
-	}
-	if (fh != INVALID_HANDLE_VALUE) {
-		CloseHandle(fh);
-	}
-
-	SetResult(result);
-
-	return Err;
-}
-
-WORD TTLDelPassword()
-{
-	TStrVal Str, Str2;
-	WORD Err;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	GetStrVal(Str2,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	if (Str[0]==0) return Err;
-
-	GetAbsPath(Str,sizeof(Str));
-	if (! DoesFileExist(Str)) return Err;
-	if (Str2[0]==0) // delete all password
-		WritePrivateProfileString("Password",NULL,NULL,Str);
-	else            // delete password specified by Str2
-		WritePrivateProfileString("Password",Str2,NULL,Str);
-	return Err;
-}
-
-WORD TTLDim(WORD type)
-{
-	WORD Err, WordId, VarType;
-	TName Name;
-	TVarId VarId;
-	int size;
-
-	Err = 0;
-
-	if (! GetIdentifier(Name)) return ErrSyntax;
-	if (CheckReservedWord(Name, &WordId)) return ErrSyntax;
-	if (CheckVar(Name, &VarType, &VarId)) return ErrSyntax;
-
-	GetIntVal(&size, &Err);
-	if (Err!=0) return Err;
-
-	if (type == RsvIntDim) {
-		Err = NewIntAryVar(Name, size);
-	}
-	else { // type == RsvStrDim
-		Err = NewStrAryVar(Name, size);
-	}
-	return Err;
-}
-
-WORD TTLDisconnect()
-{
-	WORD Err;
-	int Val = 1;
-	char Str[21];
-
-	Err = 0;
-	// get 1rd arg(optional) if given
-	if (CheckParameterGiven()) {
-		GetIntVal(&Val, &Err);
-	}
-
-	if ((Err==0) &&
-	    (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err==0)
-	{
-		_snprintf_s(Str,sizeof(Str),_TRUNCATE,"%d",Val);
-		SetFile(Str);
-		Err = SendCmnd(CmdDisconnect,0);
-	}
-	return Err;
-}
-
-WORD TTLDispStr()
-{
-	TStrVal Str, buff;
-	WORD Err, ValType;
-	int Val;
-
-	if (! Linked)
-		return ErrLinkFirst;
-
-	buff[0] = 0;
-
-	while (TRUE) {
-		if (GetString(Str, &Err)) {
-			if (Err) return Err;
-			strncat_s(buff, MaxStrLen, Str, _TRUNCATE);
-		}
-		else if (GetExpression(&ValType, &Val, &Err)) {
-			if (Err!=0) return Err;
-			switch (ValType) {
-				case TypInteger:
-					Str[0] = LOBYTE(Val);
-					Str[1] = 0;
-					strncat_s(buff, MaxStrLen, Str, _TRUNCATE);
-				case TypString:
-					strncat_s(buff, MaxStrLen, StrVarPtr((TVarId)Val), _TRUNCATE);
-					break;
-				default:
-					return ErrTypeMismatch;
-			}
-		}
-		else {
-			break;
-		}
-	}
-	SetFile(buff);
-	return SendCmnd(CmdDispStr, 0);
-}
-
-WORD TTLDo()
-{
-	WORD WId, Err;
-	int Val = 1;
-
-	Err = 0;
-	if (CheckParameterGiven()) {
-		if (GetReservedWord(&WId)) {
-			switch (WId) {
-				case RsvWhile:
-					GetIntVal(&Val,&Err);
-					break;
-				case RsvUntil:
-					GetIntVal(&Val,&Err);
-					Val = Val == 0;
-					break;
-				default:
-					Err = ErrSyntax;
-			}
-			if ((Err==0) && (GetFirstChar()!=0))
-				Err = ErrSyntax;
-		}
-		else {
-			Err = ErrSyntax;
-		}
-	}
-
-	if (Err!=0) return Err;
-
-	if (Val!=0)
-		return SetWhileLoop();
-	else
-		EndWhileLoop();
-	return Err;
-}
-
-WORD TTLElse()
-{
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-
-	if (IfNest<1)
-		return ErrInvalidCtl;
-
-	// Skip until 'EndIf'
-	IfNest--;
-	EndIfFlag = 1;
-	return 0;
-}
-
-int CheckElseIf(LPWORD Err)
-{
-	int Val;
-	WORD WId;
-
-	*Err = 0;
-	GetIntVal(&Val,Err);
-	if (*Err!=0) return 0;
-	if (! GetReservedWord(&WId) ||
-	    (WId!=RsvThen) ||
-	    (GetFirstChar()!=0))
-		*Err = ErrSyntax;
-	return Val;
-}
-
-WORD TTLElseIf()
-{
-	WORD Err;
-	int Val;
-
-	Val = CheckElseIf(&Err);
-	if (Err!=0) return Err;
-
-	if (IfNest<1)
-		return ErrInvalidCtl;
-
-	// Skip until 'EndIf'
-	IfNest--;
-	EndIfFlag = 1;
-	return Err;
-}
-
-WORD TTLEnd()
-{
-	if (GetFirstChar()==0)
-	{
-		TTLStatus = IdTTLEnd;
-		return 0;
-	}
-	else
-		return ErrSyntax;
-}
-
-WORD TTLEndIf()
-{
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-
-	if (IfNest<1)
-		return ErrInvalidCtl;
-
-	IfNest--;
-	return 0;
-}
-
-WORD TTLEndWhile(BOOL mode)
-{
-	WORD Err;
-	int Val = mode;
-
-	Err = 0;
-	if (CheckParameterGiven()) {
-		GetIntVal(&Val,&Err);
-	}
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	return BackToWhile((Val!=0) == mode);
-}
-
-WORD TTLExec()
-{
-	TStrVal Str,Str2, CurDir;
-	int mode = SW_SHOW;
-	int wait = 0, ret;
-	WORD Err;
-	STARTUPINFO sui;
-	PROCESS_INFORMATION pi;
-	BOOL bRet;
-
-	memset(CurDir, 0, sizeof(CurDir));
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-
-	if (CheckParameterGiven()) {
-		GetStrVal(Str2, &Err);
-		if (Err!=0) return Err;
-
-		if (_stricmp(Str2, "hide") == 0)
-			mode = SW_HIDE;
-		else if (_stricmp(Str2, "minimize") == 0)
-			mode = SW_MINIMIZE;
-		else if (_stricmp(Str2, "maximize") == 0)
-			mode = SW_MAXIMIZE;
-		else if (_stricmp(Str2, "show") == 0)
-			mode = SW_SHOW;
-		else
-			Err = ErrSyntax;
-
-		// get 3nd arg(optional) if given
-		if (CheckParameterGiven()) {
-			GetIntVal(&wait, &Err);
-			if (Err!=0) return Err;
-
-			// get 4th arg(optional) if given
-			if (CheckParameterGiven()) {
-				GetStrVal(CurDir, &Err);
-				if (Err!=0) return Err;
-			}
-		}
-	}
-
-	if ((Err==0) &&
-	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-
-	if (Err!=0) return Err;
-
-	memset(&sui, 0, sizeof(STARTUPINFO));
-	sui.cb = sizeof(STARTUPINFO);
-	sui.wShowWindow = mode;
-	sui.dwFlags = STARTF_USESHOWWINDOW;
-	if (CurDir[0] == 0)
-		bRet = CreateProcess(NULL, Str, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &sui, &pi);
-	else
-		bRet = CreateProcess(NULL, Str, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, CurDir, &sui, &pi);
-	// TODO: check bRet
-	if (wait) {
-		WaitForSingleObject(pi.hProcess, INFINITE);
-		GetExitCodeProcess(pi.hProcess, &ret);
-		SetResult(ret);
-	}
-	return Err;
-}
-
-WORD TTLExecCmnd()
-{
-	WORD Err;
-	TStrVal NextLine;
-	BYTE b;
-
-	Err = 0;
-	GetStrVal(NextLine,&Err);
-	if (Err!=0) return Err;
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-
-	strncpy_s(LineBuff, sizeof(LineBuff),NextLine, _TRUNCATE);
-	LineLen = (WORD)strlen(LineBuff);
-	LinePtr = 0;
-	b = GetFirstChar();
-	LinePtr--;
-	ParseAgain = (b!=0) && (b!=':') && (b!=';');
-	return Err;
-}
-
-WORD TTLExit()
-{
-	if (GetFirstChar()==0)
-	{
-		if (! ExitBuffer())
-			TTLStatus = IdTTLEnd;
-		return 0;
-	}
-	else
-	return ErrSyntax;
-}
-
-WORD TTLExpandEnv()
-{
-	WORD Err;
-	TVarId VarId;
-	TStrVal deststr, srcptr;
-
-	Err = 0;
-	GetStrVar(&VarId, &Err);
-	if (Err!=0) return Err;
-
-	if (CheckParameterGiven()) { // expandenv strvar strval
-		GetStrVal(srcptr,&Err);
-		if ((Err==0) && (GetFirstChar()!=0))
-			Err = ErrSyntax;
-		if (Err!=0) {
-			return Err;
-		}
-
-		// ファイルパスに環境変数が含まれているならば、展開する。
-		ExpandEnvironmentStrings(srcptr, deststr, MaxStrLen);
-		SetStrVal(VarId, deststr);
-	}
-	else { // expandenv strvar
-		// ファイルパスに環境変数が含まれているならば、展開する。
-		ExpandEnvironmentStrings(StrVarPtr(VarId), deststr, MaxStrLen);
-		SetStrVal(VarId, deststr);
-	}
-
-	return Err;
-}
-
-WORD TTLFileClose()
-{
-	WORD Err;
-	int fhi;	// handle index
-	HANDLE FH;
-
-	Err = 0;
-	GetIntVal(&fhi,&Err);
-	FH = HandleGet(fhi);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	_lclose(FH);
-	HandleFree(fhi);
-	return Err;
-}
-
-WORD TTLFileConcat()
-{
-	WORD Err;
-	HANDLE FH1, FH2;
-	int c;
-	TStrVal FName1, FName2;
-	BYTE buf[1024];
-
-	Err = 0;
-	GetStrVal(FName1,&Err);
-	GetStrVal(FName2,&Err);
-	if ((Err==0) &&
-	    ((strlen(FName1)==0) ||
-	     (strlen(FName2)==0) ||
-	     (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) {
-		SetResult(1);
-		return Err;
-	}
-
-	if (!GetAbsPath(FName1,sizeof(FName1))) {
-		SetResult(-1);
-		return Err;
-	}
-	if (!GetAbsPath(FName2,sizeof(FName2))) {
-		SetResult(-2);
-		return Err;
-	}
-	if (_stricmp(FName1,FName2)==0) {
-		SetResult(2);
-		return Err;
-	}
-
-	FH1 = _lopen(FName1,OF_WRITE);
-	if (FH1 == INVALID_HANDLE_VALUE)
-		FH1 = _lcreat(FName1,0);
-	if (FH1 == INVALID_HANDLE_VALUE) {
-		SetResult(3);
-		return Err;
-	}
-	_llseek(FH1,0,2);
-
-	FH2 = _lopen(FName2,OF_READ);
-	if (FH2 != INVALID_HANDLE_VALUE)
-	{
-		do {
-			c = _lread(FH2,&(buf[0]),sizeof(buf));
-			if (c>0)
-				_lwrite(FH1,&(buf[0]),c);
-		} while (c >= sizeof(buf));
-		_lclose(FH2);
-	}
-	_lclose(FH1);
-
-	SetResult(0);
-	return Err;
-}
-
-WORD TTLFileCopy()
-{
-	WORD Err;
-	TStrVal FName1, FName2;
-
-	Err = 0;
-	GetStrVal(FName1,&Err);
-	GetStrVal(FName2,&Err);
-	if ((Err==0) &&
-	    ((strlen(FName1)==0) ||
-	     (strlen(FName2)==0) ||
-	     (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) {
-		SetResult(1);
-		return Err;
-	}
-
-	if (!GetAbsPath(FName1,sizeof(FName1))) {
-		SetResult(-1);
-		return Err;
-	}
-	if (!GetAbsPath(FName2,sizeof(FName2))) {
-		SetResult(-2);
-		return Err;
-	}
-	if (_stricmp(FName1,FName2)==0) return Err;
-
-	CopyFile(FName1,FName2,FALSE);
-	SetResult(0);
-	return Err;
-}
-
-WORD TTLFileCreate()
-{
-	WORD Err;
-	TVarId VarId;
-	HANDLE FH;
-	int fhi;
-	TStrVal FName;
-
-	Err = 0;
-	GetIntVar(&VarId, &Err);
-	GetStrVal(FName, &Err);
-	if ((Err==0) &&
-	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) {
-		SetResult(1);
-		return Err;
-	}
-
-	if (!GetAbsPath(FName,sizeof(FName))) {
-		SetIntVal(VarId, -1);
-		SetResult(-1);
-		return Err;
-	}
-	FH = _lcreat(FName,0);
-	if (FH == INVALID_HANDLE_VALUE) {
-		SetResult(2);
-	}
-	else {
-		SetResult(0);
-	}
-	fhi = HandlePut(FH);
-	SetIntVal(VarId, fhi);
-	if (fhi == -1) {
-		_lclose(FH);
-	}
-	return Err;
-}
-
-WORD TTLFileDelete()
-{
-	WORD Err;
-	TStrVal FName;
-
-	Err = 0;
-	GetStrVal(FName,&Err);
-	if ((Err==0) &&
-	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) {
-		SetResult(1);
-		return Err;
-	}
-
-	if (!GetAbsPath(FName,sizeof(FName))) {
-		SetResult(-1);
-		return Err;
-	}
-	
-	if (remove(FName) != 0) {
-		SetResult(-1);
-	}
-	else {
-		SetResult(0);
-	}
-
-	return Err;
-}
-
-WORD TTLFileMarkPtr()
-{
-	WORD Err;
-	int fhi;
-	HANDLE FH;
-	LONG pos;
-
-	Err = 0;
-	GetIntVal(&fhi,&Err);
-	FH = HandleGet(fhi);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	pos = _llseek(FH,0,1);	 /* mark current pos */
-	if (pos == INVALID_SET_FILE_POINTER) {
-		pos = 0;	// ?
-	}
-	FPointer[fhi] = pos;
-	return Err;
-}
-
-#if 0
-// add 'filenamebox' (2007.9.13 maya)
-WORD TTLFilenameBox()
-{
-	TStrVal Str1;
-	WORD Err, ValType;
-	TVarId VarId;
-	OPENFILENAME ofn;
-	char uimsg[MAX_UIMSG];
-	BOOL SaveFlag = FALSE;
-	TStrVal InitDir = "";
-	BOOL ret;
-
-	Err = 0;
-	GetStrVal(Str1,&Err);
-	if (Err!=0) return Err;
-
-	// get 2nd arg(optional) if given
-	if (CheckParameterGiven()) { // dialogtype
-		GetIntVal(&SaveFlag, &Err);
-		if (Err!=0) return Err;
-
-		// get 3rd arg(optional) if given
-		if (CheckParameterGiven()) { // initdir
-			GetStrVal(InitDir, &Err);
-			if (Err!=0) return Err;
-		}
-	}
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	SetInputStr("");
-	if (CheckVar("inputstr", &ValType, &VarId) &&
-	    (ValType==TypString)) {
-		memset(&ofn, 0, sizeof(OPENFILENAME));
-		ofn.lStructSize     = sizeof(OPENFILENAME);
-		ofn.hwndOwner       = HMainWin;
-		ofn.lpstrTitle      = Str1;
-		ofn.lpstrFile       = StrVarPtr(VarId);
-		ofn.nMaxFile        = MaxStrLen;
-		get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
-		ofn.lpstrFilter     = uimsg;
-		ofn.lpstrInitialDir = NULL;
-		if (strlen(InitDir) > 0) {
-			ofn.lpstrInitialDir = InitDir;
-		}
-		BringupWindow(HMainWin);
-		if (SaveFlag) {
-			ofn.Flags = OFN_OVERWRITEPROMPT;
-			ret = GetSaveFileName(&ofn);
-		}
-		else {
-			ret = GetOpenFileName(&ofn);
-		}
-		SetResult(ret);
-	}
-	return Err;
-}
-#endif
-
-WORD TTLFileOpen()
-{
-	WORD Err;
-	TVarId VarId;
-	int fhi;
-	HANDLE FH;
-	int Append, ReadonlyFlag=0;
-	TStrVal FName;
-
-	Err = 0;
-	GetIntVar(&VarId, &Err);
-	GetStrVal(FName, &Err);
-	GetIntVal(&Append, &Err);
-	// get 4nd arg(optional) if given
-	if (CheckParameterGiven()) { // readonly
-		GetIntVal(&ReadonlyFlag, &Err);
-	}
-	if ((Err==0) &&
-	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (!GetAbsPath(FName,sizeof(FName))) {
-		SetIntVal(VarId, -1);
-		return Err;
-	}
-
-	if (ReadonlyFlag) {
-		FH = _lopen(FName,OF_READ);
-	}
-	else {
-		FH = _lopen(FName,OF_READWRITE);
-	}
-	if (FH == INVALID_HANDLE_VALUE)
-		FH = _lcreat(FName,0);
-	if (FH == INVALID_HANDLE_VALUE) {
-		SetIntVal(VarId, -1);
-		return ErrCantOpen;
-	}
-	fhi = HandlePut(FH);
-	if (fhi == -1) {
-		SetIntVal(VarId, -1);
-		_lclose(FH);
-		return ErrCantOpen;
-	}
-	SetIntVal(VarId, fhi);
-	if (Append!=0) {
-		_llseek(FH, 0, 2/*FILE_END*/);
-	}
-	return 0;	// no error
-}
-
-// Format: filelock <file handle> [<timeout>]
-// (2012.4.19 yutaka)
-WORD TTLFileLock()
-{
-	WORD Err;
-	int FH;
-	DWORD timeout;
-	int result;
-	BOOL ret;
-	DWORD dwStart;
-
-	Err = 0;
-	GetIntVal(&FH,&Err);
-	if (Err!=0) return Err;
-
-	timeout = -1;  // 無限大
-	if (CheckParameterGiven()) {
-		GetIntVal(&timeout, &Err);
-		if (Err!=0) return Err;
-	}
-
-	result = 1;  // error
-	dwStart = GetTickCount();
-	do {
-		ret = LockFile((HANDLE)FH, 0, 0, (DWORD)-1, (DWORD)-1);
-		if (ret != 0) { // ロック成功
-			result = 0;  // success
-			break;
-		}
-		Sleep(1);
-	} while (GetTickCount() - dwStart < (timeout*1000));
-
-	SetResult(result);
-	return Err;
-}
-
-// Format: fileunlock <file handle> 
-// (2012.4.19 yutaka)
-WORD TTLFileUnLock()
-{
-	WORD Err;
-	int FH;
-	BOOL ret;
-
-	Err = 0;
-	GetIntVal(&FH,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	ret = UnlockFile((HANDLE)FH, 0, 0, (DWORD)-1, (DWORD)-1);
-	if (ret != 0) { // アンロック成功
-		SetResult(0);
-	} else {
-		SetResult(1);
-	}
-
-	return Err;
-}
-
-WORD TTLFileReadln()
-{
-	WORD Err;
-	TVarId VarId;
-	int fhi;
-	HANDLE FH;
-	int i, c;
-	TStrVal Str;
-	BOOL EndFile, EndLine;
-	BYTE b;
-
-	Err = 0;
-	GetIntVal(&fhi, &Err);
-	FH = HandleGet(fhi);
-	GetStrVar(&VarId, &Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	i = 0;
-	EndLine = FALSE;
-	EndFile = TRUE;
-	do {
-		c = _lread(FH, &b, 1);
-		if (c>0) EndFile = FALSE;
-		if (c==1) {
-			switch (b) {
-				case 0x0d:
-					c = _lread(FH, &b, 1);
-					if ((c==1) && (b!=0x0a))
-						_llseek(FH, -1, 1);
-					EndLine = TRUE;
-					break;
-				case 0x0a: EndLine = TRUE; break;
-				default:
-					if (i<MaxStrLen-1)
-					{
-						Str[i] = b;
-						i++;
-					}
-			}
-		}
-	} while ((c>=1) && (! EndLine));
-
-	if (EndFile)
-		SetResult(1);
-	else
-		SetResult(0);
-
-	Str[i] = 0;
-	SetStrVal(VarId, Str);
-	return Err;
-}
-
-
-// Format: fileread <file handle> <read byte> <strvar>
-// 指定したバイト数だけファイルから読み込む。
-// ただし、<read byte>は 1〜255 まで。
-// (2006.11.1 yutaka)
-WORD TTLFileRead()
-{
-	WORD Err;
-	TVarId VarId;
-	int fhi;
-	HANDLE FH;
-	int i, c;
-	int ReadByte;   // 読み込むバイト数
-	TStrVal Str;
-	BOOL EndFile, EndLine;
-	BYTE b;
-
-	Err = 0;
-	GetIntVal(&fhi,&Err);
-	FH = HandleGet(fhi);
-	GetIntVal(&ReadByte,&Err);
-	GetStrVar(&VarId,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if ((Err==0) && (ReadByte < 1 || ReadByte > MaxStrLen-1))  // 範囲チェック
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	EndLine = FALSE;
-	EndFile = FALSE;
-	for (i = 0 ; i < ReadByte ; i++) {
-		c = _lread(FH,&b,1);
-		if (c <= 0) {  // EOF
-			EndFile = TRUE;
-			break;
-		}
-		if (i<MaxStrLen-1)
-		{
-			Str[i] = b;
-		}
-	} 
-
-	if (EndFile)
-		SetResult(1);
-	else
-		SetResult(0);
-
-	Str[i] = 0;
-	SetStrVal(VarId,Str);
-	return Err;
-}
-
-
-WORD TTLFileRename()
-{
-	WORD Err;
-	TStrVal FName1, FName2;
-
-	Err = 0;
-	GetStrVal(FName1,&Err);
-	GetStrVal(FName2,&Err);
-	if ((Err==0) &&
-	    ((strlen(FName1)==0) ||
-	     (strlen(FName2)==0) ||
-	     (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) {
-		SetResult(1);
-		return Err;
-	}
-	if (_stricmp(FName1,FName2)==0) {
-		SetResult(2);
-		return Err;
-	}
-
-	if (!GetAbsPath(FName1,sizeof(FName1))) {
-		SetResult(-1);
-		return Err;
-	}
-	if (!GetAbsPath(FName2,sizeof(FName2))) {
-		SetResult(-2);
-		return Err;
-	}
-	if (rename(FName1,FName2) != 0) {
-		// リネームに失敗したら、エラーで返す。
-		SetResult(-3);
-		return Err;
-	}
-
-	SetResult(0);
-	return Err;
-}
-
-WORD TTLFileSearch()
-{
-	WORD Err;
-	TStrVal FName;
-
-	Err = 0;
-	GetStrVal(FName,&Err);
-	if ((Err==0) &&
-	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	GetAbsPath(FName,sizeof(FName));
-	if (DoesFileExist(FName))
-		SetResult(1);
-	else
-		SetResult(0);
-	return Err;
-}
-
-WORD TTLFileSeek()
-{
-	WORD Err;
-	int fhi;
-	HANDLE FH;
-	int i, j;
-
-	Err = 0;
-	GetIntVal(&fhi,&Err);
-	FH = HandleGet(fhi);
-	GetIntVal(&i,&Err);
-	GetIntVal(&j,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	_llseek(FH,i,j);
-	return Err;
-}
-
-WORD TTLFileSeekBack()
-{
-	WORD Err;
-	int fhi;
-	HANDLE FH;
-
-	Err = 0;
-	GetIntVal(&fhi,&Err);
-	FH = HandleGet(fhi);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	/* move back to the marked pos */
-	_llseek(FH,FPointer[fhi],0);
-	return Err;
-}
-
-WORD TTLFileStat()
-{
-	WORD Err;
-	TVarId SizeVarId, TimeVarId, DrvVarId;
-	TStrVal FName, TimeStr, DrvStr;
-	struct _stat st;
-	int ret;
-	int result = -1;
-	struct tm *tmp;
-
-	Err = 0;
-	GetStrVal(FName,&Err);
-	if ((Err==0) &&
-	    (strlen(FName)==0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (!GetAbsPath(FName,sizeof(FName))) {
-		goto end;
-	}
-
-	ret = _stat(FName, &st);
-	if (ret != 0) {
-		goto end;
-	}
-
-	if (CheckParameterGiven()) { 
-		GetIntVar(&SizeVarId,&Err);
-		if (Err!=0) return Err;
-		SetIntVal(SizeVarId, st.st_size);
-	}
-
-	if (CheckParameterGiven()) { 
-		GetStrVar(&TimeVarId,&Err);
-		if (Err!=0) return Err;
-		tmp = localtime(&st.st_mtime);
-		strftime(TimeStr, sizeof(TimeStr), "%Y-%m-%d %H:%M:%S", tmp);
-		SetStrVal(TimeVarId, TimeStr);
-	}
-
-	if (CheckParameterGiven()) { 
-		GetStrVar(&DrvVarId,&Err);
-		if (Err!=0) return Err;
-		_snprintf_s(DrvStr, sizeof(DrvStr), _TRUNCATE, "%c", st.st_dev + 'A');
-		SetStrVal(DrvVarId, DrvStr);
-	}
-
-	result = 0;
-
-end:
-	SetResult(result);
-
-	return Err;
-}
-
-WORD TTLFileStrSeek()
-{
-	WORD Err;
-	int fhi;
-	HANDLE FH;
-	int Len, i, c;
-	TStrVal Str;
-	BYTE b;
-	long int pos;
-
-	Err = 0;
-	GetIntVal(&fhi,&Err);
-	FH = HandleGet(fhi);
-	GetStrVal(Str,&Err);
-	if ((Err==0) &&
-	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	pos = _llseek(FH,0,1);
-	if (pos == INVALID_SET_FILE_POINTER) return Err;
-
-	Len = strlen(Str);
-	i = 0;
-	do {
-		c = _lread(FH,&b,1);
-		if (c==1)
-		{
-			if (b==(BYTE)Str[i])
-				i++;
-			else if (i>0) {
-				i = 0;
-				if (b==(BYTE)Str[0])
-					i = 1;
-			}
-		}
-	} while ((c>=1) && (i!=Len));
-	if (i==Len)
-		SetResult(1);
-	else {
-		SetResult(0);
-		_llseek(FH,pos,0);
-	}
-	return Err;
-}
-
-WORD TTLFileStrSeek2()
-{
-	WORD Err;
-	int fhi;
-	HANDLE FH;
-	int Len, i, c;
-	TStrVal Str;
-	BYTE b;
-	long int pos, pos2;
-	BOOL Last;
-
-	Err = 0;
-	GetIntVal(&fhi,&Err);
-	FH = HandleGet(fhi);
-	GetStrVal(Str,&Err);
-	if ((Err==0) &&
-	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	pos = _llseek(FH,0,1);
-	if (pos == INVALID_SET_FILE_POINTER) return Err;
-
-	Len = strlen(Str);
-	i = 0;
-	pos2 = pos;
-	do {
-		Last = (pos2<=0);
-		c = _lread(FH,&b,1);
-		pos2 = _llseek(FH,-2,1);
-		if (c==1)
-		{
-			if (b==(BYTE)Str[Len-1-i])
-				i++;
-			else if (i>0) {
-				i = 0;
-				if (b==(BYTE)Str[Len-1])
-					i = 1;
-			}
-		}
-	} while (!Last && (i!=Len));
-	if (i==Len) {
-		// ファイルの1バイト目がヒットすると、ファイルポインタが突き破って
-		// INVALID_SET_FILE_POINTER になるので、
-		// ゼロオフセットになるように調整する。(2008.10.10 yutaka)
-		if (pos == INVALID_SET_FILE_POINTER) 
-			_llseek(FH, 0, 0);
-		SetResult(1);
-	} else {
-		SetResult(0);
-		_llseek(FH,pos,0);
-	}
-	return Err;
-}
-
-WORD TTLFileTruncate()
-{
-	WORD Err;
-	TStrVal FName;
-	int result = -1;
-	int TruncByte;
-	int fh = -1;
-	int ret;
-
-	Err = 0;
-	GetStrVal(FName,&Err);
-	if ((Err==0) &&
-	    (strlen(FName)==0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (!GetAbsPath(FName,sizeof(FName))) {
-		goto end;
-	}
-
-	if (CheckParameterGiven()) { 
-		GetIntVal(&TruncByte,&Err);
-		if (Err!=0) return Err;
-	} else {
-		Err = ErrSyntax;
-		goto end;
-	}
-
-	// ファイルを指定したサイズで切り詰める。
-   ret = _sopen_s( &fh, FName, _O_RDWR | _O_CREAT, _SH_DENYNO, _S_IREAD | _S_IWRITE );
-   if (ret != 0) {
-		Err = ErrCantOpen;
-		goto end;
-   }
-   ret = _chsize_s(fh, TruncByte);
-   if (ret != 0) {
-		Err = ErrInvalidCtl;
-		goto end;
-   }
-
-	result = 0;
-	Err = 0;
-
-end:
-	SetResult(result);
-
-	if (fh != -1)
-		_close(fh);
-
-	return Err;
-}
-
-WORD TTLFileWrite(BOOL addCRLF)
-{
-	WORD Err, P;
-	int fhi;
-	HANDLE FH;
-	int Val;
-	TStrVal Str;
-
-	Err = 0;
-	GetIntVal(&fhi, &Err);
-	FH = HandleGet(fhi);
-	if (Err) return Err;
-
-	P = LinePtr;
-	GetStrVal(Str, &Err);
-	if (!Err) {
-		if (GetFirstChar())
-			return ErrSyntax;
-
-		_lwrite(FH, Str, strlen(Str));
-	}
-	else if (Err == ErrTypeMismatch) {
-		Err = 0;
-		LinePtr = P;
-		GetIntVal(&Val, &Err);
-		if (Err) return Err;
-		if (GetFirstChar())
-			return ErrSyntax;
-
-		Str[0] = Val & 0xff;
-		_lwrite(FH, Str, 1);
-	}
-	else {
-		return Err;
-	}
-
-	if (addCRLF) {
-		_lwrite(FH,"\015\012",2);
-	}
-	return 0;
-}
-
-WORD TTLFindClose()
-{
-	WORD Err;
-	int DH;
-
-	Err = 0;
-	GetIntVal(&DH,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if ((DH>=0) && (DH<NumDirHandle) &&
-	    (DirHandle[DH]!=-1L))
-	{
-		_findclose(DirHandle[DH]);
-		DirHandle[DH] = -1L;
-	}
-	return Err;
-}
-
-WORD TTLFindFirst()
-{
-	TVarId DH, Name;
-	WORD Err;
-	TStrVal Dir;
-	int i;
-	struct _finddata_t data;
-
-	Err = 0;
-	GetIntVar(&DH,&Err);
-	GetStrVal(Dir,&Err);
-	GetStrVar(&Name,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (Dir[0]==0) strncpy_s(Dir, sizeof(Dir),"*.*", _TRUNCATE);
-	GetAbsPath(Dir,sizeof(Dir));
-	i = 0;
-	while ((i<NumDirHandle) &&
-	       (DirHandle[i]!=-1L))
-		i++;
-	if (i<NumDirHandle)
-	{
-		DirHandle[i] = _findfirst(Dir,&data);
-		if (DirHandle[i]!=-1L)
-			SetStrVal(Name,data.name);
-		else
-			i = -1;
-	}
-	else
-		i = -1;
-
-	SetIntVal(DH,i);
-	if (i<0)
-	{
-		SetResult(0);
-		SetStrVal(Name,"");
-	}
-	else
-		SetResult(1);
-	return Err;
-}
-
-WORD TTLFindNext()
-{
-	TVarId Name;
-	WORD Err;
-	int DH;
-	struct _finddata_t data;
-
-	Err = 0;
-	GetIntVal(&DH,&Err);
-	GetStrVar(&Name,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if ((DH>=0) && (DH<NumDirHandle) &&
-	    (DirHandle[DH]!=-1L) &&
-	    (_findnext(DirHandle[DH],&data)==0))
-	{
-		SetStrVal(Name,data.name);
-		SetResult(1);
-	}
-	else {
-		SetStrVal(Name,"");
-		SetResult(0);
-	}
-	return Err;
-}
-
-WORD TTLFlushRecv()
-{
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-	FlushRecv();
-	return 0;
-}
-
-WORD TTLFolderCreate()
-{
-	WORD Err;
-	TStrVal FName;
-
-	Err = 0;
-	GetStrVal(FName,&Err);
-	if ((Err==0) &&
-	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) {
-		SetResult(1);
-		return Err;
-	}
-
-	if (!GetAbsPath(FName,sizeof(FName))) {
-		SetResult(-1);
-		return Err;
-	}
-
-	if (CreateDirectory(FName, NULL) == 0) {
-		SetResult(2);
-	}
-	else {
-		SetResult(0);
-	}
-	return Err;
-}
-
-WORD TTLFolderDelete()
-{
-	WORD Err;
-	TStrVal FName;
-
-	Err = 0;
-	GetStrVal(FName,&Err);
-	if ((Err==0) &&
-	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) {
-		SetResult(1);
-		return Err;
-	}
-
-	if (!GetAbsPath(FName,sizeof(FName))) {
-		SetResult(-1);
-		return Err;
-	}
-
-	if (RemoveDirectory(FName) == 0) {
-		SetResult(2);
-	}
-	else {
-		SetResult(0);
-	}
-	return Err;
-}
-
-WORD TTLFolderSearch()
-{
-	WORD Err;
-	TStrVal FName;
-
-	Err = 0;
-	GetStrVal(FName,&Err);
-	if ((Err==0) &&
-	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	GetAbsPath(FName,sizeof(FName));
-	if (DoesFolderExist(FName)) {
-		SetResult(1);
-	}
-	else {
-		SetResult(0);
-	}
-	return Err;
-}
-
-WORD TTLFor()
-{
-	WORD Err;
-	TVarId VarId;
-	int ValStart, ValEnd, i;
-
-	Err = 0;
-	GetIntVar(&VarId,&Err);
-	GetIntVal(&ValStart,&Err);
-	GetIntVal(&ValEnd,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (! CheckNext())
-	{ // first time
-		Err = SetForLoop();
-		if (Err==0)
-		{
-			SetIntVal(VarId,ValStart);
-			i = CopyIntVal(VarId);
-			if (i==ValEnd)
-				LastForLoop();
-		}
-	}
-	else { // return from 'next'
-		i = CopyIntVal(VarId);
-		if (i<ValEnd)
-			i++;
-		else if (i>ValEnd)
-			i--;
-		SetIntVal(VarId,i);
-		if (i==ValEnd)
-			LastForLoop();
-	}
-	return Err;
-}
-
-WORD TTLGetDir()
-{
-	WORD Err;
-	TVarId VarId;
-	TStrVal Str;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	TTMGetDir(Str, sizeof(Str));
-	SetStrVal(VarId,Str);
-	return Err;
-}
-
-WORD TTLGetEnv()
-{
-	WORD Err;
-	TVarId VarId;
-	TStrVal Str;
-	PCHAR Str2;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	GetStrVar(&VarId,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	Str2 = getenv(Str);
-
-	if (Str2!=NULL)
-		SetStrVal(VarId,Str2);
-	else
-		SetStrVal(VarId,"");
-	return Err;
-}
-
-WORD TTLGetFileAttr()
-{
-	WORD Err;
-	TStrVal Filename;
-
-	Err = 0;
-	GetStrVal(Filename,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	SetResult(GetFileAttributes(Filename));
-
-	return Err;
-}
-
-WORD TTLGetHostname()
-{
-	WORD Err;
-	TVarId VarId;
-	char Str[MaxStrLen];
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err!=0) return Err;
-
-	Err = GetTTParam(CmdGetHostname,Str,sizeof(Str));
-	if (Err==0)
-		SetStrVal(VarId,Str);
-	return Err;
-}
-
-#define MAX_IPADDR 30
-/*
- strdim ipaddr 10
- getipv4addr ipaddr num
- */
-WORD TTLGetIPv4Addr()
-{
-	WORD Err;
-	TVarId VarId, VarId2, id;
-	WSADATA ws;
-	INTERFACE_INFO info[MAX_IPADDR];
-	SOCKET sock;
-	DWORD socknum;
-	int num, result, arysize;
-	int i, n;
-	IN_ADDR addr;
-
-	Err = 0;
-	GetStrAryVar(&VarId,&Err);
-	GetIntVar(&VarId2, &Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	// 自分自身の全IPv4アドレスを取得する。
-	if (WSAStartup(MAKEWORD(2,2), &ws) != 0) {
-		SetResult(-1);
-		SetIntVal(VarId2, 0);
-		return Err;
-	}
-	arysize = GetStrAryVarSize(VarId);
-	num = 0;
-	result = 1;
-	sock = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
-	if (WSAIoctl(sock, SIO_GET_INTERFACE_LIST, NULL, 0, info, sizeof(info), &socknum, NULL, NULL) != SOCKET_ERROR) {
-		n = socknum / sizeof(info[0]);
-		for (i = 0 ; i < n ; i++) {
-			if ((info[i].iiFlags & IFF_UP) == 0) 
-				continue;
-			if ((info[i].iiFlags & IFF_LOOPBACK) != 0)
-				continue;
-			addr = info[i].iiAddress.AddressIn.sin_addr;
-
-			if (num < arysize) {
-				id = GetStrVarFromArray(VarId, num, &Err);
-				SetStrVal(id, inet_ntoa(addr));
-			}
-			else {
-				result = 0;
-			}
-			num++;
-		}
-	}
-	closesocket(sock);
-	WSACleanup();
-
-	SetResult(result);
-	SetIntVal(VarId2, num);
-
-	return Err;
-}
-
-
-// IPv6アドレスを文字列に変換する。
-static void myInetNtop(int Family, char *pAddr, char *pStringBuf, size_t StringBufSize)
-{
-	int i;
-	char s[16];
-	unsigned int val;
-
-	pStringBuf[0] = '\0';
-	for (i = 0 ; i < 16 ; i++) {
-		val = (pAddr[i]) & 0xFF;
-		_snprintf_s(s, sizeof(s), _TRUNCATE, "%02x", val);
-		strncat_s(pStringBuf, StringBufSize, s, _TRUNCATE);
-		if (i != 15 && (i & 1))
-			strncat_s(pStringBuf, StringBufSize, ":", _TRUNCATE);
-	}
-}
-
-
-WORD TTLGetIPv6Addr()
-{
-	WORD Err;
-	TVarId VarId, VarId2, id;
-	int num, result, arysize;
-	DWORD ret;
-	IP_ADAPTER_ADDRESSES addr[256];/* XXX */
-	ULONG len = sizeof(addr);
-	char ipv6str[64];
-
-	Err = 0;
-	GetStrAryVar(&VarId,&Err);
-	GetIntVar(&VarId2, &Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	// GetAdaptersAddresses がサポートされていない OS はここで return
-	if (!HasGetAdaptersAddresses()) {
-		SetResult(-1);
-		SetIntVal(VarId2, 0);
-		return Err;
-	}
-
-	// 自分自身の全IPv6アドレスを取得する。
-	arysize = GetStrAryVarSize(VarId);
-	num = 0;
-	result = 1;
-	ret = GetAdaptersAddresses(AF_INET6, 0, NULL, addr, &len);
-	if (ret == ERROR_SUCCESS) {
-		IP_ADAPTER_ADDRESSES *padap = &addr[0];
-
-		do {
-			IP_ADAPTER_UNICAST_ADDRESS *uni = padap->FirstUnicastAddress;
-
-			if (!uni) {
-				continue;
-			}
-			do {
-				SOCKET_ADDRESS addr = uni->Address;
-				struct sockaddr_in6 *sa;
-
-				if (!(uni->Flags & IP_ADAPTER_ADDRESS_DNS_ELIGIBLE)) {
-					continue;
-				}
-				sa = (struct sockaddr_in6*)addr.lpSockaddr;
-				myInetNtop(AF_INET6, (char*)&sa->sin6_addr, ipv6str, sizeof(ipv6str));
-
-				if (num < arysize) {
-					id = GetStrVarFromArray(VarId, num, &Err);
-					SetStrVal(id, ipv6str);
-				}
-				else {
-					result = 0;
-				}
-				num++;
-
-			} while ((uni = uni->Next));
-		} while ((padap = padap->Next));
-	}
-
-	SetResult(result);
-	SetIntVal(VarId2, num);
-
-	return Err;
-}
-
-#if 0
-WORD TTLGetPassword()
-{
-	TStrVal Str, Str2, Temp2;
-	char Temp[512];
-	WORD Err;
-	TVarId VarId;
-	int result = 0;  /* failure */
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	GetStrVal(Str2,&Err);
-	GetStrVar(&VarId,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	SetStrVal(VarId,"");
-	if (Str[0]==0) return Err;
-	if (Str2[0]==0) return Err;
-
-	GetAbsPath(Str,sizeof(Str));
-
-	GetPrivateProfileString("Password",Str2,"",
-	                        Temp,sizeof(Temp), Str);
-	if (Temp[0]==0) // password not exist
-	{
-		OpenInpDlg(Temp2, Str2, "Enter password", "", TRUE);
-		if (Temp2[0]!=0) {
-			Encrypt(Temp2,Temp);
-			if (WritePrivateProfileString("Password",Str2,Temp, Str) != 0) {
-				result = 1;  /* success */
-			}
-		}
-	}
-	else {// password exist
-		Decrypt(Temp,Temp2);
-		result = 1;  /* success */
-	}
-
-	SetStrVal(VarId,Temp2);
-
-	SetResult(result);  // 成功可否を設定する。
-	return Err;
-}
-#endif
-
-// setpassword 'password.dat' 'mypassword' passowrd
-WORD TTLSetPassword()
-{
-	TStrVal FileNameStr, KeyStr;
-	char Temp[512];
-	WORD Err;
-	TVarId VarId;
-	PCHAR VarStr;
-	int result = 0;  /* failure */
-
-	Err = 0;
-	GetStrVal(FileNameStr, &Err);   // ファイル名
-	GetStrVal(KeyStr, &Err);  // キー名
-	GetStrVar(&VarId, &Err);
-	VarStr = StrVarPtr(VarId);  // 変数へのポインタ
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	// 文字列が空の場合はエラーとする。
-	if (FileNameStr[0]==0 || 
-	    KeyStr[0]==0 ||
-	    VarStr[0]==0)   // "getpassword"同様、空パスワードも許可しない。
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	GetAbsPath(FileNameStr, sizeof(FileNameStr));
-
-	// パスワードを暗号化する。
-	Encrypt(VarStr, Temp);
-
-	if (WritePrivateProfileString("Password", KeyStr, Temp, FileNameStr) != 0) 
-		result = 1;  /* success */
-
-	SetResult(result);  // 成功可否を設定する。
-	return Err;
-}
-
-// ispassword 'password.dat' 'username' ; result: 0=false; 1=true
-WORD TTLIsPassword()
-{
-	TStrVal FileNameStr, KeyStr;
-	char Temp[512];
-	WORD Err;
-	int result = 0; 
-
-	Err = 0;
-	GetStrVal(FileNameStr, &Err);   // ファイル名
-	GetStrVal(KeyStr, &Err);  // キー名
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	// 文字列が空の場合はエラーとする。
-	if (FileNameStr[0]==0 || 
-	    KeyStr[0]==0)
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	GetAbsPath(FileNameStr, sizeof(FileNameStr));
-
-	Temp[0] = 0;
-	GetPrivateProfileString("Password", KeyStr,"",
-	                        Temp, sizeof(Temp), FileNameStr);
-	if (Temp[0] == 0) { // password not exist
-		result = 0; 
-	} else {
-		result = 1; 
-	}
-
-	SetResult(result);  // 成功可否を設定する。
-	return Err;
-}
-
-WORD TTLGetSpecialFolder()
-{
-	WORD Err;
-	TVarId VarId;
-	TStrVal type;
-	int result;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	if (Err!=0) return Err;
-
-	GetStrVal(type,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) {
-		return Err;
-	}
-
-	result = GetSpecialFolder(StrVarPtr(VarId), sizeof(TStrVal), type);
-	SetResult(result);
-
-	return Err;
-}
-
-WORD TTLGetTime(WORD mode)
-{
-	WORD Err;
-	TVarId VarId;
-	TStrVal Str1, Str2, tzStr;
-	time_t time1;
-	struct tm *ptm;
-	char *format;
-	BOOL set_result;
-	const char *tz = NULL;
-	char tz_copy[128]; 
-
-	// Save timezone
-	tz = getenv("TZ");
-	tz_copy[0] = 0;
-	if (tz)
-		strncpy_s(tz_copy, sizeof(tz_copy), tz, _TRUNCATE);
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-
-	if (CheckParameterGiven()) {
-		GetStrVal(Str1, &Err);
-		format = Str1;
-
-		if (isInvalidStrftimeChar(Str1)) {
-			SetResult(2);
-			return 0;
-//			return ErrSyntax;
-		}
-		set_result = TRUE;
-
-		// タイムゾーンの指定があれば、localtime()に影響させる。(2012.5.2 yutaka)
-		if (CheckParameterGiven()) {
-			GetStrVal(tzStr, &Err);
-			if (Err!=0) return Err;
-			_putenv_s("TZ", tzStr);
-			_tzset();
-		}
-
-	}
-	else {
-		switch (mode) {
-		case RsvGetDate:
-			format = "%Y-%m-%d";
-			break;
-		case RsvGetTime:
-			format = "%H:%M:%S";
-			break;
-		}
-		set_result = FALSE;
-	}
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	// get current date & time
-	time1 = time(NULL);
-	ptm = localtime(&time1);
-
-	if (strftime(Str2, sizeof(Str2), format, ptm)) {
-		SetStrVal(VarId,Str2);
-		if (set_result) SetResult(0);
-	}
-	else {
-		if (set_result) SetResult(1);
-	}
-
-	// Restore timezone
-	_putenv_s("TZ", tz_copy);
-	_tzset();
-
-	return Err;
-}
-
-WORD TTLGetTitle()
-{
-	TVarId VarId;
-	WORD Err;
-	char Str[TitleBuffSize*2];
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err!=0) return Err;
-
-	Err = GetTTParam(CmdGetTitle,Str,sizeof(Str));
-	if (Err==0)
-		SetStrVal(VarId,Str);
-	return Err;
-}
-
-WORD TTLGetTTDir()
-{
-	TVarId VarId;
-	WORD Err;
-	char Temp[MAX_PATH],HomeDir[MAX_PATH];
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (GetModuleFileName(NULL, Temp, sizeof(Temp)) == 0) {
-		SetStrVal(VarId,"");
-		SetResult(0);
-		return Err;
-	}
-	ExtractDirName(Temp, HomeDir);
-	SetStrVal(VarId,HomeDir);
-	SetResult(1);
-
-	return Err;
-}
-
-// COMポートからレジスタ値を読む。
-// (2015.1.8 yutaka)
-WORD TTLGetModemStatus()
-{
-	TVarId VarId;
-	WORD Err;
-	char Str[MaxStrLen];
-	int Num;
-
-	Err = 0;
-	GetIntVar(&VarId, &Err);
-	if ((Err == 0) && (GetFirstChar() != 0))
-		Err = ErrSyntax;
-	if ((Err == 0) && (!Linked))
-		Err = ErrLinkFirst;
-	if (Err != 0) return Err;
-
-	memset(Str, 0, sizeof(Str));
-	Err = GetTTParam(CmdGetModemStatus, Str, sizeof(Str));
-	if (Err == 0) {
-		Num = atoi(Str);
-		SetIntVal(VarId, Num);
-		SetResult(0);
-	}
-	else {
-		SetResult(1);
-	}
-
-	return Err;
-}
-
-//
-// Tera Term のバージョン取得 & 比較
-// バージョン番号はコンパイル時に決定する。
-// (現在は実行ファイルのバージョン情報は参照しない)
-//
-WORD TTLGetVer()
-{
-	TVarId VarId;
-	WORD Err;
-	TStrVal Str1, Str2;
-	int cur_major = TT_VERSION_MAJOR;
-	int cur_minor = TT_VERSION_MINOR;
-	int compare = 0;
-	int comp_major, comp_minor, ret;
-	int cur_ver, comp_ver;
-
-	Err = 0;
-	GetStrVar(&VarId, &Err);
-
-	if (CheckParameterGiven()) {
-		GetStrVal(Str1, &Err);
-
-		ret = sscanf_s(Str1, "%d.%d", &comp_major, &comp_minor);
-		if (ret != 2) {
-			SetResult(-2);
-			return 0;
-			//Err = ErrSyntax;
-		}
-		compare = 1;
-
-	} else {
-		compare = 0;
-
-	}
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	_snprintf_s(Str2, sizeof(Str2), _TRUNCATE, "%d.%d", cur_major, cur_minor);
-	SetStrVal(VarId, Str2);
-
-	if (compare == 1) {
-		cur_ver = cur_major * 10000 + cur_minor;
-		comp_ver = comp_major * 10000 + comp_minor;
-
-		if (cur_ver < comp_ver) {
-			SetResult(-1);
-		} else if (cur_ver == comp_ver) {
-			SetResult(0);
-		} else {
-			SetResult(1);
-		}
-	}
-
-	return Err;
-}
-
-WORD TTLGoto()
-{
-	TName LabName;
-	WORD Err, VarType;
-	TVarId VarId;
-
-	if (GetLabelName(LabName) && (GetFirstChar()==0))
-	{
-		if (CheckVar(LabName,&VarType,&VarId) && (VarType==TypLabel))
-		{
-			JumpToLabel(VarId);
-			Err = 0;
-		}
-		else
-			Err = ErrLabelReq;
-	}
-	else
-		Err = ErrSyntax;
-
-	return Err;
-}
-
-// add 'ifdefined' (2006.9.23 maya)
-WORD TTLIfDefined()
-{
-	WORD VarType, Err;
-	int Val;
-
-	GetVarType(&VarType,&Val,&Err);
-
-	SetResult(VarType);
-
-	return Err;
-}
-
-BOOL CheckThen(LPWORD Err)
-{
-	BYTE b;
-	TName Temp;
-
-	do {
-
-		do {
-			b = GetFirstChar();
-			if (b==0) return FALSE;
-		} while (((b<'A') || (b>'Z')) &&
-		         (b!='_') &&
-		         ((b<'a') || (b>'z')));
-		LinePtr--;
-		if (! GetIdentifier(Temp)) return FALSE;
-
-	} while (_stricmp(Temp,"then")!=0);
-
-	if (GetFirstChar()!=0)
-		*Err = ErrSyntax;
-	return TRUE;
-}
-
-WORD TTLIf()
-{
-	WORD Err, ValType, Tmp, WId;
-	int Val;
-
-	if (! GetExpression(&ValType,&Val,&Err))
-		return ErrSyntax;
-
-	if (Err!=0) return Err;
-
-	if (ValType!=TypInteger)
-		return ErrTypeMismatch;
-
-	Tmp = LinePtr;
-	if (GetReservedWord(&WId) &&
-	    (WId==RsvThen))
-	{  // If then  ... EndIf structure
-		if (GetFirstChar()!=0)
-			return ErrSyntax;
-		IfNest++;
-		if (Val==0)
-			ElseFlag = 1; // Skip until 'Else' or 'EndIf'
-	}
-	else { // single line If command
-		LinePtr = Tmp;
-		if (!CheckParameterGiven())
-			return ErrSyntax;
-		if (Val==0)
-			return 0;
-		return ExecCmnd();
-	}
-	return Err;
-}
-
-WORD TTLInclude()
-{
-	WORD Err;
-	TStrVal Str;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	if (!GetAbsPath(Str,sizeof(Str))) {
-		Err = ErrCantOpen;
-		return Err;
-	}
-	if (! BuffInclude(Str)) {
-		Err = ErrCantOpen;
-		return Err;
-	}
-
-	return Err;
-}
-
-#if 0
-WORD TTLInputBox(BOOL Paswd)
-{
-	TStrVal Str1, Str2, Str3;
-	WORD Err, ValType, P;
-	TVarId VarId;
-	int sp = 0;
-
-	Err = 0;
-	GetStrVal(Str1,&Err);
-	GetStrVal(Str2,&Err);
-	if (Err!=0) return Err;
-
-	if (!Paswd && CheckParameterGiven()) {
-		// get 3rd arg(optional)
-		P = LinePtr;
-		GetStrVal(Str3,&Err);
-		if (Err == ErrTypeMismatch) {
-			strncpy_s(Str3,sizeof(Str3),"",_TRUNCATE);
-			LinePtr = P;
-			Err = 0;
-		}
-	}
-	else {
-		strncpy_s(Str3,sizeof(Str3),"",_TRUNCATE);
-	}
-
-	// get 4th(3rd) arg(optional) if given
-	if (CheckParameterGiven()) {
-		GetIntVal(&sp, &Err);
-	}
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (sp) {
-		RestoreNewLine(Str1);
-	}
-
-	SetInputStr("");
-	if (CheckVar("inputstr",&ValType,&VarId) &&
-	    (ValType==TypString))
-		OpenInpDlg(StrVarPtr(VarId),Str1,Str2,Str3,Paswd);
-	return Err;
-}
-#endif
-
-WORD TTLInt2Str()
-{
-	TVarId VarId;
-	WORD Err;
-	int Num;
-	TStrVal Str2;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-
-	GetIntVal(&Num,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	_snprintf_s(Str2,sizeof(Str2),_TRUNCATE,"%d",Num);
-
-	SetStrVal(VarId,Str2);
-	return Err;
-}
-
-//
-// logrotate size value
-// logrotate rotate num
-// logrotate halt
-//
-WORD TTLLogRotate() 
-{
-	WORD Err;
-	char Str[MaxStrLen];
-	char Str2[MaxStrLen];
-	char buf[MaxStrLen*2];
-	int size, num, len;
-
-	Err = 0;
-	GetStrVal(Str, &Err);
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err!=0) return Err;
-
-	Err = ErrSyntax;
-	if (strcmp(Str, "size") == 0) {   // ローテートサイズ
-		if (CheckParameterGiven()) {
-			Err = 0;
-			size = 0;
-			GetStrVal(Str2, &Err);
-			if (Err == 0) {
-				len = strlen(Str2);
-				if (isdigit(Str2[len-1])) {
-					num = 1;
-				} else if (Str2[len-1] == 'K') {
-					Str2[len-1] = 0;
-					num = 1024;
-				} else if (Str2[len-1] == 'M') {
-					Str2[len-1] = 0;
-					num = 1024*1024;
-				} else {
-					Err = ErrSyntax;
-				}
-				size = atoi(Str2) * num;
-			}
-
-			if (size < 128)
-				Err = ErrSyntax;
-			if (Err == 0)
-				_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s %u", Str, size);
-		}
-
-	} else if (strcmp(Str, "rotate") == 0) {  // ローテートの世代数
-		if (CheckParameterGiven()) {
-			Err = 0;
-			num = 0;
-			GetIntVal(&num, &Err);
-			if (num <= 0)
-				Err = ErrSyntax;
-			if (Err == 0)
-				_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s %u", Str, num);
-		}
-
-	} else if (strcmp(Str, "halt") == 0) {
-		Err = 0;
-		_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s", Str);
-	} 
-	if (Err!=0) return Err;
-
-	SetFile(buf);
-	Err = SendCmnd(CmdLogRotate, 0);
-
-	return Err;
-}
-
-WORD TTLLogInfo() 
-{
-	WORD Err;
-	TVarId VarId;
-	char Str[MaxStrLen];
-
-	Err = 0;
-	GetStrVar(&VarId, &Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err!=0) return Err;
-
-	Err = GetTTParam(CmdLogInfo, Str, sizeof(Str));
-	if (Err==0) {
-		SetResult(Str[0] - '0');
-		SetStrVal(VarId, Str+1);
-	}
-	return Err;
-}
-
-WORD TTLLogOpen()
-{
-	TStrVal Str;
-	WORD Err;
-	int LogFlags[LogOptMax+1] = { 0 };
-	int TmpFlag;
-	char ret[2];
-
-	Err = 0;
-	GetStrVal(Str, &Err);
-	GetIntVal(&LogFlags[LogOptBinary], &Err);
-	GetIntVal(&LogFlags[LogOptAppend], &Err);
-
-	// plain text
-	if (!CheckParameterGiven()) goto EndLogOptions;
-	GetIntVal(&LogFlags[LogOptPlainText], &Err);
-	if (Err!=0) return Err;
-
-	// timestamp
-	if (!CheckParameterGiven()) goto EndLogOptions;
-	GetIntVal(&LogFlags[LogOptTimestamp], &Err);
-	if (Err!=0) return Err;
-
-	// hide file transfer dialog
-	if (!CheckParameterGiven()) goto EndLogOptions;
-	GetIntVal(&LogFlags[LogOptHideDialog], &Err);
-	if (Err!=0) return Err;
-
-	// Include screen buffer
-	if (!CheckParameterGiven()) goto EndLogOptions;
-	GetIntVal(&LogFlags[LogOptIncScrBuff], &Err);
-	if (Err!=0) return Err;
-
-	// Timestamp Type
-	if (!CheckParameterGiven()) goto EndLogOptions;
-	GetIntVal(&TmpFlag, &Err);
-	if (Err!=0) return Err;
-	if (TmpFlag < 0 || TmpFlag > 3)
-		return ErrSyntax;
-	LogFlags[LogOptTimestampType] = TmpFlag;
-
-EndLogOptions:
-	if (strlen(Str) == 0 || GetFirstChar() != 0)
-		return ErrSyntax;
-
-	SetFile(Str);
-	SetLogOption(LogFlags);
-
-	memset(ret, 0, sizeof(ret));
-	Err = GetTTParam(CmdLogOpen,ret,sizeof(ret));
-	if (Err==0) {
-		if (ret[0] == 0x31) {
-			SetResult(0);
-		}
-		else {
-			SetResult(1);
-		}
-	}
-	return Err;
-}
-
-WORD TTLLoop()
-{
-	WORD WId, Err;
-	int Val = 1;
-
-	Err = 0;
-	if (CheckParameterGiven()) {
-		if (GetReservedWord(&WId)) {
-			switch (WId) {
-				case RsvWhile:
-					GetIntVal(&Val,&Err);
-					break;
-				case RsvUntil:
-					GetIntVal(&Val,&Err);
-					Val = Val == 0;
-					break;
-				default:
-					Err = ErrSyntax;
-			}
-			if ((Err==0) && (GetFirstChar()!=0))
-				Err = ErrSyntax;
-		}
-		else {
-			Err = ErrSyntax;
-		}
-	}
-
-	if (Err!=0) return Err;
-
-	return BackToWhile(Val!=0);
-}
-
-WORD TTLMakePath()
-{
-	TVarId VarId;
-	WORD Err;
-	TStrVal Dir, Name;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetStrVal(Dir,&Err);
-	GetStrVal(Name,&Err);
-	if ((Err==0) &&
-	    (GetFirstChar()!=0))
-		Err = ErrSyntax;
-
-	if (Err!=0) return Err;
-
-	AppendSlash(Dir,sizeof(Dir));
-	strncat_s(Dir,sizeof(Dir),Name,_TRUNCATE);
-	SetStrVal(VarId,Dir);
-
-	return Err;
-}
-
-static void basedirname(char *fullpath, char *dest_base, int base_len, char *dest_dir, int dir_len) {
-	char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
-	char dirname[MAX_PATH];
-	char basename[MAX_PATH];
-
-	_splitpath_s(fullpath, drive, sizeof(drive), dir, sizeof(dir), fname, sizeof(fname), ext, sizeof(ext));
-	strncpy_s(dirname, sizeof(dirname), drive, _TRUNCATE);
-	strncat_s(dirname, sizeof(dirname), dir, _TRUNCATE);
-	DeleteSlash(dirname); // 末尾の \ を取り除く
-	if (strlen(fname) == 0 && strlen(ext) == 0) {
-		_splitpath_s(dirname, drive, sizeof(drive), dir, sizeof(dir), fname, sizeof(fname), ext, sizeof(ext));
-		strncpy_s(dirname, sizeof(dirname), drive, _TRUNCATE);
-		strncat_s(dirname, sizeof(dirname), dir, _TRUNCATE);
-		DeleteSlash(dirname); // 末尾の \ を取り除く
-		strncpy_s(basename, sizeof(basename), fname, _TRUNCATE);
-		strncat_s(basename, sizeof(basename), ext, _TRUNCATE);
-	}
-	else {
-		strncpy_s(basename, sizeof(basename), fname, _TRUNCATE);
-		strncat_s(basename, sizeof(basename), ext, _TRUNCATE);
-	}
-
-	if (dest_dir != NULL) {
-		strncpy_s(dest_dir, dir_len, dirname, _TRUNCATE);
-	}
-	if (dest_base != NULL) {
-		strncpy_s(dest_base, base_len, basename, _TRUNCATE);
-	}
-}
-
-static void basename(char *fullpath, char *dest, int len) {
-	basedirname(fullpath, dest, len, NULL, 0);
-}
-
-static void dirname(char *fullpath, char *dest, int len) {
-	basedirname(fullpath, NULL, 0, dest, len);
-}
-
-WORD TTLBasename()
-{
-	TVarId VarId;
-	WORD Err;
-	TStrVal Src, Name;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetStrVal(Src,&Err);
-	if ((Err==0) &&
-	    (GetFirstChar()!=0))
-		Err = ErrSyntax;
-
-	if (Err!=0) return Err;
-
-	basename(Src, Name, sizeof(Name));
-	SetStrVal(VarId, Name);
-
-	return Err;
-}
-
-WORD TTLDirname()
-{
-	TVarId VarId;
-	WORD Err;
-	TStrVal Src, Dir;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetStrVal(Src,&Err);
-	if ((Err==0) &&
-	    (GetFirstChar()!=0))
-		Err = ErrSyntax;
-
-	if (Err!=0) return Err;
-
-	dirname(Src, Dir, sizeof(Dir));
-	SetStrVal(VarId, Dir);
-
-	return Err;
-}
-
-#if 0
-WORD TTLDirnameBox()
-{
-	TStrVal Title;
-	WORD Err, ValType;
-	TVarId VarId;
-	char buf[MAX_PATH];
-	TStrVal InitDir = "";
-	BOOL ret;
-
-	Err = 0;
-	GetStrVal(Title, &Err);
-	if (Err != 0) return Err;
-
-	// get 2nd arg(optional) if given
-	if (CheckParameterGiven()) { // initdir
-		GetStrVal(InitDir, &Err);
-		if (Err != 0) return Err;
-	}
-
-	if ((Err == 0) && (GetFirstChar() != 0))
-		Err = ErrSyntax;
-	if (Err != 0) return Err;
-
-	SetInputStr("");
-	if (CheckVar("inputstr", &ValType, &VarId) &&
-	    (ValType == TypString)) {
-		BringupWindow(HMainWin);
-		if (doSelectFolder(HMainWin, buf, sizeof(buf), InitDir, Title)) {
-			SetInputStr(buf);
-			ret = 1;
-		}
-		else {
-			ret = 0;
-		}
-		SetResult(ret);
-	}
-	return Err;
-}
-
-#if 0
-#define IdMsgBox 1
-#define IdYesNoBox 2
-#define IdStatusBox 3
-#define IdListBox 4
-#define LISTBOX_ITEM_NUM 10
-#endif
-
-int MessageCommand(int BoxId, LPWORD Err)
-{
-	TStrVal Str1, Str2;
-	int sp = 0;
-	int ret;
-	char **s;
-	int i, ary_size;
-	int sel = 0;
-	TVarId VarId, VarId2;
-
-	*Err = 0;
-	GetStrVal2(Str1, Err, TRUE);
-	GetStrVal2(Str2, Err, TRUE);
-	if (*Err!=0) return 0;
-
-	if (BoxId != IdListBox) {
-		// get 3rd arg(optional) if given
-		if (CheckParameterGiven()) {
-			GetIntVal(&sp, Err);
-		}
-		if ((*Err==0) && (GetFirstChar()!=0))
-			*Err = ErrSyntax;
-		if (*Err!=0) return 0;
-	}
-
-	if (sp) {
-		RestoreNewLine(Str1);
-	}
-
-	if (BoxId==IdMsgBox) {
-		ret = OpenMsgDlg(Str1,Str2,FALSE);
-		// メッセージボックスをキャンセルすると、マクロの終了とする。
-		// (2008.8.5 yutaka)
-		if (ret == IDCANCEL) {
-			TTLStatus = IdTTLEnd;
-		}
-	} else if (BoxId==IdYesNoBox) {
-		ret = OpenMsgDlg(Str1,Str2,TRUE);
-		// メッセージボックスをキャンセルすると、マクロの終了とする。
-		// (2008.8.6 yutaka)
-		if (ret == IDCLOSE) {
-			TTLStatus = IdTTLEnd;
-		}
-		return (ret);
-	}
-	else if (BoxId==IdStatusBox) {
-		OpenStatDlg(Str1,Str2);
-
-	} else if (BoxId==IdListBox) {
-		//  リストボックスの選択肢を取得する。
-		GetStrAryVar(&VarId, Err);
-
-		if (CheckParameterGiven()) {
-			GetIntVal(&sel, Err);
-		}
-		if (*Err==0 && GetFirstChar()!=0)
-			*Err = ErrSyntax;
-		if (*Err!=0) return 0;
-
-		ary_size = GetStrAryVarSize(VarId);
-		if (sel < 0 || sel >= ary_size) {
-			sel = 0;
-		}
-
-		s = (char **)calloc(ary_size + 1, sizeof(char *));
-		if (s == NULL) {
-			*Err = ErrFewMemory;
-			return -1;
-		}
-		for (i = 0 ; i < ary_size ; i++) {
-			VarId2 = GetStrVarFromArray(VarId, i, Err);
-			if (*Err!=0) return -1;
-			s[i] = _strdup(StrVarPtr(VarId2));
-		}
-		if (s[0] == NULL) {
-			*Err = ErrSyntax;
-			return -1;
-		}
-
-		// return 
-		//   0以上: 選択項目
-		//   -1: キャンセル
-		//	 -2: close
-		ret = OpenListDlg(Str1, Str2, s, sel);
-
-		for (i = 0 ; i < ary_size ; i++) {
-			free(s[i]);
-		}
-		free(s);
-
-		// リストボックスの閉じるボタン(&確認ダイアログ)で、マクロの終了とする。
-		if (ret == -2) {
-			TTLStatus = IdTTLEnd;
-		}
-		return (ret);
-
-	}
-	return 0;
-}
-
-// リストボックス
-// (2013.3.13 yutaka)
-WORD TTLListBox()
-{
-	WORD Err;
-	int ret;
-
-	ret = MessageCommand(IdListBox, &Err);
-	SetResult(ret);
-	return Err;
-}
-
-WORD TTLMessageBox()
-{
-	WORD Err;
-
-	MessageCommand(IdMsgBox, &Err);
-	return Err;
-}
-#endif
-
-WORD TTLNext()
-{
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-	return NextLoop();
-}
-
-WORD TTLPause()
-{
-	int TimeOut;
-	WORD Err;
-
-	Err = 0;
-	GetIntVal(&TimeOut,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (TimeOut>0)
-	{
-		TTLStatus = IdTTLPause;
-		TimeLimit = (DWORD)(TimeOut*1000);
-		TimeStart = GetTickCount();
-		SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
-	}
-	return Err;
-}
-
-// add 'mpause' command
-// SYNOPSIS: mpause millisecoand
-// DESCRIPTION: This command would sleep Tera Term macro program by specified millisecond time.
-// (2006.2.10 yutaka)
-WORD TTLMilliPause()
-{
-	int TimeOut;
-	WORD Err;
-
-	Err = 0;
-	GetIntVal(&TimeOut,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (TimeOut > 0) {
-		Sleep(TimeOut);
-	}
-
-	return Err;
-}
-
-
-// add 'random' command
-// SYNOPSIS: random <intvar> <value>
-// DESCRIPTION: 
-// This command generates the random value from 0 to <value> and
-// stores the value to <intvar>.
-// (2006.2.11 yutaka)
-WORD TTLRandom()
-{
-	static int init_done = 0;
-	static sfmt_t sfmt;
-	TVarId VarId;
-	WORD Err;
-	int MaxNum;
-	unsigned int Num, RandMin;
-
-	Err = 0;
-	GetIntVar(&VarId,&Err);
-	GetIntVal(&MaxNum,&Err);
-
-	if ( ((Err==0) && (GetFirstChar()!=0)) || MaxNum <= 0)
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	MaxNum++;
-
-	/* 2**32 % x == (2**32 - x) % x */
-	RandMin = (unsigned int) -MaxNum % MaxNum;
-
-	if (!init_done) {
-		init_done = 1;
-		sfmt_init_gen_rand(&sfmt, (unsigned int)time(NULL));
-	}
-
-	do {
-		Num = sfmt_genrand_uint32(&sfmt);
-	} while (Num < RandMin);
-
-	SetIntVal(VarId, (int)(Num % MaxNum));
-
-	return Err;
-}
-
-WORD TTLRecvLn()
-{
-	TStrVal Str;
-	WORD ValType;
-	TVarId VarId;
-	int TimeOut;
-
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-	if (! Linked)
-		return ErrLinkFirst;
-
-	ClearWait();
-
-	Str[0] = 0x0a;
-	Str[1] = 0;
-	SetWait(1,Str);
-	SetInputStr("");
-	SetResult(1);
-	TTLStatus = IdTTLWaitNL;
-	TimeOut = 0;
-	if (CheckVar("timeout",&ValType,&VarId) && (ValType==TypInteger)) {
-		TimeOut = CopyIntVal(VarId) * 1000;
-	}
-	if (CheckVar("mtimeout",&ValType,&VarId) && (ValType==TypInteger)) {
-		TimeOut += CopyIntVal(VarId);
-	}
-
-	if (TimeOut>0)
-	{
-		TimeLimit = (DWORD)TimeOut;
-		TimeStart = GetTickCount();
-		SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
-	}
-
-	return 0;
-}
-
-WORD TTLRegexOption()
-{
-	TStrVal Str;
-	WORD Err;
-	int opt_none_flag = 0;
-	OnigOptionType new_opt = ONIG_OPTION_NONE;
-	OnigEncoding new_enc = ONIG_ENCODING_UNDEF;
-	OnigSyntaxType *new_syntax = NULL;
-
-	Err = 0;
-
-	while (CheckParameterGiven()) {
-		GetStrVal(Str, &Err);
-		if (Err)
-			return Err;
-
-		// Encoding
-		if (_stricmp(Str, "ENCODING_ASCII")==0 || _stricmp(Str, "ASCII")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ASCII;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_1")==0 || _stricmp(Str, "ISO_8859_1")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_1;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_2")==0 || _stricmp(Str, "ISO_8859_2")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_2;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_3")==0 || _stricmp(Str, "ISO_8859_3")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_3;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_4")==0 || _stricmp(Str, "ISO_8859_4")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_4;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_5")==0 || _stricmp(Str, "ISO_8859_5")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_5;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_6")==0 || _stricmp(Str, "ISO_8859_6")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_6;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_7")==0 || _stricmp(Str, "ISO_8859_7")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_7;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_8")==0 || _stricmp(Str, "ISO_8859_8")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_8;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_9")==0 || _stricmp(Str, "ISO_8859_9")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_9;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_10")==0 || _stricmp(Str, "ISO_8859_10")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_10;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_11")==0 || _stricmp(Str, "ISO_8859_11")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_11;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_13")==0 || _stricmp(Str, "ISO_8859_13")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_13;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_14")==0 || _stricmp(Str, "ISO_8859_14")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_14;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_15")==0 || _stricmp(Str, "ISO_8859_15")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_15;
-		}
-		else if (_stricmp(Str, "ENCODING_ISO_8859_16")==0 || _stricmp(Str, "ISO_8859_16")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_ISO_8859_16;
-		}
-		else if (_stricmp(Str, "ENCODING_UTF8")==0 || _stricmp(Str, "UTF8")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_UTF8;
-		}
-		else if (_stricmp(Str, "ENCODING_UTF16_BE")==0 || _stricmp(Str, "UTF16_BE")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_UTF16_BE;
-		}
-		else if (_stricmp(Str, "ENCODING_UTF16_LE")==0 || _stricmp(Str, "UTF16_LE")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_UTF16_LE;
-		}
-		else if (_stricmp(Str, "ENCODING_UTF32_BE")==0 || _stricmp(Str, "UTF32_BE")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_UTF32_BE;
-		}
-		else if (_stricmp(Str, "ENCODING_UTF32_LE")==0 || _stricmp(Str, "UTF32_LE")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_UTF32_LE;
-		}
-		else if (_stricmp(Str, "ENCODING_EUC_JP")==0 || _stricmp(Str, "EUC_JP")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_EUC_JP;
-		}
-		else if (_stricmp(Str, "ENCODING_EUC_TW")==0 || _stricmp(Str, "EUC_TW")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_EUC_TW;
-		}
-		else if (_stricmp(Str, "ENCODING_EUC_KR")==0 || _stricmp(Str, "EUC_KR")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_EUC_KR;
-		}
-		else if (_stricmp(Str, "ENCODING_EUC_CN")==0 || _stricmp(Str, "EUC_CN")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_EUC_CN;
-		}
-		else if (_stricmp(Str, "ENCODING_SJIS")==0 || _stricmp(Str, "SJIS")==0
-		      || _stricmp(Str, "ENCODING_CP932")==0 || _stricmp(Str, "CP932")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_SJIS;
-		}
-		else if (_stricmp(Str, "ENCODING_KOI8_R")==0 || _stricmp(Str, "KOI8_R")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_KOI8_R;
-		}
-		else if (_stricmp(Str, "ENCODING_CP1251")==0 || _stricmp(Str, "CP1251")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_CP1251;
-		}
-		else if (_stricmp(Str, "ENCODING_BIG5")==0 || _stricmp(Str, "BIG5")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_BIG5;
-		}
-		else if (_stricmp(Str, "ENCODING_GB18030")==0 || _stricmp(Str, "GB18030")==0) {
-			if (new_enc != ONIG_ENCODING_UNDEF)
-				return ErrSyntax;
-			new_enc = ONIG_ENCODING_GB18030;
-		}
-
-		// Syntax
-		else if (_stricmp(Str, "SYNTAX_DEFAULT")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_DEFAULT;
-		}
-		else if (_stricmp(Str, "SYNTAX_ASIS")==0 || _stricmp(Str, "ASIS")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_ASIS;
-		}
-		else if (_stricmp(Str, "SYNTAX_POSIX_BASIC")==0 || _stricmp(Str, "POSIX_BASIC")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_POSIX_BASIC;
-		}
-		else if (_stricmp(Str, "SYNTAX_POSIX_EXTENDED")==0 || _stricmp(Str, "POSIX_EXTENDED")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_POSIX_EXTENDED;
-		}
-		else if (_stricmp(Str, "SYNTAX_EMACS")==0 || _stricmp(Str, "EMACS")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_EMACS;
-		}
-		else if (_stricmp(Str, "SYNTAX_GREP")==0 || _stricmp(Str, "GREP")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_GREP;
-		}
-		else if (_stricmp(Str, "SYNTAX_GNU_REGEX")==0 || _stricmp(Str, "GNU_REGEX")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_GNU_REGEX;
-		}
-		else if (_stricmp(Str, "SYNTAX_JAVA")==0 || _stricmp(Str, "JAVA")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_JAVA;
-		}
-		else if (_stricmp(Str, "SYNTAX_PERL")==0 || _stricmp(Str, "PERL")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_PERL;
-		}
-		else if (_stricmp(Str, "SYNTAX_PERL_NG")==0 || _stricmp(Str, "PERL_NG")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_PERL_NG;
-		}
-		else if (_stricmp(Str, "SYNTAX_RUBY")==0 || _stricmp(Str, "RUBY")==0) {
-			if (new_syntax != NULL)
-				return ErrSyntax;
-			new_syntax = ONIG_SYNTAX_RUBY;
-		}
-
-		// Option
-		else if (_stricmp(Str, "OPTION_NONE")==0) {
-			if (new_opt != ONIG_OPTION_NONE || opt_none_flag != 0)
-				return ErrSyntax;
-			new_opt = ONIG_OPTION_NONE;
-			opt_none_flag = 1;
-		}
-		else if (_stricmp(Str, "OPTION_SINGLELINE")==0 || _stricmp(Str, "SINGLELINE")==0) {
-			new_opt |= ONIG_OPTION_SINGLELINE;
-		}
-		else if (_stricmp(Str, "OPTION_MULTILINE")==0 || _stricmp(Str, "MULTILINE")==0) {
-			new_opt |= ONIG_OPTION_MULTILINE;
-		}
-		else if (_stricmp(Str, "OPTION_IGNORECASE")==0 || _stricmp(Str, "IGNORECASE")==0) {
-			new_opt |= ONIG_OPTION_IGNORECASE;
-		}
-		else if (_stricmp(Str, "OPTION_EXTEND")==0 || _stricmp(Str, "EXTEND")==0) {
-			new_opt |= ONIG_OPTION_EXTEND;
-		}
-		else if (_stricmp(Str, "OPTION_FIND_LONGEST")==0 || _stricmp(Str, "FIND_LONGEST")==0) {
-			new_opt |= ONIG_OPTION_FIND_LONGEST;
-		}
-		else if (_stricmp(Str, "OPTION_FIND_NOT_EMPTY")==0 || _stricmp(Str, "FIND_NOT_EMPTY")==0) {
-			new_opt |= ONIG_OPTION_FIND_NOT_EMPTY;
-		}
-		else if (_stricmp(Str, "OPTION_NEGATE_SINGLELINE")==0 || _stricmp(Str, "NEGATE_SINGLELINE")==0) {
-			new_opt |= ONIG_OPTION_NEGATE_SINGLELINE;
-		}
-		else if (_stricmp(Str, "OPTION_DONT_CAPTURE_GROUP")==0 || _stricmp(Str, "DONT_CAPTURE_GROUP")==0) {
-			new_opt |= ONIG_OPTION_DONT_CAPTURE_GROUP;
-		}
-		else if (_stricmp(Str, "OPTION_CAPTURE_GROUP")==0 || _stricmp(Str, "CAPTURE_GROUP")==0) {
-			new_opt |= ONIG_OPTION_CAPTURE_GROUP;
-		}
-
-		else {
-			return ErrSyntax;
-		}
-	}
-
-
-	if (new_enc != ONIG_ENCODING_UNDEF) {
-		RegexEnc = new_enc;
-	}
-	if (new_syntax != NULL) {
-		RegexSyntax = new_syntax;
-	}
-	if (new_opt != ONIG_OPTION_NONE || opt_none_flag != 0) {
-		RegexOpt = new_opt;
-	}
-
-	return 0;
-}
-
-WORD TTLReturn()
-{
-	if (GetFirstChar()==0)
-		return ReturnFromSub();
-	else
-		return ErrSyntax;
-}
-
-// add 'rotateleft' and 'rotateright' (2007.8.19 maya)
-#define ROTATE_DIR_LEFT 0
-#define ROTATE_DIR_RIGHT 1
-WORD BitRotate(int direction)
-{
-	TVarId VarId;
-	WORD Err;
-	int x, n;
-
-	Err = 0;
-	GetIntVar(&VarId, &Err);
-	GetIntVal(&x, &Err);
-	GetIntVal(&n, &Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (direction == ROTATE_DIR_RIGHT)
-		n = -n;
-
-	n %= INT_BIT;
-
-	if (n < 0)
-		n += INT_BIT;
-
-	if (n == 0) {
-		SetIntVal(VarId, x);
-	} else {
-		SetIntVal(VarId, (x << n) | ((unsigned int)x >> (INT_BIT-n)));
-	}
-	return Err;
-}
-
-WORD TTLRotateLeft()
-{
-	return BitRotate(ROTATE_DIR_LEFT);
-}
-
-WORD TTLRotateRight()
-{
-	return BitRotate(ROTATE_DIR_RIGHT);
-}
-
-WORD TTLSend()
-{
-	TStrVal Str;
-	WORD Err, ValType;
-	int Val;
-	BOOL EndOfLine;
-
-	if (! Linked)
-		return ErrLinkFirst;
-
-	EndOfLine = FALSE;
-	do {
-		if (GetString(Str,&Err))
-		{
-			if (Err!=0) return Err;
-#if 0
-			DDEOut(Str);
-#else
-			const char *StrU8 = ToCharU8(Str);
-			DDEOut(Str);
-			free((void *)Str);
-#endif
-		}
-		else if (GetExpression(&ValType,&Val,&Err))
-		{
-			if (Err!=0) return Err;
-			switch (ValType) {
-				case TypInteger: DDEOut1Byte(LOBYTE(Val)); break;
-				case TypString: DDEOut(StrVarPtr((TVarId)Val)); break;
-				default:
-					return ErrTypeMismatch;
-			}
-		}
-		else
-			EndOfLine = TRUE;
-	} while (! EndOfLine);
-	return 0;
-}
-
-/*
- * src に含まれる 0x01 を 0x01 0x02 に置き換えて dst にコピーする。
- * TStrVal には 0x00 が含まれる事が無い(終端と区別できない)ので 0x00 は考慮する必要なし。
- */
-static void AddBroadcastString(char *dst, int dstlen, char *src)
-{
-	int i;
-
-	i = strlen(dst);
-	dst += i;
-	dstlen -= i;
-
-	while (*src != 0 && dstlen > 1) {
-		if (*src == 0x01) {
-			// 0x01 を格納するには 0x01 0x02 の2バイト + NUL 終端用の1バイトが必要
-			if (dstlen < 3) {
-				break;
-			}
-			*dst++ = *src++;
-			*dst++ = 0x02;
-			dstlen -= 2;
-		}
-		else {
-			*dst++ = *src++;
-			dstlen--;
-		}
-	}
-
-	*dst = 0;
-}
-
-/*
- * TTLSendBroadcast / TTLSendMulticast の下請け
- *
- * 各パラメータを連結した文字列を buff に格納して返す。
- * crlf が TRUE の時は各パラメータの間に "\n" を挟む。(要検討)
- *
- * パラメータが String の場合はそのまま、Integer の場合は ASCII コードとみなしてその文字を送る。
- * Tera Term 側では send 等と共通のルーチンが使われる為、DDE 通信の為のエンコードを行う必要有り。
- *   0x00 -> 0x01 0x01
- *   0x01 -> 0x01 0x02
- */
-static WORD GetBroadcastString(char *buff, int bufflen, BOOL crlf)
-{
-	TStrVal Str;
-	WORD Err, ValType;
-	int Val;
-	char tmp[3];
-
-	buff[0] = '\0';
-
-	while (1) {
-		if (GetString(Str, &Err)) {
-			if (Err!=0) return Err;
-			AddBroadcastString(buff, bufflen, Str);
-		}
-		else if (GetExpression(&ValType, &Val, &Err)) {
-			if (Err!=0) return Err;
-			switch (ValType) {
-				case TypInteger:
-					Val = LOBYTE(Val);
-					if (Val == 0 || Val == 1) {
-						tmp[0] = 1;
-						tmp[1] = Val + 1;
-						tmp[2] = 0;
-					}
-					else {
-						tmp[0] = Val;
-						tmp[1] = 0;
-					}
-					strncat_s(buff, bufflen, tmp, _TRUNCATE);
-					break;
-				case TypString: 
-					AddBroadcastString(buff, bufflen, StrVarPtr((TVarId)Val));
-					break;
-				default:
-					return ErrTypeMismatch;
-			}
-		}
-		else {
-			break;
-		}
-	}
-	if (crlf) {
-		strncat_s(buff, bufflen, "\r\n", _TRUNCATE);
-	}
-	return 0;
-}
-
-// sendbroadcast / sendlnbroadcast の二つから利用 (crlfの値で動作を変える)
-static WORD TTLSendBroadcast(BOOL crlf)
-{
-	TStrVal buf;
-	WORD Err;
-
-	if (! Linked)
-		return ErrLinkFirst;
-
-	if ((Err = GetBroadcastString(buf, MaxStrLen, crlf)) != 0)
-		return Err;
-
-	SetFile(buf);
-	return SendCmnd(CmdSendBroadcast, 0);
-}
-
-WORD TTLSetMulticastName()
-{
-	TStrVal Str;
-	WORD Err;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	if (Err!=0) return Err;
-
-	SetFile(Str);
-	return SendCmnd(CmdSetMulticastName, 0);
-}
-
-// sendmulticast / sendlnmulticast の二つから利用 (crlfの値で動作を変える)
-WORD TTLSendMulticast(BOOL crlf)
-{
-	TStrVal buf, Str;
-	WORD Err;
-
-	if (! Linked)
-		return ErrLinkFirst;
-
-	// マルチキャスト識別用の名前を取得する。
-	Err = 0;
-	GetStrVal(Str,&Err);
-	if (Err!=0) return Err;
-	SetFile(Str);
-
-	if ((Err = GetBroadcastString(buf, MaxStrLen, crlf)) != 0)
-		return Err;
-
-	SetSecondFile(buf);
-	return SendCmnd(CmdSendMulticast, 0);
-}
-
-WORD TTLSendFile()
-{
-	TStrVal Str;
-	WORD Err;
-	int BinFlag;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	GetIntVal(&BinFlag,&Err);
-	if ((Err==0) &&
-	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-
-	if (Err!=0) return Err;
-
-	SetFile(Str);
-	SetBinary(BinFlag);
-	return SendCmnd(CmdSendFile,IdTTLWaitCmndEnd);
-}
-
-WORD TTLSendKCode()
-{
-	TStrVal Str;
-	WORD Err;
-	int KCode, Count;
-
-	Err = 0;
-	GetIntVal(&KCode,&Err);
-	GetIntVal(&Count,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	Word2HexStr((WORD)KCode,Str);
-	Word2HexStr((WORD)Count,&Str[4]);
-	SetFile(Str);
-	return SendCmnd(CmdSendKCode,0);
-}
-
-WORD TTLSendLn()
-{
-	WORD Err;
-	char Str[3];
-
-	Err = TTLSend();
-	if (Err==0)
-	{
-		Str[0] = 0x0D;
-		Str[1] = 0x0A;
-		Str[2] = 0;
-		if (Linked)
-			DDEOut(Str);
-		else
-			Err = ErrLinkFirst;
-	}
-	return Err;
-}
-
-WORD TTLSetDate()
-{
-	WORD Err;
-	TStrVal Str;
-	int y, m, d;
-	SYSTEMTIME Time;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	Str[4] = 0;
-	if (sscanf(Str,"%u",&y)!=1) return 0;
-	Str[7] = 0;
-	if (sscanf(&(Str[5]),"%u",&m)!=1) return 0;
-	Str[10] = 0;
-	if (sscanf(&(Str[8]),"%u",&d)!=1) return 0;
-	GetLocalTime(&Time);
-	Time.wYear = y;
-	Time.wMonth = m;
-	Time.wDay = d;
-	SetLocalTime(&Time);
-	return Err;
-}
-
-WORD TTLSetDir()
-{
-	WORD Err;
-	TStrVal Str;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	TTMSetDir(Str);
-
-	return Err;
-}
-
-WORD TTLSetDlgPos()
-{
-	WORD Err;
-	int x, y;
-
-	Err = 0;
-	GetIntVal(&x,&Err);
-	GetIntVal(&y,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	SetDlgPos(x,y);
-	return Err;
-}
-
-// reactivate 'setenv' (2007.8.31 maya)
-WORD TTLSetEnv()
-{
-	WORD Err;
-	TStrVal Str, Str2;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	GetStrVal(Str2,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	_putenv_s(Str,Str2);
-	return Err;
-}
-
-WORD TTLSetExitCode()
-{
-	WORD Err;
-	int Val;
-
-	Err = 0;
-	GetIntVal(&Val,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	ExitCode = Val;
-	return Err;
-}
-
-WORD TTLSetFileAttr()
-{
-	WORD Err;
-	TStrVal Filename;
-	int attributes;
-
-	Err = 0;
-	GetStrVal(Filename,&Err);
-	GetIntVal(&attributes,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (SetFileAttributes(Filename, attributes) == 0) {
-		SetResult(0);
-	}
-	else {
-		SetResult(1);
-	}
-
-	return Err;
-}
-
-WORD TTLSetSync()
-{
-	WORD Err;
-	int Val;
-
-	Err = 0;
-	GetIntVal(&Val,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err!=0) return Err;
-
-	if (Val==0)
-		SetSync(FALSE);
-	else
-		SetSync(TRUE);
-
-	return 0;
-}
-
-WORD TTLSetTime()
-{
-	WORD Err;
-	TStrVal Str;
-	int h, m, s;
-	SYSTEMTIME Time;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	Str[2] = 0;
-	if (sscanf(Str,"%u",&h)!=1) return 0;
-	Str[5] = 0;
-	if (sscanf(&(Str[3]),"%u",&m)!=1) return 0;
-	Str[8] = 0;
-	if (sscanf(&(Str[6]),"%u",&s)!=1) return 0;
-
-	GetLocalTime(&Time);
-	Time.wHour = h;
-	Time.wMinute = m;
-	Time.wSecond = s;
-	SetLocalTime(&Time);
-
-	return Err;
-}
-
-WORD TTLShow()
-{
-	WORD Err;
-	int Val;
-
-	Err = 0;
-	GetIntVal(&Val,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	if (Val==0)
-		ShowWindow(HMainWin,SW_MINIMIZE);
-	else if (Val>0) {
-		ShowWindow(HMainWin,SW_RESTORE);
-		PostMessage(HMainWin, WM_USER_MACROBRINGUP, 0, 0);
-	}
-	else
-		ShowWindow(HMainWin,SW_HIDE);
-	return Err;
-}
-
-// 'sprintf': Format a string in the style of sprintf
-//
-// (2007.5.1 yutaka)
-// (2007.5.3 maya)
-WORD TTLSprintf(int getvar)
-{
-	TStrVal Fmt;
-	int Num, NumWidth, NumPrecision;
-	TStrVal Str;
-	WORD Err = 0, TmpErr;
-	TVarId VarId;
-	char buf[MaxStrLen];
-	char *p, subFmt[MaxStrLen], buf2[MaxStrLen];
-	int width_asterisk, precision_asterisk, reg_beg, reg_end, reg_len, i;
-	char *match_str;
-
-	enum arg_type {
-		INTEGER,
-		DOUBLE,
-		STRING,
-		NONE
-	};
-	enum arg_type type;
-
-	int r;
-	unsigned char *start, *range, *end;
-	regex_t* reg;
-	OnigErrorInfo einfo;
-	OnigRegion *region;
-	UChar* pattern, * str;
-
-	if (getvar) {
-		GetStrVar(&VarId, &Err);
-		if (Err!=0) {
-			SetResult(4);
-			return Err;
-		}
-	}
-
-//	pattern = (UChar* )"^%[-+0 #]*(?:[1-9][0-9]*)?(?:\\.[0-9]*)?$";
-	pattern = (UChar* )"^%[-+0 #]*([1-9][0-9]*|\\*)?(?:\\.([0-9]*|\\*))?$";
-	//               flags--------
-	//                       width------------------
-	//                                     precision--------------------
-
-	r = onig_new(&reg, pattern, pattern + strlen(pattern),
-	             ONIG_OPTION_NONE, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT,
-	             &einfo);
-	if (r != ONIG_NORMAL) {
-		char s[ONIG_MAX_ERROR_MESSAGE_LEN];
-		onig_error_code_to_str(s, r, &einfo);
-		fprintf(stderr, "ERROR: %s\n", s);
-		SetResult(-1);
-		goto exit2;
-	}
-
-	region = onig_region_new();
-
-	GetStrVal(Fmt, &Err);
-	if (Err!=0) {
-		SetResult(1);
-		goto exit2;
-	}
-
-	p = Fmt;
-	memset(buf, 0, sizeof(buf));
-	memset(subFmt, 0, sizeof(subFmt));
-	while(*p != '\0') {
-		if (strlen(subFmt)>0) {
-			type = NONE;
-			switch (*p) {
-				case '%':
-					if (strlen(subFmt) == 1) { // "%%" -> "%"
-						strncat_s(buf, sizeof(buf), "%", _TRUNCATE);
-						memset(subFmt, 0, sizeof(subFmt));
-					}
-					else {
-						// 一つ手前までをそのまま buf に格納
-						strncat_s(buf, sizeof(buf), subFmt, _TRUNCATE);
-						// 仕切り直し
-						memset(subFmt, 0, sizeof(subFmt));
-						strncat_s(subFmt, sizeof(subFmt), p, 1);
-					}
-					break;
-
-				case 'c':
-				case 'd':
-				case 'i':
-				case 'o':
-				case 'u':
-				case 'x':
-				case 'X':
-					type = INTEGER;
-
-				case 'e':
-				case 'E':
-				case 'f':
-				case 'g':
-				case 'G':
-				case 'a':
-				case 'A':
-					if (type == NONE) {
-						type = DOUBLE;
-					}
-
-				case 's':
-					if (type == NONE) {
-						type = STRING;
-					}
-
-					// "%" と *p の間が正しいかチェック
-					str = (UChar* )subFmt;
-					end   = str + strlen(subFmt);
-					start = str;
-					range = end;
-					r = onig_search(reg, str, end, start, range, region,
-					                ONIG_OPTION_NONE);
-					if (r != 0) {
-						SetResult(2);
-						Err = ErrSyntax;
-						goto exit1;
-					}
-
-					strncat_s(subFmt, sizeof(subFmt), p, 1);
-
-					// width, precision が * かどうかチェック
-					width_asterisk = precision_asterisk = 0;
-					if (region->num_regs != 3) {
-						SetResult(-1);
-						goto exit2;
-					}
-					reg_beg = region->beg[1];
-					reg_end = region->end[1];
-					reg_len = reg_end - reg_beg;
-					match_str = (char*)calloc(reg_len + 1, sizeof(char));
-					for (i = 0; i < reg_len; i++) {
-						match_str[i] = str[reg_beg + i];
-					}
-					if (strcmp(match_str, "*") == 0) {
-						width_asterisk = 1;
-					}
-					free(match_str);
-					reg_beg = region->beg[2];
-					reg_end = region->end[2];
-					reg_len = reg_end - reg_beg;
-					match_str = (char*)calloc(reg_len + 1, sizeof(char));
-					for (i = 0; i < reg_len; i++) {
-						match_str[i] = str[reg_beg + i];
-					}
-					if (strcmp(match_str, "*") == 0) {
-						precision_asterisk = 1;
-					}
-					free(match_str);
-
-					// * に対応する引数を取得
-					if (width_asterisk) {
-						TmpErr = 0;
-						GetIntVal(&NumWidth, &TmpErr);
-						if (TmpErr != 0) {
-							SetResult(3);
-							Err = TmpErr;
-							goto exit1;
-						}
-					}
-					if (precision_asterisk) {
-						TmpErr = 0;
-						GetIntVal(&NumPrecision, &TmpErr);
-						if (TmpErr != 0) {
-							SetResult(3);
-							Err = TmpErr;
-							goto exit1;
-						}
-					}
-
-					if (type == STRING || type == DOUBLE) {
-						// 文字列として読めるかトライ
-						TmpErr = 0;
-						GetStrVal(Str, &TmpErr);
-						if (TmpErr == 0) {
-							if (type == STRING) {
-								if (!width_asterisk && !precision_asterisk) {
-									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, Str);
-								}
-								else if (width_asterisk && !precision_asterisk) {
-									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, Str);
-								}
-								else if (!width_asterisk && precision_asterisk) {
-									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, Str);
-								}
-								else { // width_asterisk && precision_asterisk
-									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, Str);
-								}
-							}
-							else { // DOUBLE
-								if (!width_asterisk && !precision_asterisk) {
-									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, atof(Str));
-								}
-								else if (width_asterisk && !precision_asterisk) {
-									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, atof(Str));
-								}
-								else if (!width_asterisk && precision_asterisk) {
-									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, atof(Str));
-								}
-								else { // width_asterisk && precision_asterisk
-									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, atof(Str));
-								}
-							}
-						}
-						else {
-							SetResult(3);
-							Err = TmpErr;
-							goto exit1;
-						}
-					}
-					else {
-						// 数値として読めるかトライ
-						TmpErr = 0;
-						GetIntVal(&Num, &TmpErr);
-						if (TmpErr == 0) {
-							if (!width_asterisk && !precision_asterisk) {
-								_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, Num);
-							}
-							else if (width_asterisk && !precision_asterisk) {
-								_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, Num);
-							}
-							else if (!width_asterisk && precision_asterisk) {
-								_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, Num);
-							}
-							else { // width_asterisk && precision_asterisk
-								_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, Num);
-							}
-						}
-						else {
-							SetResult(3);
-							Err = TmpErr;
-							goto exit1;
-						}
-					}
-
-					strncat_s(buf, sizeof(buf), buf2, _TRUNCATE);
-					memset(subFmt, 0, sizeof(subFmt));
-					onig_region_free(region, 0);
-					break;
-
-				default:
-					strncat_s(subFmt, sizeof(subFmt), p, 1);
-			}
-		}
-		else if (*p == '%') {
-			strncat_s(subFmt, sizeof(subFmt), p, 1);
-		}
-		else if (strlen(buf) < sizeof(buf)-1) {
-			strncat_s(buf, sizeof(buf), p, 1);
-		}
-		else {
-			break;
-		}
-		p++;
-	}
-	if (strlen(subFmt) > 0) {
-		strncat_s(buf, sizeof(buf), subFmt, _TRUNCATE);
-	}
-
-	if (getvar) {
-		SetStrVal(VarId, buf);
-	}
-	else {
-		// マッチした行を inputstr へ格納する
-		SetInputStr(buf);  // ここでバッファがクリアされる
-	}
-	SetResult(0);
-
-exit1:
-	onig_region_free(region, 1);
-exit2:
-	onig_free(reg);
-	onig_end();
-
-	return Err;
-}
-
-WORD TTLStatusBox()
-{
-	WORD Err;
-
-	MessageCommand(IdStatusBox, &Err);
-	return Err;
-}
-
-WORD TTLStr2Code()
-{
-	TVarId VarId;
-	WORD Err;
-	TStrVal Str;
-	int Len, c, i;
-	unsigned int Num;
-
-	Err = 0;
-	GetIntVar(&VarId,&Err);
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-
-	if (Err!=0) return Err;
-
-	Len = strlen(Str);
-	if (Len > sizeof(Num))
-		c = sizeof(Num);
-	else
-		c = Len;
-	Num = 0;
-	for (i=c; i>=1; i--)
-		Num = Num*256 + (BYTE)Str[Len-i];
-	SetIntVal(VarId,Num);
-
-	return Err;
-}
-
-WORD TTLStr2Int()
-{
-	TVarId VarId;
-	WORD Err;
-	TStrVal Str;
-	int Num;
-
-	Err = 0;
-	GetIntVar(&VarId,&Err);
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-
-	if (Err!=0) return Err;
-
-	// C言語では16進は0xで始まるが、TTL仕様では $ で始まるため、後者もサポートする。
-	if (Str[0] == '$') {
-		memmove_s(Str + 2, sizeof(Str) - 2, Str + 1, strlen(Str));
-		Str[0] = '0';
-		Str[1] = 'x';
-	}
-
-	// '%d'から'%i'へ変更により、10進以外の数値を変換できるようにする。 (2007.5.1 yutaka)
-	// 下位互換性のため10進と16進のみのサポートとする。(2007.5.2 yutaka)
-	// 10 : decimal
-	// 0x10, $10: hex
-	if (Str[0] == '0' && tolower(Str[1]) == 'x') {
-		if (sscanf(Str,"%i",&Num)!=1)
-		{
-			Num = 0;
-			SetResult(0);
-		}
-		else {
-			SetResult(1);
-		}
-	} else {
-		if (sscanf(Str,"%d",&Num)!=1)
-		{
-			Num = 0;
-			SetResult(0);
-		}
-		else {
-			SetResult(1);
-		}
-	}
-	SetIntVal(VarId,Num);
-
-	return Err;
-}
-
-WORD TTLStrCompare()
-{
-	TStrVal Str1, Str2;
-	WORD Err;
-	int i;
-
-	Err = 0;
-	GetStrVal(Str1,&Err);
-	GetStrVal(Str2,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	i = strcmp(Str1,Str2);
-	if (i<0)
-		i = -1;
-	else if (i>0)
-		i = 1;
-	SetResult(i);
-	return Err;
-}
-
-WORD TTLStrConcat()
-{
-	TVarId VarId;
-	WORD Err;
-	TStrVal Str;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	strncat_s(StrVarPtr(VarId),MaxStrLen,Str,_TRUNCATE);
-	return Err;
-}
-
-WORD TTLStrCopy()
-{
-	WORD Err;
-	TVarId VarId;
-	int From, Len, SrcLen;
-	TStrVal Str;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	GetIntVal(&From,&Err);
-	GetIntVal(&Len,&Err);
-	GetStrVar(&VarId,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (From<1) From = 1;
-	SrcLen = strlen(Str)-From+1;
-	if (Len > SrcLen) Len = SrcLen;
-	if (Len < 0) Len = 0;
-	memcpy(StrVarPtr(VarId),&(Str[From-1]),Len);
-	StrVarPtr(VarId)[Len] = 0;
-	return Err;
-}
-
-WORD TTLStrLen()
-{
-	WORD Err;
-	TStrVal Str;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-	SetResult(strlen(Str));
-	return Err;
-}
-
-/*
-  書式: strmatch <文字列> <正規表現>
-  <文字列>に<正規表現>がマッチするか調べるコマンド(awkのmatch関数相当)。
-  resultには、マッチした位置をセット(マッチしない場合は0)。
-  マッチした場合は、waitregexと同様にmatchstr,groupmatchstr1-9をセット。
- */
-WORD TTLStrMatch()
-{
-	WORD Err;
-	TStrVal Str1, Str2;
-	int ret, result;
-
-	Err = 0;
-	GetStrVal(Str1,&Err);   // target string
-	GetStrVal(Str2,&Err);   // regex pattern
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	ret = FindRegexStringOne(Str2, strlen(Str2), Str1, strlen(Str1));
-	if (ret > 0) { // matched
-		result = ret; 
-	} else {
-		result = 0;
-	}
-
-	// FindRegexStringOneの中でUnlockVar()されてしまうので、LockVar()しなおす。
-	LockVar();
-
-	SetResult(result);
-
-	return Err;
-}
-
-WORD TTLStrScan()
-{
-	WORD Err;
-	TStrVal Str1, Str2;
-	char *p;
-
-	Err = 0;
-	GetStrVal(Str1,&Err);
-	GetStrVal(Str2,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if ((Str1[0] == 0) || (Str2[0] == 0)) {
-		SetResult(0);
-		return Err;
-	}
-
-	if ((p = _mbsstr(Str1, Str2)) != NULL) {
-		SetResult(p - Str1 + 1);
-	}
-	else {
-		SetResult(0);
-	}
-	return Err;
-}
-
-static void insert_string(char *str, int index, char *addstr)
-{
-	char *np;
-	int srclen;
-	int addlen;
-
-	srclen = strlen(str);
-	addlen = strlen(addstr);
-
-	// まずは挿入される箇所以降のデータを、後ろに移動する。
-	np = str + (index - 1);
-	memmove_s(np + addlen, MaxStrLen, np, srclen - (index - 1));
-
-	// 文字列を挿入する
-	memcpy(np, addstr, addlen);
-
-	// null-terminate
-	str[srclen + addlen] = '\0';
-}
-
-WORD TTLStrInsert()
-{
-	WORD Err;
-	TVarId VarId;
-	int Index;
-	TStrVal Str;
-	int srclen, addlen;
-	char *srcptr;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetIntVal(&Index,&Err);
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	srcptr = StrVarPtr(VarId);
-	srclen = strlen(srcptr);
-	if (Index <= 0 || Index > srclen+1) {
-		Err = ErrSyntax;
-	}
-	addlen = strlen(Str);
-	if (srclen + addlen + 1 > MaxStrLen) {
-		Err = ErrSyntax;
-	}
-	if (Err!=0) return Err;
-
-	insert_string(srcptr, Index, Str);
-
-	return Err;
-}
-
-// 文字列 str の index 文字目(1オリジン)から len 文字削除する
-static void remove_string(char *str, int index, int len)
-{
-	char *np;
-	int srclen, copylen;
-
-	srclen = strlen(str);
-
-	if (len <=0 || index <= 0 || (index-1 + len) > srclen) {
-		return;
-	}
-
-	/*
-	   remove_string(str, 6, 4);
-
-	   <------------>srclen
-			 <-->len
-	   XXXXXX****YYY
-	        ^index(np)
-			     ^np+len 
-				 <-->srclen - len - index
-		    ↓
-	   XXXXXXYYY
-	 */
-
-	np = str + (index - 1);
-	copylen = srclen - len - (index - 1);
-	if (copylen > 0)
-		memmove_s(np, MaxStrLen, np + len, copylen);
-
-	// null-terminate
-	str[srclen - len] = '\0';
-}
-
-WORD TTLStrRemove()
-{
-	WORD Err;
-	TVarId VarId;
-	int Index, Len;
-	int srclen;
-	char *srcptr;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetIntVal(&Index,&Err);
-	GetIntVal(&Len,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	srcptr = StrVarPtr(VarId);
-	srclen = strlen(srcptr);
-	if (Len <=0 || Index <= 0 || (Index-1 + Len) > srclen) {
-		Err = ErrSyntax;
-	}
-	if (Err!=0) return Err;
-
-	remove_string(srcptr, Index, Len);
-
-	return Err;
-}
-
-WORD TTLStrReplace()
-{
-	WORD Err, VarType;
-	TVarId VarId;
-	TStrVal oldstr;
-	TStrVal newstr;
-	TStrVal tmpstr;
-	char *srcptr, *matchptr;
-	char *p;
-	int srclen, oldlen, matchlen;
-	int pos, ret;
-	int result = 0;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetIntVal(&pos,&Err);
-	GetStrVal(oldstr,&Err);
-	GetStrVal(newstr,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	srcptr = StrVarPtr(VarId);
-	srclen = strlen(srcptr);
-
-	if (pos > srclen || pos <= 0) {
-		result = 0;
-		goto error;
-	}
-	pos--;
-
-	strncpy_s(tmpstr, MaxStrLen, srcptr, _TRUNCATE);
-
-	oldlen = strlen(oldstr);
-
-	// strptr文字列の pos 文字目以降において、oldstr を探す。
-	p = tmpstr + pos;
-	ret = FindRegexStringOne(oldstr, oldlen, p, strlen(p));
-	// FindRegexStringOneの中でUnlockVar()されてしまうので、LockVar()しなおす。
-	LockVar();
-	if (ret == 0) {
-		// 見つからなかった場合は、"0"で戻る。
-		result = 0;
-		goto error;
-	}
-	else if (ret < 0) {
-		// 正しくない正規表現等でエラーの場合は -1 を返す
-		result = -1;
-		goto error;
-	}
-	ret--;
-
-	if (CheckVar("matchstr",&VarType,&VarId) &&
-		(VarType==TypString)) {
-		matchptr = StrVarPtr(VarId);
-		matchlen = strlen(matchptr);
-	} else {
-		result = 0;
-		goto error;
-	}
-
-	strncpy_s(srcptr, MaxStrLen, tmpstr, pos + ret);
-	strncat_s(srcptr, MaxStrLen, newstr, _TRUNCATE);
-	strncat_s(srcptr, MaxStrLen, tmpstr + pos + ret + matchlen, _TRUNCATE);
-
-	result = 1;
-
-error:
-	SetResult(result);
-	return Err;
-}
-
-WORD TTLStrSpecial()
-{
-	WORD Err;
-	TVarId VarId;
-	TStrVal srcstr;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	if (Err!=0) return Err;
-
-	if (CheckParameterGiven()) { // strspecial strvar strval
-		GetStrVal(srcstr,&Err);
-		if ((Err==0) && (GetFirstChar()!=0))
-			Err = ErrSyntax;
-		if (Err!=0) {
-			return Err;
-		}
-
-		RestoreNewLine(srcstr);
-		SetStrVal(VarId, srcstr);
-	}
-	else { // strspecial strvar
-		RestoreNewLine(StrVarPtr(VarId));
-	}
-
-	return Err;
-}
-
-WORD TTLStrTrim()
-{
-	TStrVal trimchars;
-	WORD Err;
-	TVarId VarId;
-	int srclen;
-	int i, start, end;
-	char *srcptr, *p;
-	char table[256];
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetStrVal(trimchars,&Err);
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	srcptr = StrVarPtr(VarId);
-	srclen = strlen(srcptr);
-
-	// 削除する文字のテーブルを作る。
-	memset(table, 0, sizeof(table));
-	for (p = trimchars; *p ; p++) {
-		table[*p] = 1;
-	}
-
-	// 文字列の先頭から検索する
-	for (i = 0 ; i < srclen ; i++) {
-		if (table[srcptr[i]] == 0) 
-			break;
-	}
-	// 削除されない有効な文字列の始まり。
-	// すべて削除対象となる場合は、start == srclen 。
-	start = i;  
-
-	// 文字列の末尾から検索する
-	for (i = srclen - 1 ; i >= 0 ; i--) {
-		if (table[srcptr[i]] == 0) 
-			break;
-	}
-	// 削除されない有効な文字列の終わり。
-	// すべて削除対象となる場合は、end == -1 。
-	end = i;
-
-	// 末尾を削る
-	srcptr[end + 1] = '\0';
-
-	// 次に、先頭から削る。
-	remove_string(srcptr, 1, start);
-
-	return Err;
-}
-
-WORD TTLStrSplit()
-{
-#define MAXVARNUM 9
-	TStrVal src, delimchars, buf;
-	WORD Err;
-	int maxvar;
-	int srclen, len;
-	int i, count;
-	BOOL ary = FALSE, omit = FALSE;
-	char *p;
-	char /* *last, */ *tok[MAXVARNUM];
-
-	Err = 0;
-	GetStrVal(src,&Err);
-	GetStrVal(delimchars,&Err);
-	// 3rd arg (optional)
-	if (CheckParameterGiven()) {
-		GetIntVal(&maxvar,&Err);
-		if (Err!=0) {
-			// TODO array
-#if 0
-			Err = 0;
-			// Parameter から array を受け取る
-			if (Err==0) {
-				ary = TRUE;
-			}
-#endif
-		}
-	}
-	else {
-		maxvar = 9;
-		omit = TRUE;
-	}
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (!ary && (maxvar < 1 || maxvar > MAXVARNUM) )
-		return ErrSyntax;
-
-	// デリミタは1文字のみとする。
-	len = strlen(delimchars);
-	if (len != 1)
-		return ErrSyntax;
-
-	srclen = strlen(src);
-	strcpy_s(buf, MaxStrLen, src);  /* 破壊されてもいいように、コピーバッファを使う。*/
-
-#if 0
-	// トークンの切り出しを行う。
-	memset(tok, 0, sizeof(tok));
-#if 0
-	tok[0] = strtok_s(srcptr, delimchars, &last);
-	for (i = 1 ; i < MAXVARNUM ; i++) {
-		tok[i] = strtok_s(NULL, delimchars, &last);
-		if (tok[i] == NULL)
-			break;
-	} 
-#else
-	/* strtokを使うと、連続した区切りが1つに丸められるため、自前でポインタを
-	 * たどる。ただし、区切り文字は1つのみとする。
-	 */
-	i = 0;
-	for (p = buf; *p == delimchars[0] ; p++) {
-		tok[i++] = NULL;
-		if (i >= maxvar)
-			goto end;
-	}
-	
-	for (p = strtok_s(p, delimchars, &last); p != NULL ; p = strtok_s(NULL, delimchars, &last) ) {
-		tok[i++] = p;
-		if (i >= maxvar)
-			goto end;
-		for (p += strlen(p) + 1 ; *p == delimchars[0] ; p++) {
-			tok[i++] = NULL;
-			if (i >= maxvar)
-				goto end;
-		}
-	}
-#endif
-#else
-	if (ary) {
-		// TODO array
-	}
-	else {
-		p = buf;
-		count = 1;
-		tok[count-1] = p;
-		for (i=0; i < srclen && count < maxvar + omit; i++) { // count 省略時には、超過分を捨てるため 1 つ余分に進める
-			if (*p == *delimchars) {
-				*p = '\0';
-				count++;
-				if (count <= MAXVARNUM) { // tok の要素数を超えて代入しないようにする(count 省略時のため)
-					tok[count-1] = p+1;
-				}
-			}
-			p++;
-		}
-	}
-#endif
-
-//end:
-	// 結果の格納
-	for (i = 1 ; i <= count ; i++) {
-		SetGroupMatchStr(i, tok[i-1]);
-	}
-	for (i = count+1 ; i <= MAXVARNUM ; i++) {
-		SetGroupMatchStr(i, "");
-	}
-	SetResult(count);
-	return Err;
-#undef MAXVARNUM
-}
-
-WORD TTLStrJoin()
-{
-#define MAXVARNUM 9
-	TStrVal delimchars, buf;
-	WORD Err;
-	TVarId VarId;
-	WORD VarType;
-	int maxvar;
-	int srclen;
-	int i;
-	BOOL ary = FALSE;
-	char *srcptr, *p;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetStrVal(delimchars,&Err);
-	// 3rd arg (optional)
-	if (CheckParameterGiven()) {
-		GetIntVal(&maxvar,&Err);
-		if (Err!=0) {
-			// TODO array
-#if 0
-			Err = 0;
-			// Parameter から array を受け取る
-			if (Err==0) {
-				ary = TRUE;
-			}
-#endif
-		}
-	}
-	else {
-		maxvar = 9;
-	}
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if (!ary && (maxvar < 1 || maxvar > MAXVARNUM) )
-		return ErrSyntax;
-
-	srcptr = StrVarPtr(VarId);
-	srclen = strlen(srcptr);
-
-	srcptr[0] = '\0';
-	if (ary) {
-		// TODO array
-	}
-	else {
-		for (i = 0 ; i < maxvar ; i++) {
-			_snprintf_s(buf, sizeof(buf), _TRUNCATE, "groupmatchstr%d", i + 1);
-			if (CheckVar(buf,&VarType,&VarId)) {
-				if (VarType!=TypString)
-					return ErrSyntax;
-				p = StrVarPtr(VarId);
-				strncat_s(srcptr, MaxStrLen, p, _TRUNCATE);
-				if (i < maxvar-1) {
-					strncat_s(srcptr, MaxStrLen, delimchars, _TRUNCATE);
-				}
-			}
-		}
-	}
-
-	return Err;
-#undef MAXVARNUM
-}
-
-WORD TTLTestLink()
-{
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-
-	if (! Linked)
-		SetResult(0);
-	else if (ComReady==0)
-		SetResult(1);
-	else
-		SetResult(2);
-
-	return 0;
-}
-
-// added (2007.7.12 maya)
-WORD TTLToLower()
-{
-	WORD Err;
-	TVarId VarId;
-	TStrVal Str;
-	int i=0;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	while (Str[i] != 0) {
-		if(_ismbblead(Str[i])) {
-			i = i + 2;
-			continue;
-		}
-		if (Str[i] >= 'A' && Str[i] <= 'Z') {
-			Str[i] = Str[i] + 0x20;
-		}
-		i++;
-	}
-
-	strncpy_s(StrVarPtr(VarId), MaxStrLen, Str, _TRUNCATE);
-	return Err;
-}
-
-// added (2007.7.12 maya)
-WORD TTLToUpper()
-{
-	WORD Err;
-	TVarId VarId;
-	TStrVal Str;
-	int i=0;
-
-	Err = 0;
-	GetStrVar(&VarId,&Err);
-	GetStrVal(Str,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	while (Str[i] != 0) {
-		if(_ismbblead(Str[i])) {
-			i = i + 2;
-			continue;
-		}
-		if (Str[i] >= 'a' && Str[i] <= 'z') {
-			Str[i] = Str[i] - 0x20;
-		}
-		i++;
-	}
-
-	strncpy_s(StrVarPtr(VarId), MaxStrLen, Str, _TRUNCATE);
-	return Err;
-}
-
-WORD TTLUnlink()
-{
-	if (GetFirstChar()!=0)
-		return ErrSyntax;
-
-	if (Linked)
-	{
-		EndDDE();
-	}
-	return 0;
-}
-
-
-WORD TTLUptime()
-{
-	WORD Err;
-	TVarId VarId;
-	DWORD tick;
-
-	Err = 0;
-	GetIntVar(&VarId,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	// Windows OSが起動してからの経過時間(ミリ秒)を取得する。ただし、49日を経過すると、0に戻る。
-	// GetTickCount64() API(Vista以降)を使うと、オーバーフローしなくなるが、そもそもTera Termでは
-	// 64bit変数をサポートしていないので、意味がない。
-	tick = GetTickCount();
-
-	SetIntVal(VarId, tick);
-
-	return Err;
-}
-
-
-
-WORD TTLWait(BOOL Ln)
-{
-	TStrVal Str;
-	WORD Err, ValType;
-	TVarId VarId;
-	int i, Val;
-	int TimeOut;
-
-	ClearWait();
-
-	for (i=0; i<10; i++) {
-		Err = 0;
-		if (GetString(Str, &Err)) {
-			SetWait(i+1, Str);
-		}
-		else if (GetExpression(&ValType, &Val, &Err) && Err == 0) {
-			if (ValType == TypString)
-				SetWait(i+1, StrVarPtr((TVarId)Val));
-			else
-				Err = ErrTypeMismatch;
-		}
-		else
-			break;
-
-		if (Err)
-			break;
-	}
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-
-	if (! Linked)
-		Err = ErrLinkFirst;
-
-	if ((Err==0) && (i>0))
-	{
-		if (Ln)
-			TTLStatus = IdTTLWaitLn;
-		else
-			TTLStatus = IdTTLWait;
-		TimeOut = 0;
-		if (CheckVar("timeout",&ValType,&VarId) && (ValType==TypInteger)) {
-			TimeOut = CopyIntVal(VarId) * 1000;
-		}
-		if (CheckVar("mtimeout",&ValType,&VarId) && (ValType==TypInteger)) {
-			TimeOut += CopyIntVal(VarId);
-		}
-
-		if (TimeOut>0)
-		{
-			TimeLimit = (DWORD)TimeOut;
-			TimeStart = GetTickCount();
-			SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
-		}
-	}
-	else
-		ClearWait();
-
-	return Err;
-}
-
-
-WORD TTLWait4all(BOOL Ln)
-{
-	WORD Err = 0;
-
-	Err = TTLWait(Ln);
-	TTLStatus = IdTTLWait4all;
-
-	Wait4allGotIndex = FALSE;
-	Wait4allFoundNum = 0;
-
-	return Err;
-}
-
-
-// 'waitregex'(wait regular expression): wait command with regular expression
-//
-// This command has almost same function of 'wait' command. Additionally 'waitregex' can search 
-// the keyword with regular expression. Tera Term uses a regex library that is called 'Oniguruma'.
-// cf. http://www.geocities.jp/kosako3/oniguruma/
-//
-// (2005.10.5 yutaka)
-WORD TTLWaitRegex(BOOL Ln)
-{
-	WORD ret;
-
-	ret = TTLWait(Ln);
-
-	RegexActionType = REGEX_WAIT; // regex enabled
-
-	return (ret);
-}
-
-
-
-WORD TTLWaitEvent()
-{
-	WORD Err, ValType;
-	TVarId VarId;
-	int TimeOut;
-
-	Err = 0;
-	GetIntVal(&WakeupCondition,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	WakeupCondition &= 15;
-	TimeOut = 0;
-	if (CheckVar("timeout",&ValType,&VarId) && (ValType==TypInteger)) {
-		TimeOut = CopyIntVal(VarId) * 1000;
-	}
-	if (CheckVar("mtimeout",&ValType,&VarId) && (ValType==TypInteger)) {
-		TimeOut += CopyIntVal(VarId);
-	}
-
-	if (TimeOut>0)
-	{
-		TimeLimit = (DWORD)TimeOut;
-		TimeStart = GetTickCount();
-		SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
-	}
-
-	TTLStatus = IdTTLSleep;
-	return Err;
-}
-
-
-WORD TTLWaitN()
-{
-	WORD Err, ValType;
-	TVarId VarId;
-	int TimeOut, WaitBytes;
-
-	ClearWaitN();
-
-	Err = 0;
-	GetIntVal(&WaitBytes,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	SetWaitN(WaitBytes);
-
-	if (! Linked)
-		Err = ErrLinkFirst;
-	if (Err!=0) return Err;
-
-	TTLStatus = IdTTLWaitN;
-	TimeOut = 0;
-	if (CheckVar("timeout",&ValType,&VarId) && (ValType==TypInteger)) {
-		TimeOut = CopyIntVal(VarId) * 1000;
-	}
-	if (CheckVar("mtimeout",&ValType,&VarId) && (ValType==TypInteger)) {
-		TimeOut += CopyIntVal(VarId);
-	}
-
-	if (TimeOut>0)
-	{
-		TimeLimit = (DWORD)TimeOut;
-		TimeStart = GetTickCount();
-		SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
-	}
-
-	return Err;
-}
-
-
-WORD TTLWaitRecv()
-{
-	TStrVal Str;
-	WORD Err;
-	int Pos, Len, TimeOut;
-	WORD VarType;
-	TVarId VarId;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	GetIntVal(&Len,&Err);
-	GetIntVal(&Pos,&Err);
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if ((Err==0) && (! Linked))
-		Err = ErrLinkFirst;
-	if (Err!=0) return Err;
-	SetInputStr("");
-	SetWait2(Str,Len,Pos);
-
-	TTLStatus = IdTTLWait2;
-	TimeOut = 0;
-	if (CheckVar("timeout",&VarType,&VarId) && (VarType==TypInteger)) {
-		TimeOut = CopyIntVal(VarId) * 1000;
-	}
-	if (CheckVar("mtimeout",&VarType,&VarId) && (VarType==TypInteger)) {
-		TimeOut += CopyIntVal(VarId);
-	}
-
-	if (TimeOut>0)
-	{
-		TimeLimit = (DWORD)TimeOut;
-		TimeStart = GetTickCount();
-		SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
-	}
-	return Err;
-}
-
-WORD TTLWhile(BOOL mode)
-{
-	WORD Err;
-	int Val = mode;
-
-	Err = 0;
-	if (CheckParameterGiven()) {
-		GetIntVal(&Val,&Err);
-	}
-
-	if ((Err==0) && (GetFirstChar()!=0))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	if ((Val!=0) == mode)
-		return SetWhileLoop();
-	else
-		EndWhileLoop();
-	return Err;
-}
-
-WORD TTLXmodemRecv()
-{
-	TStrVal Str;
-	WORD Err;
-	int BinFlag, XOption;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	GetIntVal(&BinFlag,&Err);
-	GetIntVal(&XOption,&Err);
-	if ((Err==0) &&
-	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-
-	if (Err!=0) return Err;
-
-	switch (XOption) {
-	case XoptCRC:
-		// NOP
-		break;
-	case Xopt1kCRC:
-		// for compatibility
-		XOption = XoptCRC;
-		break;
-	default:
-		XOption = XoptCheck;
-	}
-
-	SetFile(Str);
-	SetBinary(BinFlag);
-	SetXOption(XOption);
-	return SendCmnd(CmdXmodemRecv,IdTTLWaitCmndResult);
-}
-
-WORD TTLXmodemSend()
-{
-	TStrVal Str;
-	WORD Err;
-	int XOption;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	GetIntVal(&XOption,&Err);
-	if ((Err==0) &&
-	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	switch (XOption) {
-	case Xopt1kCRC:
-		// NOP
-		break;
-	default:
-		XOption = XoptCRC;
-	}
-
-	SetFile(Str);
-	SetXOption(XOption);
-	return SendCmnd(CmdXmodemSend,IdTTLWaitCmndResult);
-}
-
-WORD TTLYesNoBox()
-{
-	WORD Err;
-	int YesNo;
-
-	YesNo = MessageCommand(IdYesNoBox, &Err);
-	if (Err!=0) return Err;
-	if (YesNo==IDOK)
-		YesNo = 1;	// Yes
-	else
-		YesNo = 0;	// No
-	SetResult(YesNo);
-	return Err;
-}
-
-WORD TTLZmodemSend()
-{
-	TStrVal Str;
-	WORD Err;
-	int BinFlag;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-	GetIntVal(&BinFlag,&Err);
-	if ((Err==0) &&
-	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	SetFile(Str);
-	SetBinary(BinFlag);
-	return SendCmnd(CmdZmodemSend,IdTTLWaitCmndResult);
-}
-
-WORD TTLYmodemSend()
-{
-	TStrVal Str;
-	WORD Err;
-//	int BinFlag;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-//	GetIntVal(&BinFlag,&Err);
-	if ((Err==0) &&
-	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	SetFile(Str);
-//	SetBinary(BinFlag);
-	return SendCmnd(CmdYmodemSend,IdTTLWaitCmndResult);
-}
-
-// SYNOPSIS: 
-//   scpsend "c:\usr\sample.chm" "doc/sample.chm"
-//   scpsend "c:\usr\sample.chm"
-WORD TTLScpSend()
-{
-	TStrVal Str;
-	TStrVal Str2;
-	WORD Err;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-
-	if ((Err==0) &&
-	    ((strlen(Str)==0)))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	GetStrVal(Str2,&Err);
-	if (Err) {
-		Str2[0] = '\0';
-		Err = 0;
-	}
-
-	if (GetFirstChar() != 0)
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	SetFile(Str);
-	SetSecondFile(Str2);
-	return SendCmnd(CmdScpSend, 0);
-}
-
-// SYNOPSIS: 
-//   scprecv "foo.txt"
-//   scprecv "src/foo.txt" "c:\foo.txt"
-WORD TTLScpRecv()
-{
-	TStrVal Str;
-	TStrVal Str2;
-	WORD Err;
-
-	Err = 0;
-	GetStrVal(Str,&Err);
-
-	if ((Err==0) &&
-	    ((strlen(Str)==0)))
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	GetStrVal(Str2,&Err);
-	if (Err) {
-		Str2[0] = '\0';
-		Err = 0;
-	}
-
-	if (GetFirstChar() != 0)
-		Err = ErrSyntax;
-	if (Err!=0) return Err;
-
-	SetFile(Str);
-	SetSecondFile(Str2);
-	return SendCmnd(CmdScpRcv, 0);
-}
-
-int ExecCmnd()
-{
-	WORD WId, Err;
-	BOOL StrConst, E, WithIndex, Result;
-	TStrVal Str;
-	TName Cmnd;
-	WORD ValType, VarType;
-	TVarId VarId;
-	int Val, Index;
-
-	Err = 0;
-
-	Result = GetReservedWord(&WId);
-
-	if (EndWhileFlag>0) {
-		if (Result) {
-			switch (WId) {
-			case RsvWhile:
-			case RsvUntil:
-			case RsvDo:
-				EndWhileFlag++; break;
-
-			case RsvEndWhile:
-			case RsvEndUntil:
-			case RsvLoop:
-				EndWhileFlag--; break;
-			}
-		}
-		return 0;
-	}
-
-	if (BreakFlag>0) {
-		if (Result) {
-			switch (WId) {
-			case RsvIf:
-				if (CheckThen(&Err))
-					IfNest++;
-				break;
-
-			case RsvEndIf:
-				if (IfNest<1)
-					Err = ErrInvalidCtl;
-				else
-					IfNest--;
-				break;
-
-			case RsvFor:
-			case RsvWhile:
-			case RsvUntil:
-			case RsvDo:
-				BreakFlag++; break;
-
-			case RsvNext:
-			case RsvEndWhile:
-			case RsvEndUntil:
-			case RsvLoop:
-				BreakFlag--; break;
-			}
-		}
-		if (BreakFlag>0 || !ContinueFlag)
-			return Err;
-		ContinueFlag = FALSE;
-	}
-
-	if (EndIfFlag>0) {
-		if (! Result)
-			;
-		else if ((WId==RsvIf) && CheckThen(&Err))
-			EndIfFlag++;
-		else if (WId==RsvEndIf)
-			EndIfFlag--;
-		return Err;
-	}
-
-	if (ElseFlag>0) {
-		if (! Result)
-			;
-		else if ((WId==RsvIf) && CheckThen(&Err))
-			EndIfFlag++;
-		else if (WId==RsvElse)
-			ElseFlag--;
-		else if (WId==RsvElseIf)
-		{
-			if (CheckElseIf(&Err)!=0)
-				ElseFlag--;
-		}
-		else if (WId==RsvEndIf)
-		{
-			ElseFlag--;
-			if (ElseFlag==0)
-				IfNest--;
-		}
-		return Err;
-	}
-
-	if (Result) 
-		switch (WId) {
-		case RsvBasename:
-			Err = TTLBasename(); break;
-		case RsvBeep:
-			Err = TTLBeep(); break;
-		case RsvBPlusRecv:
-			Err = TTLCommCmd(CmdBPlusRecv,IdTTLWaitCmndResult); break;
-		case RsvBPlusSend:
-			Err = TTLCommCmdFile(CmdBPlusSend,IdTTLWaitCmndResult); break;
-		case RsvBreak:
-		case RsvContinue:
-			Err = TTLBreak(WId); break;
-		case RsvBringupBox:
-			Err = TTLBringupBox(); break;
-		case RsvCall:
-			Err = TTLCall(); break;
-		case RsvCallMenu:
-			Err = TTLCommCmdInt(CmdCallMenu,0); break;
-		case RsvChangeDir:
-			Err = TTLCommCmdFile(CmdChangeDir,0); break;
-		case RsvChecksum8:
-			Err = TTLDoChecksum(CHECKSUM8); break;
-		case RsvChecksum8File:
-			Err = TTLDoChecksumFile(CHECKSUM8); break;
-		case RsvChecksum16:
-			Err = TTLDoChecksum(CHECKSUM16); break;
-		case RsvChecksum16File:
-			Err = TTLDoChecksumFile(CHECKSUM16); break;
-		case RsvChecksum32:
-			Err = TTLDoChecksum(CHECKSUM32); break;
-		case RsvChecksum32File:
-			Err = TTLDoChecksumFile(CHECKSUM32); break;
-		case RsvClearScreen:
-			Err = TTLCommCmdInt(CmdClearScreen,0); break;
-		case RsvClipb2Var:
-			Err = TTLClipb2Var(); break;    // add 'clipb2var' (2006.9.17 maya)
-		case RsvCloseSBox:
-			Err = TTLCloseSBox(); break;
-		case RsvCloseTT:
-			Err = TTLCloseTT(); break;
-		case RsvCode2Str:
-			Err = TTLCode2Str(); break;
-		case RsvConnect:
-		case RsvCygConnect:
-			Err = TTLConnect(WId); break;
-		case RsvCrc16:
-			Err = TTLDoChecksum(CRC16); break;
-		case RsvCrc16File:
-			Err = TTLDoChecksumFile(CRC16); break;
-		case RsvCrc32:
-			Err = TTLDoChecksum(CRC32); break;
-		case RsvCrc32File:
-			Err = TTLDoChecksumFile(CRC32); break;
-		case RsvDelPassword:
-			Err = TTLDelPassword(); break;
-		case RsvDirname:
-			Err = TTLDirname(); break;
-		case RsvDirnameBox:
-			Err = TTLDirnameBox(); break;
-		case RsvDisconnect:
-			Err = TTLDisconnect(); break;
-		case RsvDispStr:
-			Err = TTLDispStr(); break;
-		case RsvDo:
-			Err = TTLDo(); break;
-		case RsvElse:
-			Err = TTLElse(); break;
-		case RsvElseIf:
-			Err = TTLElseIf(); break;
-		case RsvEnableKeyb:
-			Err = TTLCommCmdBin(CmdEnableKeyb,0); break;
-		case RsvEnd:
-			Err = TTLEnd(); break;
-		case RsvEndIf:
-			Err = TTLEndIf(); break;
-		case RsvEndUntil:
-			Err = TTLEndWhile(FALSE); break;
-		case RsvEndWhile:
-			Err = TTLEndWhile(TRUE); break;
-		case RsvExec:
-			Err = TTLExec(); break;
-		case RsvExecCmnd:
-			Err = TTLExecCmnd(); break;
-		case RsvExit:
-			Err = TTLExit(); break;
-		case RsvExpandEnv:
-			Err = TTLExpandEnv(); break;
-		case RsvFileClose:
-			Err = TTLFileClose(); break;
-		case RsvFileConcat:
-			Err = TTLFileConcat(); break;
-		case RsvFileCopy:
-			Err = TTLFileCopy(); break;
-		case RsvFileCreate:
-			Err = TTLFileCreate(); break;
-		case RsvFileDelete:
-			Err = TTLFileDelete(); break;
-		case RsvFileMarkPtr:
-			Err = TTLFileMarkPtr(); break;
-		case RsvFilenameBox:
-			Err = TTLFilenameBox(); break;  // add 'filenamebox' (2007.9.13 maya)
-		case RsvFileOpen:
-			Err = TTLFileOpen(); break;
-		case RsvFileLock:
-			Err = TTLFileLock(); break;
-		case RsvFileUnLock:
-			Err = TTLFileUnLock(); break;
-		case RsvFileReadln:
-			Err = TTLFileReadln(); break;
-		case RsvFileRead:
-			Err = TTLFileRead(); break;    // add 'fileread'
-		case RsvFileRename:
-			Err = TTLFileRename(); break;
-		case RsvFileSearch:
-			Err = TTLFileSearch(); break;
-		case RsvFileSeek:
-			Err = TTLFileSeek(); break;
-		case RsvFileSeekBack:
-			Err = TTLFileSeekBack(); break;
-		case RsvFileStat:
-			Err = TTLFileStat(); break;
-		case RsvFileStrSeek:
-			Err = TTLFileStrSeek(); break;
-		case RsvFileStrSeek2:
-			Err = TTLFileStrSeek2(); break;
-		case RsvFileTruncate:
-			Err = TTLFileTruncate(); break;
-		case RsvFileWrite:
-			Err = TTLFileWrite(FALSE); break;
-		case RsvFileWriteLn:
-			Err = TTLFileWrite(TRUE); break;
-		case RsvFindClose:
-			Err = TTLFindClose(); break;
-		case RsvFindFirst:
-			Err = TTLFindFirst(); break;
-		case RsvFindNext:
-			Err = TTLFindNext(); break;
-		case RsvFlushRecv:
-			Err = TTLFlushRecv(); break;
-		case RsvFolderCreate:
-			Err = TTLFolderCreate(); break;
-		case RsvFolderDelete:
-			Err = TTLFolderDelete(); break;
-		case RsvFolderSearch:
-			Err = TTLFolderSearch(); break;
-		case RsvFor:
-			Err = TTLFor(); break;
-		case RsvGetDate:
-		case RsvGetTime:
-			Err = TTLGetTime(WId); break;
-		case RsvGetDir:
-			Err = TTLGetDir(); break;
-		case RsvGetEnv:
-			Err = TTLGetEnv(); break;
-		case RsvGetFileAttr:
-			Err = TTLGetFileAttr(); break;
-		case RsvGetHostname:
-			Err = TTLGetHostname(); break;
-		case RsvGetIPv4Addr:
-			Err = TTLGetIPv4Addr(); break;
-		case RsvGetIPv6Addr:
-			Err = TTLGetIPv6Addr(); break;
-		case RsvGetModemStatus:
-			Err = TTLGetModemStatus(); break;
-		case RsvGetPassword:
-			Err = TTLGetPassword(); break;
-		case RsvSetPassword:
-			Err = TTLSetPassword(); break;
-		case RsvIsPassword:
-			Err = TTLIsPassword(); break;
-		case RsvGetSpecialFolder:
-			Err = TTLGetSpecialFolder(); break;
-		case RsvGetTitle:
-			Err = TTLGetTitle(); break;
-		case RsvGetTTDir:
-			Err = TTLGetTTDir(); break;
-		case RsvGetVer:
-			Err = TTLGetVer(); break;
-		case RsvGoto:
-			Err = TTLGoto(); break;
-		case RsvIfDefined:
-			Err = TTLIfDefined(); break;
-		case RsvIf:
-			Err = TTLIf(); break;
-		case RsvInclude:
-			Err = TTLInclude(); break;
-		case RsvInputBox:
-			Err = TTLInputBox(FALSE); break;
-		case RsvInt2Str:
-			Err = TTLInt2Str(); break;
-		case RsvIntDim:
-		case RsvStrDim:
-			Err = TTLDim(WId); break;
-		case RsvKmtFinish:
-			Err = TTLCommCmd(CmdKmtFinish,IdTTLWaitCmndResult); break;
-		case RsvKmtGet:
-			Err = TTLCommCmdFile(CmdKmtGet,IdTTLWaitCmndResult); break;
-		case RsvKmtRecv:
-			Err = TTLCommCmd(CmdKmtRecv,IdTTLWaitCmndResult); break;
-		case RsvKmtSend:
-			Err = TTLCommCmdFile(CmdKmtSend,IdTTLWaitCmndResult); break;
-		case RsvListBox:
-			Err = TTLListBox(); break;
-		case RsvLoadKeyMap:
-			Err = TTLCommCmdFile(CmdLoadKeyMap,0); break;
-		case RsvLogAutoClose:
-			Err = TTLCommCmdBin(CmdLogAutoClose, 0); break;
-		case RsvLogClose:
-			Err = TTLCommCmd(CmdLogClose,0); break;
-		case RsvLogInfo:
-			Err = TTLLogInfo(); break;
-		case RsvLogOpen:
-			Err = TTLLogOpen(); break;
-		case RsvLogPause:
-			Err = TTLCommCmd(CmdLogPause,0); break;
-		case RsvLogRotate:
-			Err = TTLLogRotate(); break;
-		case RsvLogStart:
-			Err = TTLCommCmd(CmdLogStart,0); break;
-		case RsvLogWrite:
-			Err = TTLCommCmdFile(CmdLogWrite,0); break;
-		case RsvLoop:
-			Err = TTLLoop(); break;
-		case RsvMakePath:
-			Err = TTLMakePath(); break;
-		case RsvMessageBox:
-			Err = TTLMessageBox(); break;
-		case RsvNext:
-			Err = TTLNext(); break;
-		case RsvPasswordBox:
-			Err = TTLInputBox(TRUE); break;
-		case RsvPause:
-			Err = TTLPause(); break;
-		case RsvMilliPause:
-			Err = TTLMilliPause(); break;    // add 'mpause'
-		case RsvQuickVANRecv:
-			Err = TTLCommCmd(CmdQVRecv,IdTTLWaitCmndResult); break;
-		case RsvQuickVANSend:
-			Err = TTLCommCmdFile(CmdQVSend,IdTTLWaitCmndResult); break;
-		case RsvRandom:
-			Err = TTLRandom(); break;
-		case RsvRecvLn:
-			Err = TTLRecvLn(); break;
-		case RsvRegexOption:
-			Err = TTLRegexOption(); break;
-		case RsvRestoreSetup:
-			Err = TTLCommCmdFile(CmdRestoreSetup,0); break;
-		case RsvReturn:
-			Err = TTLReturn(); break;
-		case RsvRotateL:
-			Err = TTLRotateLeft(); break;   // add 'rotateleft' (2007.8.19 maya)
-		case RsvRotateR:
-			Err = TTLRotateRight(); break;  // add 'rotateright' (2007.8.19 maya)
-		case RsvScpSend:
-			Err = TTLScpSend(); break;      // add 'scpsend' (2008.1.1 yutaka)
-		case RsvScpRecv:
-			Err = TTLScpRecv(); break;      // add 'scprecv' (2008.1.4 yutaka)
-		case RsvSend:
-			Err = TTLSend(); break;
-		case RsvSendBreak:
-			Err = TTLCommCmd(CmdSendBreak,0); break;
-		case RsvSendBroadcast:
-			Err = TTLSendBroadcast(FALSE); break;
-		case RsvSendlnBroadcast:
-			Err = TTLSendBroadcast(TRUE); break;
-		case RsvSendlnMulticast:
-			Err = TTLSendMulticast(TRUE); break;
-		case RsvSendMulticast:
-			Err = TTLSendMulticast(FALSE); break;
-		case RsvSetMulticastName:
-			Err = TTLSetMulticastName(); break;
-		case RsvSendFile:
-			Err = TTLSendFile(); break;
-		case RsvSendKCode:
-			Err = TTLSendKCode(); break;
-		case RsvSendLn:
-			Err = TTLSendLn(); break;
-		case RsvSetBaud:
-			Err = TTLCommCmdInt(CmdSetBaud,0); break;
-		case RsvSetDate:
-			Err = TTLSetDate(); break;
-		case RsvSetDebug:
-			Err = TTLCommCmdDeb(); break;
-		case RsvSetDir:
-			Err = TTLSetDir(); break;
-		case RsvSetDlgPos:
-			Err = TTLSetDlgPos(); break;
-		case RsvSetDtr:
-			Err = TTLCommCmdInt(CmdSetDtr,0); break;
-		case RsvSetEcho:
-			Err = TTLCommCmdBin(CmdSetEcho,0); break;
-		case RsvSetEnv:
-			Err = TTLSetEnv(); break;
-		case RsvSetExitCode:
-			Err = TTLSetExitCode(); break;
-		case RsvSetFileAttr:
-			Err = TTLSetFileAttr(); break;
-		case RsvSetFlowCtrl:
-			Err = TTLCommCmdInt(CmdSetFlowCtrl,0); break;
-		case RsvSetRts:
-			Err = TTLCommCmdInt(CmdSetRts,0); break;
-		case RsvSetSync:
-			Err = TTLSetSync(); break;
-		case RsvSetTime:
-			Err = TTLSetTime(); break;
-		case RsvSetTitle:
-			Err = TTLCommCmdFile(CmdSetTitle,0); break;
-		case RsvShow:
-			Err = TTLShow(); break;
-		case RsvShowTT:
-			Err = TTLCommCmdInt(CmdShowTT,0); break;
-		case RsvSprintf:
-			Err = TTLSprintf(0); break;
-		case RsvSprintf2:
-			Err = TTLSprintf(1); break;
-		case RsvStatusBox:
-			Err = TTLStatusBox(); break;
-		case RsvStr2Code:
-			Err = TTLStr2Code(); break;
-		case RsvStr2Int:
-			Err = TTLStr2Int(); break;
-		case RsvStrCompare:
-			Err = TTLStrCompare(); break;
-		case RsvStrConcat:
-			Err = TTLStrConcat(); break;
-		case RsvStrCopy:
-			Err = TTLStrCopy(); break;
-		case RsvStrInsert:
-			Err = TTLStrInsert(); break;
-		case RsvStrJoin:
-			Err = TTLStrJoin(); break;
-		case RsvStrLen:
-			Err = TTLStrLen(); break;
-		case RsvStrMatch:
-			Err = TTLStrMatch(); break;
-		case RsvStrRemove:
-			Err = TTLStrRemove(); break;
-		case RsvStrReplace:
-			Err = TTLStrReplace(); break;
-		case RsvStrScan:
-			Err = TTLStrScan(); break;
-		case RsvStrSpecial:
-			Err = TTLStrSpecial(); break;
-		case RsvStrSplit:
-			Err = TTLStrSplit(); break;
-		case RsvStrTrim:
-			Err = TTLStrTrim(); break;
-		case RsvTestLink:
-			Err = TTLTestLink(); break;
-		case RsvToLower:
-			Err = TTLToLower(); break;    // add 'tolower' (2007.7.12 maya)
-		case RsvToUpper:
-			Err = TTLToUpper(); break;    // add 'toupper' (2007.7.12 maya)
-		case RsvUnlink:
-			Err = TTLUnlink(); break;
-		case RsvUntil:
-			Err = TTLWhile(FALSE); break;
-		case RsvUptime:
-			Err = TTLUptime(); break;
-		case RsvVar2Clipb:
-			Err = TTLVar2Clipb(); break;    // add 'var2clipb' (2006.9.17 maya)
-		case RsvWaitRegex:
-			Err = TTLWaitRegex(FALSE); break;    // add 'waitregex' (2005.10.5 yutaka)
-		case RsvWait:
-			Err = TTLWait(FALSE); break;
-		case RsvWait4all:
-			Err = TTLWait4all(FALSE); break;
-		case RsvWaitEvent:
-			Err = TTLWaitEvent(); break;
-		case RsvWaitLn:
-			Err = TTLWait(TRUE); break;
-		case RsvWaitN:
-			Err = TTLWaitN(); break;
-		case RsvWaitRecv:
-			Err = TTLWaitRecv(); break;
-		case RsvWhile:
-			Err = TTLWhile(TRUE); break;
-		case RsvXmodemRecv:
-			Err = TTLXmodemRecv(); break;
-		case RsvXmodemSend:
-			Err = TTLXmodemSend(); break;
-		case RsvYesNoBox:
-			Err = TTLYesNoBox(); break;
-		case RsvZmodemRecv:
-			Err = TTLCommCmd(CmdZmodemRecv,IdTTLWaitCmndResult); break;
-		case RsvZmodemSend:
-			Err = TTLZmodemSend(); break;
-		case RsvYmodemRecv:
-			Err = TTLCommCmd(CmdYmodemRecv,IdTTLWaitCmndResult); break;
-		case RsvYmodemSend:
-			Err = TTLYmodemSend(); break;
-		default:
-			Err = ErrSyntax;
-		}
-	else if (GetIdentifier(Cmnd)) {
-		if (GetIndex(&Index, &Err)) {
-			WithIndex = TRUE;
-		}
-		else {
-			WithIndex = FALSE;
-		}
-
-		if (!Err && GetFirstChar() == '=') {
-			StrConst = GetString(Str,&Err);
-			if (StrConst)
-				ValType = TypString;
-			else
-				if (! GetExpression(&ValType,&Val,&Err))
-					Err = ErrSyntax;
-
-			if (!Err) {
-				if (CheckVar(Cmnd,&VarType,&VarId)) {
-					if (WithIndex) {
-						switch (VarType) {
-						case TypIntArray:
-							VarId = GetIntVarFromArray(VarId, Index, &Err);
-							if (!Err) VarType = TypInteger;
-							break;
-						case TypStrArray:
-							VarId = GetStrVarFromArray(VarId, Index, &Err);
-							if (!Err) VarType = TypString;
-							break;
-						default:
-							Err = ErrSyntax;
-						}
-					}
-					if (Err) return Err;
-					if (VarType==ValType) {
-						switch (ValType) {
-						case TypInteger: SetIntVal(VarId,Val); break;
-						case TypString:
-							if (StrConst)
-								SetStrVal(VarId,Str);
-							else
-							// StrVarPtr の返り値が TStrVal のポインタであることを期待してサイズを固定
-							// (2007.6.23 maya)
-								strncpy_s(StrVarPtr(VarId),MaxStrLen,StrVarPtr((TVarId)Val),_TRUNCATE);
-						break;
-						default:
-							Err = ErrSyntax;
-						}
-					}
-					else {
-						Err = ErrTypeMismatch;
-					}
-				}
-				else if (WithIndex) {
-					Err = ErrSyntax;
-				}
-				else {
-					switch (ValType) {
-					case TypInteger: E = NewIntVar(Cmnd,Val); break;
-					case TypString:
-						if (StrConst)
-							E = NewStrVar(Cmnd,Str);
-						else
-							E = NewStrVar(Cmnd,StrVarPtr((TVarId)Val));
-						break;
-					default: 
-						E = FALSE;
-					}
-					if (! E) Err = ErrTooManyVar;
-				}
-				if (!Err && (GetFirstChar()!=0))
-					Err = ErrSyntax;
-			}
-		}
-		else Err = ErrNotSupported;
-	}
-	else
-		Err = ErrSyntax;
-
-	return Err;
-}
-
-void Exec()
-{
-	WORD Err;
-
-	// ParseAgain is set by 'ExecCmnd'
-	if (! ParseAgain &&
-	    ! GetNewLine())
-	{
-		TTLStatus = IdTTLEnd;
-		return;
-	}
-	ParseAgain = FALSE;
-
-	LockVar();
-	Err = ExecCmnd();
-	if (Err>0) DispErr(Err);
-	UnlockVar();
-}
-
-// 正規表現でマッチした文字列を記録する
-// (2005.10.7 yutaka)
-void SetMatchStr(PCHAR Str)
-{
-	WORD VarType;
-	TVarId VarId;
-
-	if (CheckVar("matchstr",&VarType,&VarId) &&
-	    (VarType==TypString))
-		SetStrVal(VarId,Str);
-}
-
-// 正規表現でグループマッチした文字列を記録する
-// (2005.10.15 yutaka)
-void SetGroupMatchStr(int no, PCHAR Str)
-{
-	WORD VarType;
-	TVarId VarId;
-	char buf[128];
-	char *p;
-
-	if (Str == NULL)
-		p = "";
-	else
-		p = Str;
-
-	_snprintf_s(buf, sizeof(buf), _TRUNCATE, "groupmatchstr%d", no);
-
-	if (CheckVar(buf,&VarType,&VarId) &&
-	    (VarType==TypString))
-		SetStrVal(VarId,p);
-}
-
-void SetInputStr(PCHAR Str)
-{
-	WORD VarType;
-	TVarId VarId;
-
-	if (CheckVar("inputstr",&VarType,&VarId) &&
-	    (VarType==TypString))
-		SetStrVal(VarId,Str);
-}
-
-void SetResult(int ResultCode)
-{
-  WORD VarType;
-  TVarId VarId;
-
-	if (CheckVar("result",&VarType,&VarId) &&
-	    (VarType==TypInteger))
-		SetIntVal(VarId,ResultCode);
-}
-
-BOOL CheckTimeout()
-{
-	BOOL ret;
-	DWORD TimeUp = (TimeStart+TimeLimit);
-
-	if (TimeUp > TimeStart) {
-		ret = (GetTickCount() > TimeUp);
-	}
-	else { // for DWORD overflow (49.7 days)
-		DWORD TimeTmp = GetTickCount();
-		ret = (TimeUp < TimeTmp && TimeTmp >= TimeStart);
-	}
-	return ret;
-}
-
-BOOL TestWakeup(int Wakeup)
-{
-	return ((Wakeup & WakeupCondition) != 0);
-}
-
-void SetWakeup(int Wakeup)
-{
-	WakeupCondition = Wakeup;
-}

Copied: branches/cmake/teraterm/ttpmacro/ttl.cpp (from rev 7336, branches/cmake/teraterm/ttpmacro/ttl.c)
===================================================================
--- branches/cmake/teraterm/ttpmacro/ttl.cpp	                        (rev 0)
+++ branches/cmake/teraterm/ttpmacro/ttl.cpp	2018-12-18 14:47:23 UTC (rev 7337)
@@ -0,0 +1,6614 @@
+/*
+ * Copyright (C) 1994-1998 T. Teranishi
+ * (C) 2005-2018 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.
+ */
+
+/* TTMACRO.EXE, Tera Term Language interpreter */
+
+#include "teraterm.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <mbstring.h>
+#include <time.h>
+#include <errno.h>
+#include "tt-version.h"
+#include "ttmdlg.h"
+#include "ttmbuff.h"
+#include "ttmparse.h"
+#include "ttmdde.h"
+#include "ttmlib.h"
+#include "ttlib.h"
+#include "ttmenc.h"
+#include "tttypes.h"
+#include "ttmonig.h"
+#include <shellapi.h>
+#include <sys/stat.h>
+#include <io.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <share.h>
+#include "codeconv.h"
+
+// for _findXXXX() functions
+#include <io.h>
+
+// for _ismbblead
+#include <mbctype.h>
+
+#include "ttl.h"
+#include "SFMT.h"
+
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#include <iptypes.h>
+#include <iphlpapi.h>
+#include "win16api.h"
+#include "ttl_gui.h"
+#include "codeconv.h"
+
+#define TTERMCOMMAND "TTERMPRO /D="
+#define CYGTERMCOMMAND "cyglaunch -o /D="
+
+// for 'ExecCmnd' command
+static BOOL ParseAgain;
+static int IfNest;
+static int ElseFlag;
+static int EndIfFlag;
+// Window handle of the main window
+static HWND HMainWin;
+// Timeout
+static DWORD TimeLimit;
+static DWORD TimeStart;
+// for 'WaitEvent' command
+static int WakeupCondition;
+
+// exit code of TTMACRO
+int ExitCode = 0;
+
+// for "FindXXXX" commands
+#define NumDirHandle 8
+static intptr_t DirHandle[NumDirHandle] = {-1,-1, -1, -1, -1, -1, -1, -1};
+/* for "FileMarkPtr" and "FileSeekBack" commands */
+#define NumFHandle 16
+static HANDLE FHandle[NumFHandle];
+static long FPointer[NumFHandle];
+
+// forward declaration
+int ExecCmnd();
+
+static void HandleInit()
+{
+	int i;
+	for (i=0; i<_countof(FHandle); i++) {
+		FHandle[i] = INVALID_HANDLE_VALUE;
+	}
+}
+
+/**
+ *	@retval	ファイルハンドルインデックス(0~)
+ *			-1のときエラー
+ */
+static int HandlePut(HANDLE FH)
+{
+	int i;
+	if (FH == INVALID_HANDLE_VALUE) {
+		return -1;
+	}
+	for (i=0; i<_countof(FHandle); i++) {
+		if (FHandle[i] == INVALID_HANDLE_VALUE) {
+			FHandle[i] = FH;
+			FPointer[i] = 0;
+			return i;
+		}
+	}
+	return -1;
+}
+
+static HANDLE HandleGet(int fhi)
+{
+	if (fhi < 0 || _countof(FHandle) < fhi) {
+		return INVALID_HANDLE_VALUE;
+	}
+	return FHandle[fhi];
+}
+
+static void HandleFree(int fhi)
+{
+	FHandle[fhi] = INVALID_HANDLE_VALUE;
+}
+
+BOOL InitTTL(HWND HWin)
+{
+	int i;
+	TStrVal Dir;
+	TVarId ParamsVarId;
+	char tmpname[10];
+	WORD Err;
+
+	HMainWin = HWin;
+
+	if (! InitVar()) return FALSE;
+	LockVar();
+
+	// System variables
+	NewIntVar("result",0);
+	NewIntVar("timeout",0);
+	NewIntVar("mtimeout",0);    // ミリ秒単位のタイムアウト用 (2009.1.23 maya)
+	NewStrVar("inputstr","");
+	NewStrVar("matchstr","");   // for 'waitregex' command (2005.10.7 yutaka)
+	NewStrVar("groupmatchstr1","");   // for 'waitregex' command (2005.10.15 yutaka)
+	NewStrVar("groupmatchstr2","");   // for 'waitregex' command (2005.10.15 yutaka)
+	NewStrVar("groupmatchstr3","");   // for 'waitregex' command (2005.10.15 yutaka)
+	NewStrVar("groupmatchstr4","");   // for 'waitregex' command (2005.10.15 yutaka)
+	NewStrVar("groupmatchstr5","");   // for 'waitregex' command (2005.10.15 yutaka)
+	NewStrVar("groupmatchstr6","");   // for 'waitregex' command (2005.10.15 yutaka)
+	NewStrVar("groupmatchstr7","");   // for 'waitregex' command (2005.10.15 yutaka)
+	NewStrVar("groupmatchstr8","");   // for 'waitregex' command (2005.10.15 yutaka)
+	NewStrVar("groupmatchstr9","");   // for 'waitregex' command (2005.10.15 yutaka)
+
+	if (ParamCnt == 0) {
+		ParamCnt++;
+	}
+	NewIntVar("paramcnt",ParamCnt);  // ファイル名も含む引数の個数 (2012.4.10 yutaka)
+
+	// 旧形式のパラメータ設定 (param1 〜 param9)
+	NewStrVar("param1", ShortName);
+	if (Params) {
+		for (i=2; i<=9; i++) {
+			_snprintf_s(tmpname, sizeof(tmpname), _TRUNCATE, "param%d", i);
+			if (ParamCnt >= i && Params[i] != NULL) {
+				NewStrVar(tmpname, Params[i]);
+			}
+			else {
+				NewStrVar(tmpname, "");
+			}
+		}
+	}
+
+	// 新形式のパラメータ設定 (params[1〜ParamCnt])
+	if (NewStrAryVar("params", ParamCnt+1) == 0) {
+		Err = 0;
+		GetStrAryVarByName(&ParamsVarId, "params", &Err);
+		if (Err == 0) {
+			if (ShortName[0] != 0) {
+				SetStrValInArray(ParamsVarId, 1, ShortName, &Err);
+			}
+			if (Params) {
+				for (i=0; i<=ParamCnt; i++) {
+					if (i == 1) {
+						continue;
+					}
+					if (Params[i]) {
+						SetStrValInArray(ParamsVarId, i, Params[i], &Err);
+						free(Params[i]);
+					}
+				}
+				free(Params);
+				Params = NULL;
+			}
+		}
+	}
+
+	ParseAgain = FALSE;
+	IfNest = 0;
+	ElseFlag = 0;
+	EndIfFlag = 0;
+
+	for (i=0; i<NumDirHandle; i++)
+		DirHandle[i] = -1L;
+	HandleInit();
+
+	if (! InitBuff(FileName))
+	{
+		TTLStatus = IdTTLEnd;
+		return FALSE;
+	}
+
+	UnlockVar();
+
+	ExtractDirName(FileName,Dir);
+	TTMSetDir(Dir);
+
+	if (SleepFlag)
+	{ // synchronization for startup macro
+		// sleep until Tera Term is ready
+		WakeupCondition = IdWakeupInit;
+		// WakeupCondition = IdWakeupConnect | IdWakeupDisconn | IdWakeupUnlink;
+		TTLStatus = IdTTLSleep;
+	}
+	else
+		TTLStatus = IdTTLRun;
+
+	return TRUE;
+}
+
+void EndTTL()
+{
+	int i;
+
+	CloseStatDlg();
+
+	for (i=0; i<NumDirHandle; i++)
+	{
+		if (DirHandle[i]!=-1L)
+			_findclose(DirHandle[i]);
+		DirHandle[i] = -1L;
+	}
+
+	UnlockVar();
+	if (TTLStatus==IdTTLWait)
+		KillTimer(HMainWin,IdTimeOutTimer);
+	CloseBuff(0);
+	EndVar();
+}
+
+long int CalcTime()
+{
+	time_t time1;
+	struct tm *ptm;
+
+	time1 = time(NULL);
+	ptm = localtime(&time1);
+	return ((long int)ptm->tm_hour * 3600 +
+	        (long int)ptm->tm_min * 60 +
+	        (long int)ptm->tm_sec
+	       );
+}
+
+//////////////// Beginning of TTL commands //////////////
+WORD TTLCommCmd(char Cmd, int Wait)
+{
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+	else if (! Linked)
+		return ErrLinkFirst;
+	else
+		return SendCmnd(Cmd,Wait);
+}
+
+WORD TTLCommCmdFile(char Cmd, int Wait)
+{
+	TStrVal Str;
+	WORD Err;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+
+	if ((Err==0) &&
+	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err==0)
+	{
+		SetFile(Str);
+		Err = SendCmnd(Cmd,Wait);
+	}
+	return Err;
+}
+
+WORD TTLCommCmdBin(char Cmd, int Wait)
+{
+	int Val;
+	WORD Err;
+
+	Err = 0;
+	GetIntVal(&Val,&Err);
+
+	if ((Err==0) &&
+	    (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err==0)
+	{
+		SetBinary(Val);
+		Err = SendCmnd(Cmd,Wait);
+	}
+	return Err;
+}
+
+
+WORD TTLCommCmdDeb()
+{
+	int Val;
+	WORD Err;
+
+	Err = 0;
+	GetIntVal(&Val,&Err);
+
+	if ((Err==0) &&
+	    (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err==0)
+	{
+		SetDebug(Val);
+	}
+	return Err;
+}
+
+WORD TTLCommCmdInt(char Cmd, int Wait)
+{
+	int Val;
+	char Str[21];
+	WORD Err;
+
+	Err = 0;
+	GetIntVal(&Val,&Err);
+
+	if ((Err==0) &&
+	    (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err==0)
+	{
+		_snprintf_s(Str,sizeof(Str),_TRUNCATE,"%d",Val);
+		SetFile(Str);
+		Err = SendCmnd(Cmd,Wait);
+	}
+	return Err;
+}
+
+WORD TTLBeep()
+{
+	int val = 0;
+	WORD Err = 0;
+	UINT type = MB_OK;
+
+	if (CheckParameterGiven()) {
+		GetIntVal(&val, &Err);
+		if (Err!=0) return Err;
+
+		switch (val) {
+		case 0:
+			type = -1;
+			break;
+		case 1:
+			type = MB_ICONASTERISK;
+			break;
+		case 2:
+			type = MB_ICONEXCLAMATION;
+			break;
+		case 3:
+			type = MB_ICONHAND;
+			break;
+		case 4:
+			type = MB_ICONQUESTION;
+			break;
+		case 5:
+			type = MB_OK;
+			break;
+		default:
+			return ErrSyntax;
+			break;
+		}
+	}
+
+	MessageBeep(type);
+
+	return 0;
+}
+
+WORD TTLBreak(WORD WId) {
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+
+	return BreakLoop(WId);
+}
+
+WORD TTLBringupBox()
+{
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+	BringupStatDlg();
+	return 0;
+}
+
+WORD TTLCall()
+{
+	TName LabName;
+	WORD Err, VarType;
+	TVarId VarId;
+
+	if (GetLabelName(LabName) && (GetFirstChar()==0)) {
+		if (CheckVar(LabName, &VarType, &VarId) && (VarType==TypLabel))
+			Err = CallToLabel(VarId);
+		else
+			Err = ErrLabelReq;
+	}
+	else
+	Err = ErrSyntax;
+
+	return Err;
+}
+
+#if 0
+// add 'clipb2var' (2006.9.17 maya)
+WORD TTLClipb2Var()
+{
+	WORD Err;
+	TVarId VarId;
+	HANDLE hText;
+	PTSTR clipbText;
+	char buf[MaxStrLen];
+	int Num = 0;
+	char *newbuff;
+	static char *cbbuff;
+	static int cbbuffsize, cblen;
+	HANDLE wide_hText;
+	LPWSTR wide_buf;
+	int mb_len;
+	UINT Cf;
+
+	Err = 0;
+	GetStrVar(&VarId, &Err);
+	if (Err!=0) return Err;
+
+	// get 2nd arg(optional) if given
+	if (CheckParameterGiven()) {
+		GetIntVal(&Num, &Err);
+	}
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (Num == 0) {
+		if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
+			Cf = CF_UNICODETEXT;
+		}
+		else if (IsClipboardFormatAvailable(CF_TEXT)) {
+			Cf = CF_TEXT;
+		}
+		else {
+			cblen = 0;
+			SetResult(0);
+			return Err;
+		}
+		if (OpenClipboard(NULL) == 0) {
+			cblen = 0;
+			SetResult(0);
+			return Err;
+		}
+
+		if (Cf == CF_UNICODETEXT) {
+			wide_hText = GetClipboardData(CF_UNICODETEXT);
+			if (wide_hText != NULL) {
+				wide_buf = GlobalLock(wide_hText);
+				mb_len = WideCharToMultiByte(CP_ACP, 0, wide_buf, -1, NULL, 0, NULL, NULL);
+				hText = GlobalAlloc(GMEM_MOVEABLE, sizeof(CHAR) * mb_len);
+				clipbText = GlobalLock(hText);
+				if (hText != NULL) {
+					WideCharToMultiByte(CP_ACP, 0, wide_buf, -1, clipbText, mb_len, NULL, NULL);
+
+					cblen = strlen(clipbText);
+					if (cbbuffsize <= cblen) {
+						if ((newbuff = realloc(cbbuff, cblen + 1)) == NULL) {
+							// realloc failed. fall back to old mode.
+							cblen = 0;
+							strncpy_s(buf,sizeof(buf),clipbText,_TRUNCATE);
+							GlobalUnlock(hText);
+							CloseClipboard();
+							SetStrVal(VarId, buf);
+							SetResult(3);
+							return Err;
+						}
+						cbbuff = newbuff;
+						cbbuffsize = cblen + 1;
+					}
+					strncpy_s(cbbuff, cbbuffsize, clipbText, _TRUNCATE);
+
+					GlobalUnlock(hText);
+					GlobalFree(hText);
+				}
+				GlobalUnlock(wide_hText);
+			}
+			else {
+				cblen = 0;
+			}
+		}
+		else if (Cf == CF_TEXT) {
+			hText = GetClipboardData(CF_TEXT);
+			if (hText != NULL) {
+				clipbText = GlobalLock(hText);
+				cblen = strlen(clipbText);
+				if (cbbuffsize <= cblen) {
+					if ((newbuff = realloc(cbbuff, cblen + 1)) == NULL) {
+						// realloc failed. fall back to old mode.
+						cblen = 0;
+						strncpy_s(buf,sizeof(buf),clipbText,_TRUNCATE);
+						GlobalUnlock(hText);
+						CloseClipboard();
+						SetStrVal(VarId, buf);
+						SetResult(3);
+						return Err;
+					}
+					cbbuff = newbuff;
+					cbbuffsize = cblen + 1;
+				}
+				strncpy_s(cbbuff, cbbuffsize, clipbText, _TRUNCATE);
+				GlobalUnlock(hText);
+			}
+			else {
+				cblen = 0;
+			}
+		}
+		CloseClipboard();
+	}
+
+	if (cbbuff != NULL && Num >= 0 && Num * (MaxStrLen - 1) < cblen) {
+		if (strncpy_s(buf ,sizeof(buf), cbbuff + Num * (MaxStrLen-1), _TRUNCATE) == STRUNCATE)
+			SetResult(2); // Copied string is truncated.
+		else {
+			SetResult(1);
+		}
+		SetStrVal(VarId, buf);
+	}
+	else {
+		SetResult(0);
+	}
+
+	return Err;
+}
+#endif
+
+#if 0
+// add 'var2clipb' (2006.9.17 maya)
+WORD TTLVar2Clipb()
+{
+	WORD Err;
+	TStrVal Str;
+	HGLOBAL hText;
+	PTSTR clipbText;
+	int wide_len;
+	HGLOBAL wide_hText;
+	LPWSTR wide_buf;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	if (Err!=0) return Err;
+
+	hText = GlobalAlloc(GHND, sizeof(Str));
+	clipbText = GlobalLock(hText);
+	strncpy_s(clipbText, sizeof(Str), Str, _TRUNCATE);
+	GlobalUnlock(hText);
+
+	wide_len = MultiByteToWideChar(CP_ACP, 0, clipbText, -1, NULL, 0);
+	wide_hText = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * wide_len);
+	if (wide_hText) {
+		wide_buf = (LPWSTR)GlobalLock(wide_hText);
+		MultiByteToWideChar(CP_ACP, 0, clipbText, -1, wide_buf, wide_len);
+		GlobalUnlock(wide_hText);
+	}
+
+	if (OpenClipboard(NULL) == 0) {
+		SetResult(0);
+	}
+	else {
+		EmptyClipboard();
+		SetClipboardData(CF_TEXT, hText);
+
+		if (wide_buf) {
+			SetClipboardData(CF_UNICODETEXT, wide_hText);
+		}
+
+		CloseClipboard();
+		SetResult(1);
+	}
+
+	return Err;
+}
+#endif
+
+WORD TTLCloseSBox()
+{
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+	CloseStatDlg();
+	return 0;
+}
+
+WORD TTLCloseTT()
+{
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+
+	if (! Linked)
+		return ErrLinkFirst;
+	else {
+		// Close Tera Term
+		SendCmnd(CmdCloseWin,IdTTLWaitCmndEnd);
+		EndDDE();
+		return 0;
+	}
+}
+
+WORD TTLCode2Str()
+{
+	TVarId VarId;
+	WORD Err;
+	int Num, Len, c, i;
+	BYTE d;
+	TStrVal Str;
+
+	Err = 0;
+	GetStrVar(&VarId, &Err);
+
+	GetIntVal(&Num,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	Len = sizeof(Num);
+	i = 0;
+	for (c=0; c<=Len-1; c++)
+	{
+		d = (Num >> ((Len-1-c)*8)) & 0xff;
+		if ((i>0) || (d!=0))
+		{
+			Str[i] = d;
+			i++;
+		}
+	}
+	Str[i] = 0;
+	SetStrVal(VarId, Str);
+	return Err;
+}
+
+WORD TTLConnect(WORD mode)
+{
+	TStrVal Cmnd, Str;
+	WORD Err;
+	WORD w;
+
+	Str[0] = 0;
+	Err = 0;
+
+	if (mode == RsvConnect || CheckParameterGiven()) {
+		GetStrVal(Str,&Err);
+		if (Err!=0) return Err;
+	}
+
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+
+	if (Linked)
+	{
+		if (ComReady!=0)
+		{
+			SetResult(2);
+			return Err;
+		}
+
+		if (mode == RsvConnect) {
+			// new connection
+			SetFile(Str);
+			SendCmnd(CmdConnect,0);
+
+			WakeupCondition = IdWakeupInit;
+			TTLStatus = IdTTLSleep;
+			return Err;
+		}
+		else {	// cygwin connection
+			TTLCloseTT();
+		}
+	}
+
+	SetResult(0);
+	// link to Tera Term
+	if (strlen(TopicName)==0)
+	{
+		switch (mode) {
+		case RsvConnect:
+			strncpy_s(Cmnd, sizeof(Cmnd),TTERMCOMMAND, _TRUNCATE);
+			break;
+		case RsvCygConnect:
+			strncpy_s(Cmnd, sizeof(Cmnd),CYGTERMCOMMAND, _TRUNCATE);
+			break;
+		}
+		w = HIWORD(HMainWin);
+		Word2HexStr(w,TopicName);
+		w = LOWORD(HMainWin);
+		Word2HexStr(w,&(TopicName[4]));
+		strncat_s(Cmnd,sizeof(Cmnd),TopicName,_TRUNCATE);
+		strncat_s(Cmnd,sizeof(Cmnd)," ",_TRUNCATE);
+		strncat_s(Cmnd,sizeof(Cmnd),Str,_TRUNCATE);
+		if (WinExec(Cmnd,SW_SHOW)<32)
+			return ErrCantConnect;
+		TTLStatus = IdTTLInitDDE;
+	}
+	return Err;
+}
+
+
+/*
+ * cf. http://oku.edu.mie-u.ac.jp/~okumura/algo/
+ */
+
+enum checksum_type {
+	CHECKSUM8,
+	CHECKSUM16,
+	CHECKSUM32,
+	CRC16,
+	CRC32
+};
+
+static unsigned int checksum32(int n, unsigned char c[])
+{
+	unsigned long value = 0;
+	int i;
+
+	for (i = 0; i < n; i++) {
+		value += (c[i] & 0xFF);
+	}
+	return (value & 0xFFFFFFFF);
+}
+
+static unsigned int checksum16(int n, unsigned char c[])
+{
+	unsigned long value = 0;
+	int i;
+
+	for (i = 0; i < n; i++) {
+		value += (c[i] & 0xFF);
+	}
+	return (value & 0xFFFF);
+}
+
+static unsigned int checksum8(int n, unsigned char c[])
+{
+	unsigned long value = 0;
+	int i;
+
+	for (i = 0; i < n; i++) {
+		value += (c[i] & 0xFF);
+	}
+	return (value & 0xFF);
+}
+
+// CRC-16-CCITT
+static unsigned int crc16(int n, unsigned char c[])
+{
+#define CRC16POLY1  0x1021U  /* x^{16}+x^{12}+x^5+1 */
+#define CRC16POLY2  0x8408U  /* 左右逆転 */
+
+	int i, j;
+	unsigned long r;
+
+	r = 0xFFFFU;
+	for (i = 0; i < n; i++) {
+		r ^= c[i];
+		for (j = 0; j < CHAR_BIT; j++)
+			if (r & 1) r = (r >> 1) ^ CRC16POLY2;
+			else       r >>= 1;
+	}
+	return r ^ 0xFFFFU;
+}
+
+static unsigned long crc32(int n, unsigned char c[])
+{
+#define CRC32POLY1 0x04C11DB7UL
+	/* x^{32}+x^{26}+x^{23}+x^{22}+x^{16}+x^{12}+x^{11]+
+	   x^{10}+x^8+x^7+x^5+x^4+x^2+x^1+1 */
+#define CRC32POLY2 0xEDB88320UL  /* 左右逆転 */
+	int i, j;
+	unsigned long r;
+
+	r = 0xFFFFFFFFUL;
+	for (i = 0; i < n; i++) {
+		r ^= c[i];
+		for (j = 0; j < CHAR_BIT; j++)
+			if (r & 1) r = (r >> 1) ^ CRC32POLY2;
+			else       r >>= 1;
+	}
+	return r ^ 0xFFFFFFFFUL;
+}
+
+// チェックサムアルゴリズム・共通ルーチン
+WORD TTLDoChecksum(enum checksum_type type)
+{
+	TStrVal Str;
+	WORD Err;
+	TVarId VarId;
+	DWORD cksum;
+	unsigned char *p;
+
+	Err = 0;
+	GetIntVar(&VarId, &Err);
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	if (Str[0]==0) return Err;
+	p = (unsigned char *)Str;
+
+	switch (type) {
+		case CHECKSUM8:
+			cksum = checksum8(strlen(Str), p);
+			break;
+		case CHECKSUM16:
+			cksum = checksum16(strlen(Str), p);
+			break;
+		case CHECKSUM32:
+			cksum = checksum32(strlen(Str), p);
+			break;
+		case CRC16:
+			cksum = crc16(strlen(Str), p);
+			break;
+		case CRC32:
+			cksum = crc32(strlen(Str), p);
+			break;
+		default:
+			cksum = 0;
+			break;
+	}
+
+	SetIntVal(VarId, cksum);
+
+	return Err;
+}
+
+WORD TTLDoChecksumFile(enum checksum_type type)
+{
+	TStrVal Str;
+	int result = 0;
+	WORD Err;
+	TVarId VarId;
+	HANDLE fh = INVALID_HANDLE_VALUE, hMap = NULL;
+	LPBYTE lpBuf = NULL;
+	DWORD fsize;
+	DWORD cksum;
+
+	Err = 0;
+	GetIntVar(&VarId, &Err);
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	if (Str[0]==0) return Err;
+
+	fh = CreateFile(tc::fromUtf8(Str),GENERIC_READ,0,NULL,OPEN_EXISTING,
+		FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */
+	if (fh == INVALID_HANDLE_VALUE) {
+		result = -1;
+		goto error;
+	}
+	/* ファイルマッピングオブジェクト作成 */
+	hMap = CreateFileMapping(fh,NULL,PAGE_READONLY,0,0,NULL);
+	if (hMap == NULL) {
+		result = -1;
+		goto error;
+	}
+
+	/* ファイルをマップし、先頭アドレスをlpBufに取得 */
+	lpBuf = (LPBYTE)MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
+	if (lpBuf == NULL) {
+		result = -1;
+		goto error;
+	}
+
+	fsize = GetFileSize(fh,NULL);
+
+	switch (type) {
+		case CHECKSUM8:
+			cksum = checksum8(fsize, lpBuf);
+			break;
+		case CHECKSUM16:
+			cksum = checksum16(fsize, lpBuf);
+			break;
+		case CHECKSUM32:
+			cksum = checksum32(fsize, lpBuf);
+			break;
+		case CRC16:
+			cksum = crc16(fsize, lpBuf);
+			break;
+		case CRC32:
+			cksum = crc32(fsize, lpBuf);
+			break;
+		default:
+			cksum = 0;
+			break;
+	}
+
+	SetIntVal(VarId, cksum);
+
+error:
+	if (lpBuf != NULL) {
+		UnmapViewOfFile(lpBuf);
+	}
+
+	if (hMap != NULL) {
+		CloseHandle(hMap);
+	}
+	if (fh != INVALID_HANDLE_VALUE) {
+		CloseHandle(fh);
+	}
+
+	SetResult(result);
+
+	return Err;
+}
+
+WORD TTLDelPassword()
+{
+	TStrVal Str, Str2;
+	WORD Err;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	GetStrVal(Str2,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	if (Str[0]==0) return Err;
+
+	GetAbsPath(Str,sizeof(Str));
+	if (! DoesFileExist(Str)) return Err;
+	if (Str2[0]==0) // delete all password
+		WritePrivateProfileString(_T("Password"),NULL,NULL,(tc)Str);
+	else            // delete password specified by Str2
+		WritePrivateProfileString(_T("Password"),(tc)Str2,NULL,(tc)Str);
+	return Err;
+}
+
+WORD TTLDim(WORD type)
+{
+	WORD Err, WordId, VarType;
+	TName Name;
+	TVarId VarId;
+	int size;
+
+	Err = 0;
+
+	if (! GetIdentifier(Name)) return ErrSyntax;
+	if (CheckReservedWord(Name, &WordId)) return ErrSyntax;
+	if (CheckVar(Name, &VarType, &VarId)) return ErrSyntax;
+
+	GetIntVal(&size, &Err);
+	if (Err!=0) return Err;
+
+	if (type == RsvIntDim) {
+		Err = NewIntAryVar(Name, size);
+	}
+	else { // type == RsvStrDim
+		Err = NewStrAryVar(Name, size);
+	}
+	return Err;
+}
+
+WORD TTLDisconnect()
+{
+	WORD Err;
+	int Val = 1;
+	char Str[21];
+
+	Err = 0;
+	// get 1rd arg(optional) if given
+	if (CheckParameterGiven()) {
+		GetIntVal(&Val, &Err);
+	}
+
+	if ((Err==0) &&
+	    (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err==0)
+	{
+		_snprintf_s(Str,sizeof(Str),_TRUNCATE,"%d",Val);
+		SetFile(Str);
+		Err = SendCmnd(CmdDisconnect,0);
+	}
+	return Err;
+}
+
+WORD TTLDispStr()
+{
+	TStrVal Str, buff;
+	WORD Err, ValType;
+	int Val;
+
+	if (! Linked)
+		return ErrLinkFirst;
+
+	buff[0] = 0;
+
+	while (TRUE) {
+		if (GetString(Str, &Err)) {
+			if (Err) return Err;
+			strncat_s(buff, MaxStrLen, Str, _TRUNCATE);
+		}
+		else if (GetExpression(&ValType, &Val, &Err)) {
+			if (Err!=0) return Err;
+			switch (ValType) {
+				case TypInteger:
+					Str[0] = LOBYTE(Val);
+					Str[1] = 0;
+					strncat_s(buff, MaxStrLen, Str, _TRUNCATE);
+				case TypString:
+					strncat_s(buff, MaxStrLen, StrVarPtr((TVarId)Val), _TRUNCATE);
+					break;
+				default:
+					return ErrTypeMismatch;
+			}
+		}
+		else {
+			break;
+		}
+	}
+	SetFile(buff);
+	return SendCmnd(CmdDispStr, 0);
+}
+
+WORD TTLDo()
+{
+	WORD WId, Err;
+	int Val = 1;
+
+	Err = 0;
+	if (CheckParameterGiven()) {
+		if (GetReservedWord(&WId)) {
+			switch (WId) {
+				case RsvWhile:
+					GetIntVal(&Val,&Err);
+					break;
+				case RsvUntil:
+					GetIntVal(&Val,&Err);
+					Val = Val == 0;
+					break;
+				default:
+					Err = ErrSyntax;
+			}
+			if ((Err==0) && (GetFirstChar()!=0))
+				Err = ErrSyntax;
+		}
+		else {
+			Err = ErrSyntax;
+		}
+	}
+
+	if (Err!=0) return Err;
+
+	if (Val!=0)
+		return SetWhileLoop();
+	else
+		EndWhileLoop();
+	return Err;
+}
+
+WORD TTLElse()
+{
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+
+	if (IfNest<1)
+		return ErrInvalidCtl;
+
+	// Skip until 'EndIf'
+	IfNest--;
+	EndIfFlag = 1;
+	return 0;
+}
+
+int CheckElseIf(LPWORD Err)
+{
+	int Val;
+	WORD WId;
+
+	*Err = 0;
+	GetIntVal(&Val,Err);
+	if (*Err!=0) return 0;
+	if (! GetReservedWord(&WId) ||
+	    (WId!=RsvThen) ||
+	    (GetFirstChar()!=0))
+		*Err = ErrSyntax;
+	return Val;
+}
+
+WORD TTLElseIf()
+{
+	WORD Err;
+	int Val;
+
+	Val = CheckElseIf(&Err);
+	if (Err!=0) return Err;
+
+	if (IfNest<1)
+		return ErrInvalidCtl;
+
+	// Skip until 'EndIf'
+	IfNest--;
+	EndIfFlag = 1;
+	return Err;
+}
+
+WORD TTLEnd()
+{
+	if (GetFirstChar()==0)
+	{
+		TTLStatus = IdTTLEnd;
+		return 0;
+	}
+	else
+		return ErrSyntax;
+}
+
+WORD TTLEndIf()
+{
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+
+	if (IfNest<1)
+		return ErrInvalidCtl;
+
+	IfNest--;
+	return 0;
+}
+
+WORD TTLEndWhile(BOOL mode)
+{
+	WORD Err;
+	int Val = mode;
+
+	Err = 0;
+	if (CheckParameterGiven()) {
+		GetIntVal(&Val,&Err);
+	}
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	return BackToWhile((Val!=0) == mode);
+}
+
+WORD TTLExec()
+{
+	TStrVal Str,Str2, CurDir;
+	int mode = SW_SHOW;
+	int wait = 0;
+	DWORD ret;
+	WORD Err;
+	STARTUPINFO sui;
+	PROCESS_INFORMATION pi;
+	BOOL bRet;
+
+	memset(CurDir, 0, sizeof(CurDir));
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+
+	if (CheckParameterGiven()) {
+		GetStrVal(Str2, &Err);
+		if (Err!=0) return Err;
+
+		if (_stricmp(Str2, "hide") == 0)
+			mode = SW_HIDE;
+		else if (_stricmp(Str2, "minimize") == 0)
+			mode = SW_MINIMIZE;
+		else if (_stricmp(Str2, "maximize") == 0)
+			mode = SW_MAXIMIZE;
+		else if (_stricmp(Str2, "show") == 0)
+			mode = SW_SHOW;
+		else
+			Err = ErrSyntax;
+
+		// get 3nd arg(optional) if given
+		if (CheckParameterGiven()) {
+			GetIntVal(&wait, &Err);
+			if (Err!=0) return Err;
+
+			// get 4th arg(optional) if given
+			if (CheckParameterGiven()) {
+				GetStrVal(CurDir, &Err);
+				if (Err!=0) return Err;
+			}
+		}
+	}
+
+	if ((Err==0) &&
+	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+
+	if (Err!=0) return Err;
+
+	memset(&sui, 0, sizeof(STARTUPINFO));
+	sui.cb = sizeof(STARTUPINFO);
+	sui.wShowWindow = mode;
+	sui.dwFlags = STARTF_USESHOWWINDOW;
+	tc StrT = tc::fromUtf8(Str);
+	tc CurDirT = tc::fromUtf8(CurDir);
+	LPTSTR StrT_NC = (TCHAR *)(const TCHAR *)StrT;
+	if (CurDir[0] == 0)
+		bRet = CreateProcess(NULL, StrT_NC, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &sui, &pi);
+	else
+		bRet = CreateProcess(NULL, StrT_NC, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, CurDirT, &sui, &pi);
+	// TODO: check bRet
+	if (wait) {
+		WaitForSingleObject(pi.hProcess, INFINITE);
+		GetExitCodeProcess(pi.hProcess, &ret);
+		SetResult(ret);
+	}
+	return Err;
+}
+
+WORD TTLExecCmnd()
+{
+	WORD Err;
+	TStrVal NextLine;
+	BYTE b;
+
+	Err = 0;
+	GetStrVal(NextLine,&Err);
+	if (Err!=0) return Err;
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+
+	strncpy_s(LineBuff, sizeof(LineBuff),NextLine, _TRUNCATE);
+	LineLen = (WORD)strlen(LineBuff);
+	LinePtr = 0;
+	b = GetFirstChar();
+	LinePtr--;
+	ParseAgain = (b!=0) && (b!=':') && (b!=';');
+	return Err;
+}
+
+WORD TTLExit()
+{
+	if (GetFirstChar()==0)
+	{
+		if (! ExitBuffer())
+			TTLStatus = IdTTLEnd;
+		return 0;
+	}
+	else
+	return ErrSyntax;
+}
+
+WORD TTLExpandEnv()
+{
+	WORD Err;
+	TVarId VarId;
+	TStrVal srcptr;
+	TCHAR deststr[MaxStrLen];
+
+	Err = 0;
+	GetStrVar(&VarId, &Err);
+	if (Err!=0) return Err;
+
+	if (CheckParameterGiven()) { // expandenv strvar strval
+		GetStrVal(srcptr,&Err);
+		if ((Err==0) && (GetFirstChar()!=0))
+			Err = ErrSyntax;
+		if (Err!=0) {
+			return Err;
+		}
+
+		// ファイルパスに環境変数が含まれているならば、展開する。
+		tc srcptrT = tc::fromUtf8(srcptr);
+		ExpandEnvironmentStrings(srcptrT, deststr, MaxStrLen);
+		SetStrVal(VarId, (char *)(const char *)(u8)deststr);
+	}
+	else { // expandenv strvar
+		// ファイルパスに環境変数が含まれているならば、展開する。
+		tc VarIdT = StrVarPtr(VarId);
+		ExpandEnvironmentStrings(VarIdT, deststr, MaxStrLen);
+		SetStrVal(VarId, (char *)(const char *)(u8)deststr);
+	}
+
+	return Err;
+}
+
+WORD TTLFileClose()
+{
+	WORD Err;
+	int fhi;	// handle index
+	HANDLE FH;
+
+	Err = 0;
+	GetIntVal(&fhi,&Err);
+	FH = HandleGet(fhi);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	_lclose(FH);
+	HandleFree(fhi);
+	return Err;
+}
+
+WORD TTLFileConcat()
+{
+	WORD Err;
+	HANDLE FH1, FH2;
+	int c;
+	TStrVal FName1, FName2;
+	BYTE buf[1024];
+
+	Err = 0;
+	GetStrVal(FName1,&Err);
+	GetStrVal(FName2,&Err);
+	if ((Err==0) &&
+	    ((strlen(FName1)==0) ||
+	     (strlen(FName2)==0) ||
+	     (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) {
+		SetResult(1);
+		return Err;
+	}
+
+	if (!GetAbsPath(FName1,sizeof(FName1))) {
+		SetResult(-1);
+		return Err;
+	}
+	if (!GetAbsPath(FName2,sizeof(FName2))) {
+		SetResult(-2);
+		return Err;
+	}
+	if (_stricmp(FName1,FName2)==0) {
+		SetResult(2);
+		return Err;
+	}
+
+	FH1 = _lopen(FName1,OF_WRITE);
+	if (FH1 == INVALID_HANDLE_VALUE)
+		FH1 = _lcreat(FName1,0);
+	if (FH1 == INVALID_HANDLE_VALUE) {
+		SetResult(3);
+		return Err;
+	}
+	_llseek(FH1,0,2);
+
+	FH2 = _lopen(FName2,OF_READ);
+	if (FH2 != INVALID_HANDLE_VALUE)
+	{
+		do {
+			c = _lread(FH2,&(buf[0]),sizeof(buf));
+			if (c>0)
+				_lwrite(FH1,&(buf[0]),c);
+		} while (c >= sizeof(buf));
+		_lclose(FH2);
+	}
+	_lclose(FH1);
+
+	SetResult(0);
+	return Err;
+}
+
+WORD TTLFileCopy()
+{
+	WORD Err;
+	TStrVal FName1, FName2;
+
+	Err = 0;
+	GetStrVal(FName1,&Err);
+	GetStrVal(FName2,&Err);
+	if ((Err==0) &&
+	    ((strlen(FName1)==0) ||
+	     (strlen(FName2)==0) ||
+	     (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) {
+		SetResult(1);
+		return Err;
+	}
+
+	if (!GetAbsPath(FName1,sizeof(FName1))) {
+		SetResult(-1);
+		return Err;
+	}
+	if (!GetAbsPath(FName2,sizeof(FName2))) {
+		SetResult(-2);
+		return Err;
+	}
+	if (_stricmp(FName1,FName2)==0) return Err;
+
+	CopyFile((tc)FName1,(tc)FName2,FALSE);
+	SetResult(0);
+	return Err;
+}
+
+WORD TTLFileCreate()
+{
+	WORD Err;
+	TVarId VarId;
+	HANDLE FH;
+	int fhi;
+	TStrVal FName;
+
+	Err = 0;
+	GetIntVar(&VarId, &Err);
+	GetStrVal(FName, &Err);
+	if ((Err==0) &&
+	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) {
+		SetResult(1);
+		return Err;
+	}
+
+	if (!GetAbsPath(FName,sizeof(FName))) {
+		SetIntVal(VarId, -1);
+		SetResult(-1);
+		return Err;
+	}
+	FH = _lcreat(FName,0);
+	if (FH == INVALID_HANDLE_VALUE) {
+		SetResult(2);
+	}
+	else {
+		SetResult(0);
+	}
+	fhi = HandlePut(FH);
+	SetIntVal(VarId, fhi);
+	if (fhi == -1) {
+		_lclose(FH);
+	}
+	return Err;
+}
+
+WORD TTLFileDelete()
+{
+	WORD Err;
+	TStrVal FName;
+
+	Err = 0;
+	GetStrVal(FName,&Err);
+	if ((Err==0) &&
+	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) {
+		SetResult(1);
+		return Err;
+	}
+
+	if (!GetAbsPath(FName,sizeof(FName))) {
+		SetResult(-1);
+		return Err;
+	}
+	
+	if (remove(FName) != 0) {
+		SetResult(-1);
+	}
+	else {
+		SetResult(0);
+	}
+
+	return Err;
+}
+
+WORD TTLFileMarkPtr()
+{
+	WORD Err;
+	int fhi;
+	HANDLE FH;
+	LONG pos;
+
+	Err = 0;
+	GetIntVal(&fhi,&Err);
+	FH = HandleGet(fhi);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	pos = _llseek(FH,0,1);	 /* mark current pos */
+	if (pos == INVALID_SET_FILE_POINTER) {
+		pos = 0;	// ?
+	}
+	FPointer[fhi] = pos;
+	return Err;
+}
+
+#if 0
+// add 'filenamebox' (2007.9.13 maya)
+WORD TTLFilenameBox()
+{
+	TStrVal Str1;
+	WORD Err, ValType;
+	TVarId VarId;
+	OPENFILENAME ofn;
+	char uimsg[MAX_UIMSG];
+	BOOL SaveFlag = FALSE;
+	TStrVal InitDir = "";
+	BOOL ret;
+
+	Err = 0;
+	GetStrVal(Str1,&Err);
+	if (Err!=0) return Err;
+
+	// get 2nd arg(optional) if given
+	if (CheckParameterGiven()) { // dialogtype
+		GetIntVal(&SaveFlag, &Err);
+		if (Err!=0) return Err;
+
+		// get 3rd arg(optional) if given
+		if (CheckParameterGiven()) { // initdir
+			GetStrVal(InitDir, &Err);
+			if (Err!=0) return Err;
+		}
+	}
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	SetInputStr("");
+	if (CheckVar("inputstr", &ValType, &VarId) &&
+	    (ValType==TypString)) {
+		memset(&ofn, 0, sizeof(OPENFILENAME));
+		ofn.lStructSize     = sizeof(OPENFILENAME);
+		ofn.hwndOwner       = HMainWin;
+		ofn.lpstrTitle      = Str1;
+		ofn.lpstrFile       = StrVarPtr(VarId);
+		ofn.nMaxFile        = MaxStrLen;
+		get_lang_msg("FILEDLG_ALL_FILTER", uimsg, sizeof(uimsg), "All(*.*)\\0*.*\\0\\0", UILanguageFile);
+		ofn.lpstrFilter     = uimsg;
+		ofn.lpstrInitialDir = NULL;
+		if (strlen(InitDir) > 0) {
+			ofn.lpstrInitialDir = InitDir;
+		}
+		BringupWindow(HMainWin);
+		if (SaveFlag) {
+			ofn.Flags = OFN_OVERWRITEPROMPT;
+			ret = GetSaveFileName(&ofn);
+		}
+		else {
+			ret = GetOpenFileName(&ofn);
+		}
+		SetResult(ret);
+	}
+	return Err;
+}
+#endif
+
+WORD TTLFileOpen()
+{
+	WORD Err;
+	TVarId VarId;
+	int fhi;
+	HANDLE FH;
+	int Append, ReadonlyFlag=0;
+	TStrVal FName;
+
+	Err = 0;
+	GetIntVar(&VarId, &Err);
+	GetStrVal(FName, &Err);
+	GetIntVal(&Append, &Err);
+	// get 4nd arg(optional) if given
+	if (CheckParameterGiven()) { // readonly
+		GetIntVal(&ReadonlyFlag, &Err);
+	}
+	if ((Err==0) &&
+	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (!GetAbsPath(FName,sizeof(FName))) {
+		SetIntVal(VarId, -1);
+		return Err;
+	}
+
+	if (ReadonlyFlag) {
+		FH = _lopen(FName,OF_READ);
+	}
+	else {
+		FH = _lopen(FName,OF_READWRITE);
+	}
+	if (FH == INVALID_HANDLE_VALUE)
+		FH = _lcreat(FName,0);
+	if (FH == INVALID_HANDLE_VALUE) {
+		SetIntVal(VarId, -1);
+		return ErrCantOpen;
+	}
+	fhi = HandlePut(FH);
+	if (fhi == -1) {
+		SetIntVal(VarId, -1);
+		_lclose(FH);
+		return ErrCantOpen;
+	}
+	SetIntVal(VarId, fhi);
+	if (Append!=0) {
+		_llseek(FH, 0, 2/*FILE_END*/);
+	}
+	return 0;	// no error
+}
+
+// Format: filelock <file handle> [<timeout>]
+// (2012.4.19 yutaka)
+WORD TTLFileLock()
+{
+	WORD Err;
+	int FH;
+	int timeoutI;
+	DWORD timeout;
+	int result;
+	BOOL ret;
+	DWORD dwStart;
+
+	Err = 0;
+	GetIntVal(&FH,&Err);
+	if (Err!=0) return Err;
+
+	timeoutI = -1;  // 無限大
+	if (CheckParameterGiven()) {
+		GetIntVal(&timeoutI, &Err);
+		if (Err!=0) return Err;
+	}
+	timeout = timeoutI * 1000;
+
+	result = 1;  // error
+	dwStart = GetTickCount();
+	do {
+		ret = LockFile((HANDLE)FH, 0, 0, (DWORD)-1, (DWORD)-1);
+		if (ret != 0) { // ロック成功
+			result = 0;  // success
+			break;
+		}
+		Sleep(1);
+	} while (GetTickCount() - dwStart < timeout);
+
+	SetResult(result);
+	return Err;
+}
+
+// Format: fileunlock <file handle> 
+// (2012.4.19 yutaka)
+WORD TTLFileUnLock()
+{
+	WORD Err;
+	int FH;
+	BOOL ret;
+
+	Err = 0;
+	GetIntVal(&FH,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	ret = UnlockFile((HANDLE)FH, 0, 0, (DWORD)-1, (DWORD)-1);
+	if (ret != 0) { // アンロック成功
+		SetResult(0);
+	} else {
+		SetResult(1);
+	}
+
+	return Err;
+}
+
+WORD TTLFileReadln()
+{
+	WORD Err;
+	TVarId VarId;
+	int fhi;
+	HANDLE FH;
+	int i, c;
+	TStrVal Str;
+	BOOL EndFile, EndLine;
+	BYTE b;
+
+	Err = 0;
+	GetIntVal(&fhi, &Err);
+	FH = HandleGet(fhi);
+	GetStrVar(&VarId, &Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	i = 0;
+	EndLine = FALSE;
+	EndFile = TRUE;
+	do {
+		c = _lread(FH, &b, 1);
+		if (c>0) EndFile = FALSE;
+		if (c==1) {
+			switch (b) {
+				case 0x0d:
+					c = _lread(FH, &b, 1);
+					if ((c==1) && (b!=0x0a))
+						_llseek(FH, -1, 1);
+					EndLine = TRUE;
+					break;
+				case 0x0a: EndLine = TRUE; break;
+				default:
+					if (i<MaxStrLen-1)
+					{
+						Str[i] = b;
+						i++;
+					}
+			}
+		}
+	} while ((c>=1) && (! EndLine));
+
+	if (EndFile)
+		SetResult(1);
+	else
+		SetResult(0);
+
+	Str[i] = 0;
+	SetStrVal(VarId, Str);
+	return Err;
+}
+
+
+// Format: fileread <file handle> <read byte> <strvar>
+// 指定したバイト数だけファイルから読み込む。
+// ただし、<read byte>は 1〜255 まで。
+// (2006.11.1 yutaka)
+WORD TTLFileRead()
+{
+	WORD Err;
+	TVarId VarId;
+	int fhi;
+	HANDLE FH;
+	int i, c;
+	int ReadByte;   // 読み込むバイト数
+	TStrVal Str;
+	BOOL EndFile, EndLine;
+	BYTE b;
+
+	Err = 0;
+	GetIntVal(&fhi,&Err);
+	FH = HandleGet(fhi);
+	GetIntVal(&ReadByte,&Err);
+	GetStrVar(&VarId,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if ((Err==0) && (ReadByte < 1 || ReadByte > MaxStrLen-1))  // 範囲チェック
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	EndLine = FALSE;
+	EndFile = FALSE;
+	for (i = 0 ; i < ReadByte ; i++) {
+		c = _lread(FH,&b,1);
+		if (c <= 0) {  // EOF
+			EndFile = TRUE;
+			break;
+		}
+		if (i<MaxStrLen-1)
+		{
+			Str[i] = b;
+		}
+	} 
+
+	if (EndFile)
+		SetResult(1);
+	else
+		SetResult(0);
+
+	Str[i] = 0;
+	SetStrVal(VarId,Str);
+	return Err;
+}
+
+
+WORD TTLFileRename()
+{
+	WORD Err;
+	TStrVal FName1, FName2;
+
+	Err = 0;
+	GetStrVal(FName1,&Err);
+	GetStrVal(FName2,&Err);
+	if ((Err==0) &&
+	    ((strlen(FName1)==0) ||
+	     (strlen(FName2)==0) ||
+	     (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) {
+		SetResult(1);
+		return Err;
+	}
+	if (_stricmp(FName1,FName2)==0) {
+		SetResult(2);
+		return Err;
+	}
+
+	if (!GetAbsPath(FName1,sizeof(FName1))) {
+		SetResult(-1);
+		return Err;
+	}
+	if (!GetAbsPath(FName2,sizeof(FName2))) {
+		SetResult(-2);
+		return Err;
+	}
+	if (rename(FName1,FName2) != 0) {
+		// リネームに失敗したら、エラーで返す。
+		SetResult(-3);
+		return Err;
+	}
+
+	SetResult(0);
+	return Err;
+}
+
+WORD TTLFileSearch()
+{
+	WORD Err;
+	TStrVal FName;
+
+	Err = 0;
+	GetStrVal(FName,&Err);
+	if ((Err==0) &&
+	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	GetAbsPath(FName,sizeof(FName));
+	if (DoesFileExist(FName))
+		SetResult(1);
+	else
+		SetResult(0);
+	return Err;
+}
+
+WORD TTLFileSeek()
+{
+	WORD Err;
+	int fhi;
+	HANDLE FH;
+	int i, j;
+
+	Err = 0;
+	GetIntVal(&fhi,&Err);
+	FH = HandleGet(fhi);
+	GetIntVal(&i,&Err);
+	GetIntVal(&j,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	_llseek(FH,i,j);
+	return Err;
+}
+
+WORD TTLFileSeekBack()
+{
+	WORD Err;
+	int fhi;
+	HANDLE FH;
+
+	Err = 0;
+	GetIntVal(&fhi,&Err);
+	FH = HandleGet(fhi);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	/* move back to the marked pos */
+	_llseek(FH,FPointer[fhi],0);
+	return Err;
+}
+
+WORD TTLFileStat()
+{
+	WORD Err;
+	TVarId SizeVarId, TimeVarId, DrvVarId;
+	TStrVal FName, TimeStr, DrvStr;
+	struct _stat st;
+	int ret;
+	int result = -1;
+	struct tm *tmp;
+
+	Err = 0;
+	GetStrVal(FName,&Err);
+	if ((Err==0) &&
+	    (strlen(FName)==0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (!GetAbsPath(FName,sizeof(FName))) {
+		goto end;
+	}
+
+	ret = _stat(FName, &st);
+	if (ret != 0) {
+		goto end;
+	}
+
+	if (CheckParameterGiven()) { 
+		GetIntVar(&SizeVarId,&Err);
+		if (Err!=0) return Err;
+		SetIntVal(SizeVarId, st.st_size);
+	}
+
+	if (CheckParameterGiven()) { 
+		GetStrVar(&TimeVarId,&Err);
+		if (Err!=0) return Err;
+		tmp = localtime(&st.st_mtime);
+		strftime(TimeStr, sizeof(TimeStr), "%Y-%m-%d %H:%M:%S", tmp);
+		SetStrVal(TimeVarId, TimeStr);
+	}
+
+	if (CheckParameterGiven()) { 
+		GetStrVar(&DrvVarId,&Err);
+		if (Err!=0) return Err;
+		_snprintf_s(DrvStr, sizeof(DrvStr), _TRUNCATE, "%c", st.st_dev + 'A');
+		SetStrVal(DrvVarId, DrvStr);
+	}
+
+	result = 0;
+
+end:
+	SetResult(result);
+
+	return Err;
+}
+
+WORD TTLFileStrSeek()
+{
+	WORD Err;
+	int fhi;
+	HANDLE FH;
+	int Len, i, c;
+	TStrVal Str;
+	BYTE b;
+	long int pos;
+
+	Err = 0;
+	GetIntVal(&fhi,&Err);
+	FH = HandleGet(fhi);
+	GetStrVal(Str,&Err);
+	if ((Err==0) &&
+	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	pos = _llseek(FH,0,1);
+	if (pos == INVALID_SET_FILE_POINTER) return Err;
+
+	Len = strlen(Str);
+	i = 0;
+	do {
+		c = _lread(FH,&b,1);
+		if (c==1)
+		{
+			if (b==(BYTE)Str[i])
+				i++;
+			else if (i>0) {
+				i = 0;
+				if (b==(BYTE)Str[0])
+					i = 1;
+			}
+		}
+	} while ((c>=1) && (i!=Len));
+	if (i==Len)
+		SetResult(1);
+	else {
+		SetResult(0);
+		_llseek(FH,pos,0);
+	}
+	return Err;
+}
+
+WORD TTLFileStrSeek2()
+{
+	WORD Err;
+	int fhi;
+	HANDLE FH;
+	int Len, i, c;
+	TStrVal Str;
+	BYTE b;
+	long int pos, pos2;
+	BOOL Last;
+
+	Err = 0;
+	GetIntVal(&fhi,&Err);
+	FH = HandleGet(fhi);
+	GetStrVal(Str,&Err);
+	if ((Err==0) &&
+	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	pos = _llseek(FH,0,1);
+	if (pos == INVALID_SET_FILE_POINTER) return Err;
+
+	Len = strlen(Str);
+	i = 0;
+	pos2 = pos;
+	do {
+		Last = (pos2<=0);
+		c = _lread(FH,&b,1);
+		pos2 = _llseek(FH,-2,1);
+		if (c==1)
+		{
+			if (b==(BYTE)Str[Len-1-i])
+				i++;
+			else if (i>0) {
+				i = 0;
+				if (b==(BYTE)Str[Len-1])
+					i = 1;
+			}
+		}
+	} while (!Last && (i!=Len));
+	if (i==Len) {
+		// ファイルの1バイト目がヒットすると、ファイルポインタが突き破って
+		// INVALID_SET_FILE_POINTER になるので、
+		// ゼロオフセットになるように調整する。(2008.10.10 yutaka)
+		if (pos == INVALID_SET_FILE_POINTER) 
+			_llseek(FH, 0, 0);
+		SetResult(1);
+	} else {
+		SetResult(0);
+		_llseek(FH,pos,0);
+	}
+	return Err;
+}
+
+WORD TTLFileTruncate()
+{
+	WORD Err;
+	TStrVal FName;
+	int result = -1;
+	int TruncByte;
+	int fh = -1;
+	int ret;
+
+	Err = 0;
+	GetStrVal(FName,&Err);
+	if ((Err==0) &&
+	    (strlen(FName)==0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (!GetAbsPath(FName,sizeof(FName))) {
+		goto end;
+	}
+
+	if (CheckParameterGiven()) { 
+		GetIntVal(&TruncByte,&Err);
+		if (Err!=0) return Err;
+	} else {
+		Err = ErrSyntax;
+		goto end;
+	}
+
+	// ファイルを指定したサイズで切り詰める。
+   ret = _sopen_s( &fh, FName, _O_RDWR | _O_CREAT, _SH_DENYNO, _S_IREAD | _S_IWRITE );
+   if (ret != 0) {
+		Err = ErrCantOpen;
+		goto end;
+   }
+   ret = _chsize_s(fh, TruncByte);
+   if (ret != 0) {
+		Err = ErrInvalidCtl;
+		goto end;
+   }
+
+	result = 0;
+	Err = 0;
+
+end:
+	SetResult(result);
+
+	if (fh != -1)
+		_close(fh);
+
+	return Err;
+}
+
+WORD TTLFileWrite(BOOL addCRLF)
+{
+	WORD Err, P;
+	int fhi;
+	HANDLE FH;
+	int Val;
+	TStrVal Str;
+
+	Err = 0;
+	GetIntVal(&fhi, &Err);
+	FH = HandleGet(fhi);
+	if (Err) return Err;
+
+	P = LinePtr;
+	GetStrVal(Str, &Err);
+	if (!Err) {
+		if (GetFirstChar())
+			return ErrSyntax;
+
+		_lwrite(FH, Str, strlen(Str));
+	}
+	else if (Err == ErrTypeMismatch) {
+		Err = 0;
+		LinePtr = P;
+		GetIntVal(&Val, &Err);
+		if (Err) return Err;
+		if (GetFirstChar())
+			return ErrSyntax;
+
+		Str[0] = Val & 0xff;
+		_lwrite(FH, Str, 1);
+	}
+	else {
+		return Err;
+	}
+
+	if (addCRLF) {
+		_lwrite(FH,"\015\012",2);
+	}
+	return 0;
+}
+
+WORD TTLFindClose()
+{
+	WORD Err;
+	int DH;
+
+	Err = 0;
+	GetIntVal(&DH,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if ((DH>=0) && (DH<NumDirHandle) &&
+	    (DirHandle[DH]!=-1L))
+	{
+		_findclose(DirHandle[DH]);
+		DirHandle[DH] = -1L;
+	}
+	return Err;
+}
+
+WORD TTLFindFirst()
+{
+	TVarId DH, Name;
+	WORD Err;
+	TStrVal Dir;
+	int i;
+	struct _finddata_t data;
+
+	Err = 0;
+	GetIntVar(&DH,&Err);
+	GetStrVal(Dir,&Err);
+	GetStrVar(&Name,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (Dir[0]==0) strncpy_s(Dir, sizeof(Dir),"*.*", _TRUNCATE);
+	GetAbsPath(Dir,sizeof(Dir));
+	i = 0;
+	while ((i<NumDirHandle) &&
+	       (DirHandle[i]!=-1L))
+		i++;
+	if (i<NumDirHandle)
+	{
+		DirHandle[i] = _findfirst(Dir,&data);
+		if (DirHandle[i]!=-1L)
+			SetStrVal(Name,data.name);
+		else
+			i = -1;
+	}
+	else
+		i = -1;
+
+	SetIntVal(DH,i);
+	if (i<0)
+	{
+		SetResult(0);
+		SetStrVal(Name,"");
+	}
+	else
+		SetResult(1);
+	return Err;
+}
+
+WORD TTLFindNext()
+{
+	TVarId Name;
+	WORD Err;
+	int DH;
+	struct _finddata_t data;
+
+	Err = 0;
+	GetIntVal(&DH,&Err);
+	GetStrVar(&Name,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if ((DH>=0) && (DH<NumDirHandle) &&
+	    (DirHandle[DH]!=-1L) &&
+	    (_findnext(DirHandle[DH],&data)==0))
+	{
+		SetStrVal(Name,data.name);
+		SetResult(1);
+	}
+	else {
+		SetStrVal(Name,"");
+		SetResult(0);
+	}
+	return Err;
+}
+
+WORD TTLFlushRecv()
+{
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+	FlushRecv();
+	return 0;
+}
+
+WORD TTLFolderCreate()
+{
+	WORD Err;
+	TStrVal FName;
+
+	Err = 0;
+	GetStrVal(FName,&Err);
+	if ((Err==0) &&
+	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) {
+		SetResult(1);
+		return Err;
+	}
+
+	if (!GetAbsPath(FName,sizeof(FName))) {
+		SetResult(-1);
+		return Err;
+	}
+
+	if (CreateDirectory((tc)FName, NULL) == 0) {
+		SetResult(2);
+	}
+	else {
+		SetResult(0);
+	}
+	return Err;
+}
+
+WORD TTLFolderDelete()
+{
+	WORD Err;
+	TStrVal FName;
+
+	Err = 0;
+	GetStrVal(FName,&Err);
+	if ((Err==0) &&
+	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) {
+		SetResult(1);
+		return Err;
+	}
+
+	if (!GetAbsPath(FName,sizeof(FName))) {
+		SetResult(-1);
+		return Err;
+	}
+
+	if (RemoveDirectory((tc)FName) == 0) {
+		SetResult(2);
+	}
+	else {
+		SetResult(0);
+	}
+	return Err;
+}
+
+WORD TTLFolderSearch()
+{
+	WORD Err;
+	TStrVal FName;
+
+	Err = 0;
+	GetStrVal(FName,&Err);
+	if ((Err==0) &&
+	    ((strlen(FName)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	GetAbsPath(FName,sizeof(FName));
+	if (DoesFolderExist(FName)) {
+		SetResult(1);
+	}
+	else {
+		SetResult(0);
+	}
+	return Err;
+}
+
+WORD TTLFor()
+{
+	WORD Err;
+	TVarId VarId;
+	int ValStart, ValEnd, i;
+
+	Err = 0;
+	GetIntVar(&VarId,&Err);
+	GetIntVal(&ValStart,&Err);
+	GetIntVal(&ValEnd,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (! CheckNext())
+	{ // first time
+		Err = SetForLoop();
+		if (Err==0)
+		{
+			SetIntVal(VarId,ValStart);
+			i = CopyIntVal(VarId);
+			if (i==ValEnd)
+				LastForLoop();
+		}
+	}
+	else { // return from 'next'
+		i = CopyIntVal(VarId);
+		if (i<ValEnd)
+			i++;
+		else if (i>ValEnd)
+			i--;
+		SetIntVal(VarId,i);
+		if (i==ValEnd)
+			LastForLoop();
+	}
+	return Err;
+}
+
+WORD TTLGetDir()
+{
+	WORD Err;
+	TVarId VarId;
+	TStrVal Str;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	TTMGetDir(Str, sizeof(Str));
+	SetStrVal(VarId,Str);
+	return Err;
+}
+
+WORD TTLGetEnv()
+{
+	WORD Err;
+	TVarId VarId;
+	TStrVal Str;
+	PCHAR Str2;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	GetStrVar(&VarId,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	Str2 = getenv(Str);
+
+	if (Str2!=NULL)
+		SetStrVal(VarId,Str2);
+	else
+		SetStrVal(VarId,"");
+	return Err;
+}
+
+WORD TTLGetFileAttr()
+{
+	WORD Err;
+	TStrVal Filename;
+
+	Err = 0;
+	GetStrVal(Filename,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	SetResult(GetFileAttributes((tc)Filename));
+
+	return Err;
+}
+
+WORD TTLGetHostname()
+{
+	WORD Err;
+	TVarId VarId;
+	char Str[MaxStrLen];
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err!=0) return Err;
+
+	Err = GetTTParam(CmdGetHostname,Str,sizeof(Str));
+	if (Err==0)
+		SetStrVal(VarId,Str);
+	return Err;
+}
+
+#define MAX_IPADDR 30
+/*
+ strdim ipaddr 10
+ getipv4addr ipaddr num
+ */
+WORD TTLGetIPv4Addr()
+{
+	WORD Err;
+	TVarId VarId, VarId2, id;
+	WSADATA ws;
+	INTERFACE_INFO info[MAX_IPADDR];
+	SOCKET sock;
+	DWORD socknum;
+	int num, result, arysize;
+	int i, n;
+	IN_ADDR addr;
+
+	Err = 0;
+	GetStrAryVar(&VarId,&Err);
+	GetIntVar(&VarId2, &Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	// 自分自身の全IPv4アドレスを取得する。
+	if (WSAStartup(MAKEWORD(2,2), &ws) != 0) {
+		SetResult(-1);
+		SetIntVal(VarId2, 0);
+		return Err;
+	}
+	arysize = GetStrAryVarSize(VarId);
+	num = 0;
+	result = 1;
+	sock = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
+	if (WSAIoctl(sock, SIO_GET_INTERFACE_LIST, NULL, 0, info, sizeof(info), &socknum, NULL, NULL) != SOCKET_ERROR) {
+		n = socknum / sizeof(info[0]);
+		for (i = 0 ; i < n ; i++) {
+			if ((info[i].iiFlags & IFF_UP) == 0) 
+				continue;
+			if ((info[i].iiFlags & IFF_LOOPBACK) != 0)
+				continue;
+			addr = info[i].iiAddress.AddressIn.sin_addr;
+
+			if (num < arysize) {
+				id = GetStrVarFromArray(VarId, num, &Err);
+				SetStrVal(id, inet_ntoa(addr));
+			}
+			else {
+				result = 0;
+			}
+			num++;
+		}
+	}
+	closesocket(sock);
+	WSACleanup();
+
+	SetResult(result);
+	SetIntVal(VarId2, num);
+
+	return Err;
+}
+
+
+// IPv6アドレスを文字列に変換する。
+static void myInetNtop(int Family, char *pAddr, char *pStringBuf, size_t StringBufSize)
+{
+	int i;
+	char s[16];
+	unsigned int val;
+
+	pStringBuf[0] = '\0';
+	for (i = 0 ; i < 16 ; i++) {
+		val = (pAddr[i]) & 0xFF;
+		_snprintf_s(s, sizeof(s), _TRUNCATE, "%02x", val);
+		strncat_s(pStringBuf, StringBufSize, s, _TRUNCATE);
+		if (i != 15 && (i & 1))
+			strncat_s(pStringBuf, StringBufSize, ":", _TRUNCATE);
+	}
+}
+
+
+WORD TTLGetIPv6Addr()
+{
+	WORD Err;
+	TVarId VarId, VarId2, id;
+	int num, result, arysize;
+	DWORD ret;
+	IP_ADAPTER_ADDRESSES addr[256];/* XXX */
+	ULONG len = sizeof(addr);
+	char ipv6str[64];
+
+	Err = 0;
+	GetStrAryVar(&VarId,&Err);
+	GetIntVar(&VarId2, &Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	// GetAdaptersAddresses がサポートされていない OS はここで return
+	if (!HasGetAdaptersAddresses()) {
+		SetResult(-1);
+		SetIntVal(VarId2, 0);
+		return Err;
+	}
+
+	// 自分自身の全IPv6アドレスを取得する。
+	arysize = GetStrAryVarSize(VarId);
+	num = 0;
+	result = 1;
+	ret = GetAdaptersAddresses(AF_INET6, 0, NULL, addr, &len);
+	if (ret == ERROR_SUCCESS) {
+		IP_ADAPTER_ADDRESSES *padap = &addr[0];
+
+		do {
+			IP_ADAPTER_UNICAST_ADDRESS *uni = padap->FirstUnicastAddress;
+
+			if (!uni) {
+				continue;
+			}
+			do {
+				SOCKET_ADDRESS addr = uni->Address;
+				struct sockaddr_in6 *sa;
+
+				if (!(uni->Flags & IP_ADAPTER_ADDRESS_DNS_ELIGIBLE)) {
+					continue;
+				}
+				sa = (struct sockaddr_in6*)addr.lpSockaddr;
+				myInetNtop(AF_INET6, (char*)&sa->sin6_addr, ipv6str, sizeof(ipv6str));
+
+				if (num < arysize) {
+					id = GetStrVarFromArray(VarId, num, &Err);
+					SetStrVal(id, ipv6str);
+				}
+				else {
+					result = 0;
+				}
+				num++;
+
+			} while ((uni = uni->Next));
+		} while ((padap = padap->Next));
+	}
+
+	SetResult(result);
+	SetIntVal(VarId2, num);
+
+	return Err;
+}
+
+#if 0
+WORD TTLGetPassword()
+{
+	TStrVal Str, Str2, Temp2;
+	char Temp[512];
+	WORD Err;
+	TVarId VarId;
+	int result = 0;  /* failure */
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	GetStrVal(Str2,&Err);
+	GetStrVar(&VarId,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	SetStrVal(VarId,"");
+	if (Str[0]==0) return Err;
+	if (Str2[0]==0) return Err;
+
+	GetAbsPath(Str,sizeof(Str));
+
+	GetPrivateProfileString("Password",Str2,"",
+	                        Temp,sizeof(Temp), Str);
+	if (Temp[0]==0) // password not exist
+	{
+		OpenInpDlg(Temp2, Str2, "Enter password", "", TRUE);
+		if (Temp2[0]!=0) {
+			Encrypt(Temp2,Temp);
+			if (WritePrivateProfileString("Password",Str2,Temp, Str) != 0) {
+				result = 1;  /* success */
+			}
+		}
+	}
+	else {// password exist
+		Decrypt(Temp,Temp2);
+		result = 1;  /* success */
+	}
+
+	SetStrVal(VarId,Temp2);
+
+	SetResult(result);  // 成功可否を設定する。
+	return Err;
+}
+#endif
+
+// setpassword 'password.dat' 'mypassword' passowrd
+WORD TTLSetPassword()
+{
+	TStrVal FileNameStr, KeyStr;
+	char Temp[512];
+	WORD Err;
+	TVarId VarId;
+	PCHAR VarStr;
+	int result = 0;  /* failure */
+
+	Err = 0;
+	GetStrVal(FileNameStr, &Err);   // ファイル名
+	GetStrVal(KeyStr, &Err);  // キー名
+	GetStrVar(&VarId, &Err);
+	VarStr = StrVarPtr(VarId);  // 変数へのポインタ
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	// 文字列が空の場合はエラーとする。
+	if (FileNameStr[0]==0 || 
+	    KeyStr[0]==0 ||
+	    VarStr[0]==0)   // "getpassword"同様、空パスワードも許可しない。
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	GetAbsPath(FileNameStr, sizeof(FileNameStr));
+
+	// パスワードを暗号化する。
+	Encrypt(VarStr, Temp);
+
+	if (WritePrivateProfileString(_T("Password"), (tc)KeyStr, (tc)Temp, (tc)FileNameStr) != 0) 
+		result = 1;  /* success */
+
+	SetResult(result);  // 成功可否を設定する。
+	return Err;
+}
+
+// ispassword 'password.dat' 'username' ; result: 0=false; 1=true
+WORD TTLIsPassword()
+{
+	TStrVal FileNameStr, KeyStr;
+	TCHAR Temp[512];
+	WORD Err;
+	int result = 0; 
+
+	Err = 0;
+	GetStrVal(FileNameStr, &Err);   // ファイル名
+	GetStrVal(KeyStr, &Err);  // キー名
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	// 文字列が空の場合はエラーとする。
+	if (FileNameStr[0]==0 || 
+	    KeyStr[0]==0)
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	GetAbsPath(FileNameStr, sizeof(FileNameStr));
+
+	Temp[0] = 0;
+	GetPrivateProfileString(_T("Password"), (tc)KeyStr, _T(""),
+	                        Temp, _countof(Temp), (tc)FileNameStr);
+	if (Temp[0] == 0) { // password not exist
+		result = 0; 
+	} else {
+		result = 1; 
+	}
+
+	SetResult(result);  // 成功可否を設定する。
+	return Err;
+}
+
+WORD TTLGetSpecialFolder()
+{
+	WORD Err;
+	TVarId VarId;
+	TStrVal type;
+	int result;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	if (Err!=0) return Err;
+
+	GetStrVal(type,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) {
+		return Err;
+	}
+
+	result = GetSpecialFolder(StrVarPtr(VarId), sizeof(TStrVal), type);
+	SetResult(result);
+
+	return Err;
+}
+
+WORD TTLGetTime(WORD mode)
+{
+	WORD Err;
+	TVarId VarId;
+	TStrVal Str1, Str2, tzStr;
+	time_t time1;
+	struct tm *ptm;
+	char *format;
+	BOOL set_result;
+	const char *tz = NULL;
+	char tz_copy[128]; 
+
+	// Save timezone
+	tz = getenv("TZ");
+	tz_copy[0] = 0;
+	if (tz)
+		strncpy_s(tz_copy, sizeof(tz_copy), tz, _TRUNCATE);
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+
+	if (CheckParameterGiven()) {
+		GetStrVal(Str1, &Err);
+		format = Str1;
+
+		if (isInvalidStrftimeChar(Str1)) {
+			SetResult(2);
+			return 0;
+//			return ErrSyntax;
+		}
+		set_result = TRUE;
+
+		// タイムゾーンの指定があれば、localtime()に影響させる。(2012.5.2 yutaka)
+		if (CheckParameterGiven()) {
+			GetStrVal(tzStr, &Err);
+			if (Err!=0) return Err;
+			_putenv_s("TZ", tzStr);
+			_tzset();
+		}
+
+	}
+	else {
+		switch (mode) {
+		case RsvGetDate:
+			format = "%Y-%m-%d";
+			break;
+		case RsvGetTime:
+			format = "%H:%M:%S";
+			break;
+		}
+		set_result = FALSE;
+	}
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	// get current date & time
+	time1 = time(NULL);
+	ptm = localtime(&time1);
+
+	if (strftime(Str2, sizeof(Str2), format, ptm)) {
+		SetStrVal(VarId,Str2);
+		if (set_result) SetResult(0);
+	}
+	else {
+		if (set_result) SetResult(1);
+	}
+
+	// Restore timezone
+	_putenv_s("TZ", tz_copy);
+	_tzset();
+
+	return Err;
+}
+
+WORD TTLGetTitle()
+{
+	TVarId VarId;
+	WORD Err;
+	char Str[TitleBuffSize*2];
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err!=0) return Err;
+
+	Err = GetTTParam(CmdGetTitle,Str,sizeof(Str));
+	if (Err==0)
+		SetStrVal(VarId,Str);
+	return Err;
+}
+
+WORD TTLGetTTDir()
+{
+	TVarId VarId;
+	WORD Err;
+	char Temp[MAX_PATH],HomeDir[MAX_PATH];
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (GetModuleFileNameA(NULL, Temp, _countof(Temp)) == 0) {
+		SetStrVal(VarId,"");
+		SetResult(0);
+		return Err;
+	}
+	ExtractDirName(Temp, HomeDir);
+	u8 HomeDirU8 = HomeDir;
+	SetStrVal(VarId,HomeDir);
+	SetResult(1);
+
+	return Err;
+}
+
+// COMポートからレジスタ値を読む。
+// (2015.1.8 yutaka)
+WORD TTLGetModemStatus()
+{
+	TVarId VarId;
+	WORD Err;
+	char Str[MaxStrLen];
+	int Num;
+
+	Err = 0;
+	GetIntVar(&VarId, &Err);
+	if ((Err == 0) && (GetFirstChar() != 0))
+		Err = ErrSyntax;
+	if ((Err == 0) && (!Linked))
+		Err = ErrLinkFirst;
+	if (Err != 0) return Err;
+
+	memset(Str, 0, sizeof(Str));
+	Err = GetTTParam(CmdGetModemStatus, Str, sizeof(Str));
+	if (Err == 0) {
+		Num = atoi(Str);
+		SetIntVal(VarId, Num);
+		SetResult(0);
+	}
+	else {
+		SetResult(1);
+	}
+
+	return Err;
+}
+
+//
+// Tera Term のバージョン取得 & 比較
+// バージョン番号はコンパイル時に決定する。
+// (現在は実行ファイルのバージョン情報は参照しない)
+//
+WORD TTLGetVer()
+{
+	TVarId VarId;
+	WORD Err;
+	TStrVal Str1, Str2;
+	int cur_major = TT_VERSION_MAJOR;
+	int cur_minor = TT_VERSION_MINOR;
+	int compare = 0;
+	int comp_major, comp_minor, ret;
+	int cur_ver, comp_ver;
+
+	Err = 0;
+	GetStrVar(&VarId, &Err);
+
+	if (CheckParameterGiven()) {
+		GetStrVal(Str1, &Err);
+
+		ret = sscanf_s(Str1, "%d.%d", &comp_major, &comp_minor);
+		if (ret != 2) {
+			SetResult(-2);
+			return 0;
+			//Err = ErrSyntax;
+		}
+		compare = 1;
+
+	} else {
+		compare = 0;
+
+	}
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	_snprintf_s(Str2, sizeof(Str2), _TRUNCATE, "%d.%d", cur_major, cur_minor);
+	SetStrVal(VarId, Str2);
+
+	if (compare == 1) {
+		cur_ver = cur_major * 10000 + cur_minor;
+		comp_ver = comp_major * 10000 + comp_minor;
+
+		if (cur_ver < comp_ver) {
+			SetResult(-1);
+		} else if (cur_ver == comp_ver) {
+			SetResult(0);
+		} else {
+			SetResult(1);
+		}
+	}
+
+	return Err;
+}
+
+WORD TTLGoto()
+{
+	TName LabName;
+	WORD Err, VarType;
+	TVarId VarId;
+
+	if (GetLabelName(LabName) && (GetFirstChar()==0))
+	{
+		if (CheckVar(LabName,&VarType,&VarId) && (VarType==TypLabel))
+		{
+			JumpToLabel(VarId);
+			Err = 0;
+		}
+		else
+			Err = ErrLabelReq;
+	}
+	else
+		Err = ErrSyntax;
+
+	return Err;
+}
+
+// add 'ifdefined' (2006.9.23 maya)
+WORD TTLIfDefined()
+{
+	WORD VarType, Err;
+	int Val;
+
+	GetVarType(&VarType,&Val,&Err);
+
+	SetResult(VarType);
+
+	return Err;
+}
+
+BOOL CheckThen(LPWORD Err)
+{
+	BYTE b;
+	TName Temp;
+
+	do {
+
+		do {
+			b = GetFirstChar();
+			if (b==0) return FALSE;
+		} while (((b<'A') || (b>'Z')) &&
+		         (b!='_') &&
+		         ((b<'a') || (b>'z')));
+		LinePtr--;
+		if (! GetIdentifier(Temp)) return FALSE;
+
+	} while (_stricmp(Temp,"then")!=0);
+
+	if (GetFirstChar()!=0)
+		*Err = ErrSyntax;
+	return TRUE;
+}
+
+WORD TTLIf()
+{
+	WORD Err, ValType, Tmp, WId;
+	int Val;
+
+	if (! GetExpression(&ValType,&Val,&Err))
+		return ErrSyntax;
+
+	if (Err!=0) return Err;
+
+	if (ValType!=TypInteger)
+		return ErrTypeMismatch;
+
+	Tmp = LinePtr;
+	if (GetReservedWord(&WId) &&
+	    (WId==RsvThen))
+	{  // If then  ... EndIf structure
+		if (GetFirstChar()!=0)
+			return ErrSyntax;
+		IfNest++;
+		if (Val==0)
+			ElseFlag = 1; // Skip until 'Else' or 'EndIf'
+	}
+	else { // single line If command
+		LinePtr = Tmp;
+		if (!CheckParameterGiven())
+			return ErrSyntax;
+		if (Val==0)
+			return 0;
+		return ExecCmnd();
+	}
+	return Err;
+}
+
+WORD TTLInclude()
+{
+	WORD Err;
+	TStrVal Str;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	if (!GetAbsPath(Str,sizeof(Str))) {
+		Err = ErrCantOpen;
+		return Err;
+	}
+	if (! BuffInclude(Str)) {
+		Err = ErrCantOpen;
+		return Err;
+	}
+
+	return Err;
+}
+
+#if 0
+WORD TTLInputBox(BOOL Paswd)
+{
+	TStrVal Str1, Str2, Str3;
+	WORD Err, ValType, P;
+	TVarId VarId;
+	int sp = 0;
+
+	Err = 0;
+	GetStrVal(Str1,&Err);
+	GetStrVal(Str2,&Err);
+	if (Err!=0) return Err;
+
+	if (!Paswd && CheckParameterGiven()) {
+		// get 3rd arg(optional)
+		P = LinePtr;
+		GetStrVal(Str3,&Err);
+		if (Err == ErrTypeMismatch) {
+			strncpy_s(Str3,sizeof(Str3),"",_TRUNCATE);
+			LinePtr = P;
+			Err = 0;
+		}
+	}
+	else {
+		strncpy_s(Str3,sizeof(Str3),"",_TRUNCATE);
+	}
+
+	// get 4th(3rd) arg(optional) if given
+	if (CheckParameterGiven()) {
+		GetIntVal(&sp, &Err);
+	}
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (sp) {
+		RestoreNewLine(Str1);
+	}
+
+	SetInputStr("");
+	if (CheckVar("inputstr",&ValType,&VarId) &&
+	    (ValType==TypString))
+		OpenInpDlg(StrVarPtr(VarId),Str1,Str2,Str3,Paswd);
+	return Err;
+}
+#endif
+
+WORD TTLInt2Str()
+{
+	TVarId VarId;
+	WORD Err;
+	int Num;
+	TStrVal Str2;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+
+	GetIntVal(&Num,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	_snprintf_s(Str2,sizeof(Str2),_TRUNCATE,"%d",Num);
+
+	SetStrVal(VarId,Str2);
+	return Err;
+}
+
+//
+// logrotate size value
+// logrotate rotate num
+// logrotate halt
+//
+WORD TTLLogRotate() 
+{
+	WORD Err;
+	char Str[MaxStrLen];
+	char Str2[MaxStrLen];
+	char buf[MaxStrLen*2];
+	int size, num, len;
+
+	Err = 0;
+	GetStrVal(Str, &Err);
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err!=0) return Err;
+
+	Err = ErrSyntax;
+	if (strcmp(Str, "size") == 0) {   // ローテートサイズ
+		if (CheckParameterGiven()) {
+			Err = 0;
+			size = 0;
+			GetStrVal(Str2, &Err);
+			if (Err == 0) {
+				len = strlen(Str2);
+				if (isdigit(Str2[len-1])) {
+					num = 1;
+				} else if (Str2[len-1] == 'K') {
+					Str2[len-1] = 0;
+					num = 1024;
+				} else if (Str2[len-1] == 'M') {
+					Str2[len-1] = 0;
+					num = 1024*1024;
+				} else {
+					Err = ErrSyntax;
+				}
+				size = atoi(Str2) * num;
+			}
+
+			if (size < 128)
+				Err = ErrSyntax;
+			if (Err == 0)
+				_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s %u", Str, size);
+		}
+
+	} else if (strcmp(Str, "rotate") == 0) {  // ローテートの世代数
+		if (CheckParameterGiven()) {
+			Err = 0;
+			num = 0;
+			GetIntVal(&num, &Err);
+			if (num <= 0)
+				Err = ErrSyntax;
+			if (Err == 0)
+				_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s %u", Str, num);
+		}
+
+	} else if (strcmp(Str, "halt") == 0) {
+		Err = 0;
+		_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s", Str);
+	} 
+	if (Err!=0) return Err;
+
+	SetFile(buf);
+	Err = SendCmnd(CmdLogRotate, 0);
+
+	return Err;
+}
+
+WORD TTLLogInfo() 
+{
+	WORD Err;
+	TVarId VarId;
+	char Str[MaxStrLen];
+
+	Err = 0;
+	GetStrVar(&VarId, &Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err!=0) return Err;
+
+	Err = GetTTParam(CmdLogInfo, Str, sizeof(Str));
+	if (Err==0) {
+		SetResult(Str[0] - '0');
+		SetStrVal(VarId, Str+1);
+	}
+	return Err;
+}
+
+WORD TTLLogOpen()
+{
+	TStrVal Str;
+	WORD Err;
+	int LogFlags[LogOptMax+1] = { 0 };
+	int TmpFlag;
+	char ret[2];
+
+	Err = 0;
+	GetStrVal(Str, &Err);
+	GetIntVal(&LogFlags[LogOptBinary], &Err);
+	GetIntVal(&LogFlags[LogOptAppend], &Err);
+
+	// plain text
+	if (!CheckParameterGiven()) goto EndLogOptions;
+	GetIntVal(&LogFlags[LogOptPlainText], &Err);
+	if (Err!=0) return Err;
+
+	// timestamp
+	if (!CheckParameterGiven()) goto EndLogOptions;
+	GetIntVal(&LogFlags[LogOptTimestamp], &Err);
+	if (Err!=0) return Err;
+
+	// hide file transfer dialog
+	if (!CheckParameterGiven()) goto EndLogOptions;
+	GetIntVal(&LogFlags[LogOptHideDialog], &Err);
+	if (Err!=0) return Err;
+
+	// Include screen buffer
+	if (!CheckParameterGiven()) goto EndLogOptions;
+	GetIntVal(&LogFlags[LogOptIncScrBuff], &Err);
+	if (Err!=0) return Err;
+
+	// Timestamp Type
+	if (!CheckParameterGiven()) goto EndLogOptions;
+	GetIntVal(&TmpFlag, &Err);
+	if (Err!=0) return Err;
+	if (TmpFlag < 0 || TmpFlag > 3)
+		return ErrSyntax;
+	LogFlags[LogOptTimestampType] = TmpFlag;
+
+EndLogOptions:
+	if (strlen(Str) == 0 || GetFirstChar() != 0)
+		return ErrSyntax;
+
+	SetFile(Str);
+	SetLogOption(LogFlags);
+
+	memset(ret, 0, sizeof(ret));
+	Err = GetTTParam(CmdLogOpen,ret,sizeof(ret));
+	if (Err==0) {
+		if (ret[0] == 0x31) {
+			SetResult(0);
+		}
+		else {
+			SetResult(1);
+		}
+	}
+	return Err;
+}
+
+WORD TTLLoop()
+{
+	WORD WId, Err;
+	int Val = 1;
+
+	Err = 0;
+	if (CheckParameterGiven()) {
+		if (GetReservedWord(&WId)) {
+			switch (WId) {
+				case RsvWhile:
+					GetIntVal(&Val,&Err);
+					break;
+				case RsvUntil:
+					GetIntVal(&Val,&Err);
+					Val = Val == 0;
+					break;
+				default:
+					Err = ErrSyntax;
+			}
+			if ((Err==0) && (GetFirstChar()!=0))
+				Err = ErrSyntax;
+		}
+		else {
+			Err = ErrSyntax;
+		}
+	}
+
+	if (Err!=0) return Err;
+
+	return BackToWhile(Val!=0);
+}
+
+WORD TTLMakePath()
+{
+	TVarId VarId;
+	WORD Err;
+	TStrVal Dir, Name;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetStrVal(Dir,&Err);
+	GetStrVal(Name,&Err);
+	if ((Err==0) &&
+	    (GetFirstChar()!=0))
+		Err = ErrSyntax;
+
+	if (Err!=0) return Err;
+
+	AppendSlash(Dir,sizeof(Dir));
+	strncat_s(Dir,sizeof(Dir),Name,_TRUNCATE);
+	SetStrVal(VarId,Dir);
+
+	return Err;
+}
+
+static void basedirname(char *fullpath, char *dest_base, int base_len, char *dest_dir, int dir_len) {
+	char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
+	char dirname[MAX_PATH];
+	char basename[MAX_PATH];
+
+	_splitpath_s(fullpath, drive, sizeof(drive), dir, sizeof(dir), fname, sizeof(fname), ext, sizeof(ext));
+	strncpy_s(dirname, sizeof(dirname), drive, _TRUNCATE);
+	strncat_s(dirname, sizeof(dirname), dir, _TRUNCATE);
+	DeleteSlash(dirname); // 末尾の \ を取り除く
+	if (strlen(fname) == 0 && strlen(ext) == 0) {
+		_splitpath_s(dirname, drive, sizeof(drive), dir, sizeof(dir), fname, sizeof(fname), ext, sizeof(ext));
+		strncpy_s(dirname, sizeof(dirname), drive, _TRUNCATE);
+		strncat_s(dirname, sizeof(dirname), dir, _TRUNCATE);
+		DeleteSlash(dirname); // 末尾の \ を取り除く
+		strncpy_s(basename, sizeof(basename), fname, _TRUNCATE);
+		strncat_s(basename, sizeof(basename), ext, _TRUNCATE);
+	}
+	else {
+		strncpy_s(basename, sizeof(basename), fname, _TRUNCATE);
+		strncat_s(basename, sizeof(basename), ext, _TRUNCATE);
+	}
+
+	if (dest_dir != NULL) {
+		strncpy_s(dest_dir, dir_len, dirname, _TRUNCATE);
+	}
+	if (dest_base != NULL) {
+		strncpy_s(dest_base, base_len, basename, _TRUNCATE);
+	}
+}
+
+static void basename(char *fullpath, char *dest, int len) {
+	basedirname(fullpath, dest, len, NULL, 0);
+}
+
+static void dirname(char *fullpath, char *dest, int len) {
+	basedirname(fullpath, NULL, 0, dest, len);
+}
+
+WORD TTLBasename()
+{
+	TVarId VarId;
+	WORD Err;
+	TStrVal Src, Name;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetStrVal(Src,&Err);
+	if ((Err==0) &&
+	    (GetFirstChar()!=0))
+		Err = ErrSyntax;
+
+	if (Err!=0) return Err;
+
+	basename(Src, Name, sizeof(Name));
+	SetStrVal(VarId, Name);
+
+	return Err;
+}
+
+WORD TTLDirname()
+{
+	TVarId VarId;
+	WORD Err;
+	TStrVal Src, Dir;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetStrVal(Src,&Err);
+	if ((Err==0) &&
+	    (GetFirstChar()!=0))
+		Err = ErrSyntax;
+
+	if (Err!=0) return Err;
+
+	dirname(Src, Dir, sizeof(Dir));
+	SetStrVal(VarId, Dir);
+
+	return Err;
+}
+
+#if 0
+WORD TTLDirnameBox()
+{
+	TStrVal Title;
+	WORD Err, ValType;
+	TVarId VarId;
+	char buf[MAX_PATH];
+	TStrVal InitDir = "";
+	BOOL ret;
+
+	Err = 0;
+	GetStrVal(Title, &Err);
+	if (Err != 0) return Err;
+
+	// get 2nd arg(optional) if given
+	if (CheckParameterGiven()) { // initdir
+		GetStrVal(InitDir, &Err);
+		if (Err != 0) return Err;
+	}
+
+	if ((Err == 0) && (GetFirstChar() != 0))
+		Err = ErrSyntax;
+	if (Err != 0) return Err;
+
+	SetInputStr("");
+	if (CheckVar("inputstr", &ValType, &VarId) &&
+	    (ValType == TypString)) {
+		BringupWindow(HMainWin);
+		if (doSelectFolder(HMainWin, buf, sizeof(buf), InitDir, Title)) {
+			SetInputStr(buf);
+			ret = 1;
+		}
+		else {
+			ret = 0;
+		}
+		SetResult(ret);
+	}
+	return Err;
+}
+
+#if 0
+#define IdMsgBox 1
+#define IdYesNoBox 2
+#define IdStatusBox 3
+#define IdListBox 4
+#define LISTBOX_ITEM_NUM 10
+#endif
+
+int MessageCommand(int BoxId, LPWORD Err)
+{
+	TStrVal Str1, Str2;
+	int sp = 0;
+	int ret;
+	char **s;
+	int i, ary_size;
+	int sel = 0;
+	TVarId VarId, VarId2;
+
+	*Err = 0;
+	GetStrVal2(Str1, Err, TRUE);
+	GetStrVal2(Str2, Err, TRUE);
+	if (*Err!=0) return 0;
+
+	if (BoxId != IdListBox) {
+		// get 3rd arg(optional) if given
+		if (CheckParameterGiven()) {
+			GetIntVal(&sp, Err);
+		}
+		if ((*Err==0) && (GetFirstChar()!=0))
+			*Err = ErrSyntax;
+		if (*Err!=0) return 0;
+	}
+
+	if (sp) {
+		RestoreNewLine(Str1);
+	}
+
+	if (BoxId==IdMsgBox) {
+		ret = OpenMsgDlg(Str1,Str2,FALSE);
+		// メッセージボックスをキャンセルすると、マクロの終了とする。
+		// (2008.8.5 yutaka)
+		if (ret == IDCANCEL) {
+			TTLStatus = IdTTLEnd;
+		}
+	} else if (BoxId==IdYesNoBox) {
+		ret = OpenMsgDlg(Str1,Str2,TRUE);
+		// メッセージボックスをキャンセルすると、マクロの終了とする。
+		// (2008.8.6 yutaka)
+		if (ret == IDCLOSE) {
+			TTLStatus = IdTTLEnd;
+		}
+		return (ret);
+	}
+	else if (BoxId==IdStatusBox) {
+		OpenStatDlg(Str1,Str2);
+
+	} else if (BoxId==IdListBox) {
+		//  リストボックスの選択肢を取得する。
+		GetStrAryVar(&VarId, Err);
+
+		if (CheckParameterGiven()) {
+			GetIntVal(&sel, Err);
+		}
+		if (*Err==0 && GetFirstChar()!=0)
+			*Err = ErrSyntax;
+		if (*Err!=0) return 0;
+
+		ary_size = GetStrAryVarSize(VarId);
+		if (sel < 0 || sel >= ary_size) {
+			sel = 0;
+		}
+
+		s = (char **)calloc(ary_size + 1, sizeof(char *));
+		if (s == NULL) {
+			*Err = ErrFewMemory;
+			return -1;
+		}
+		for (i = 0 ; i < ary_size ; i++) {
+			VarId2 = GetStrVarFromArray(VarId, i, Err);
+			if (*Err!=0) return -1;
+			s[i] = _strdup(StrVarPtr(VarId2));
+		}
+		if (s[0] == NULL) {
+			*Err = ErrSyntax;
+			return -1;
+		}
+
+		// return 
+		//   0以上: 選択項目
+		//   -1: キャンセル
+		//	 -2: close
+		ret = OpenListDlg(Str1, Str2, s, sel);
+
+		for (i = 0 ; i < ary_size ; i++) {
+			free(s[i]);
+		}
+		free(s);
+
+		// リストボックスの閉じるボタン(&確認ダイアログ)で、マクロの終了とする。
+		if (ret == -2) {
+			TTLStatus = IdTTLEnd;
+		}
+		return (ret);
+
+	}
+	return 0;
+}
+
+// リストボックス
+// (2013.3.13 yutaka)
+WORD TTLListBox()
+{
+	WORD Err;
+	int ret;
+
+	ret = MessageCommand(IdListBox, &Err);
+	SetResult(ret);
+	return Err;
+}
+
+WORD TTLMessageBox()
+{
+	WORD Err;
+
+	MessageCommand(IdMsgBox, &Err);
+	return Err;
+}
+#endif
+
+WORD TTLNext()
+{
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+	return NextLoop();
+}
+
+WORD TTLPause()
+{
+	int TimeOut;
+	WORD Err;
+
+	Err = 0;
+	GetIntVal(&TimeOut,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (TimeOut>0)
+	{
+		TTLStatus = IdTTLPause;
+		TimeLimit = (DWORD)(TimeOut*1000);
+		TimeStart = GetTickCount();
+		SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
+	}
+	return Err;
+}
+
+// add 'mpause' command
+// SYNOPSIS: mpause millisecoand
+// DESCRIPTION: This command would sleep Tera Term macro program by specified millisecond time.
+// (2006.2.10 yutaka)
+WORD TTLMilliPause()
+{
+	int TimeOut;
+	WORD Err;
+
+	Err = 0;
+	GetIntVal(&TimeOut,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (TimeOut > 0) {
+		Sleep(TimeOut);
+	}
+
+	return Err;
+}
+
+
+// add 'random' command
+// SYNOPSIS: random <intvar> <value>
+// DESCRIPTION: 
+// This command generates the random value from 0 to <value> and
+// stores the value to <intvar>.
+// (2006.2.11 yutaka)
+WORD TTLRandom()
+{
+	static int init_done = 0;
+	static sfmt_t sfmt;
+	TVarId VarId;
+	WORD Err;
+	int MaxNum;
+	unsigned int Num, RandMin;
+
+	Err = 0;
+	GetIntVar(&VarId,&Err);
+	GetIntVal(&MaxNum,&Err);
+
+	if ( ((Err==0) && (GetFirstChar()!=0)) || MaxNum <= 0)
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	MaxNum++;
+
+	/* 2**32 % x == (2**32 - x) % x */
+	RandMin = (unsigned int) -MaxNum % MaxNum;
+
+	if (!init_done) {
+		init_done = 1;
+		sfmt_init_gen_rand(&sfmt, (unsigned int)time(NULL));
+	}
+
+	do {
+		Num = sfmt_genrand_uint32(&sfmt);
+	} while (Num < RandMin);
+
+	SetIntVal(VarId, (int)(Num % MaxNum));
+
+	return Err;
+}
+
+WORD TTLRecvLn()
+{
+	TStrVal Str;
+	WORD ValType;
+	TVarId VarId;
+	int TimeOut;
+
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+	if (! Linked)
+		return ErrLinkFirst;
+
+	ClearWait();
+
+	Str[0] = 0x0a;
+	Str[1] = 0;
+	SetWait(1,Str);
+	SetInputStr("");
+	SetResult(1);
+	TTLStatus = IdTTLWaitNL;
+	TimeOut = 0;
+	if (CheckVar("timeout",&ValType,&VarId) && (ValType==TypInteger)) {
+		TimeOut = CopyIntVal(VarId) * 1000;
+	}
+	if (CheckVar("mtimeout",&ValType,&VarId) && (ValType==TypInteger)) {
+		TimeOut += CopyIntVal(VarId);
+	}
+
+	if (TimeOut>0)
+	{
+		TimeLimit = (DWORD)TimeOut;
+		TimeStart = GetTickCount();
+		SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
+	}
+
+	return 0;
+}
+
+WORD TTLRegexOption()
+{
+	TStrVal Str;
+	WORD Err;
+	int opt_none_flag = 0;
+	OnigOptionType new_opt = ONIG_OPTION_NONE;
+	OnigEncoding new_enc = ONIG_ENCODING_UNDEF;
+	OnigSyntaxType *new_syntax = NULL;
+
+	Err = 0;
+
+	while (CheckParameterGiven()) {
+		GetStrVal(Str, &Err);
+		if (Err)
+			return Err;
+
+		// Encoding
+		if (_stricmp(Str, "ENCODING_ASCII")==0 || _stricmp(Str, "ASCII")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ASCII;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_1")==0 || _stricmp(Str, "ISO_8859_1")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_1;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_2")==0 || _stricmp(Str, "ISO_8859_2")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_2;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_3")==0 || _stricmp(Str, "ISO_8859_3")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_3;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_4")==0 || _stricmp(Str, "ISO_8859_4")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_4;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_5")==0 || _stricmp(Str, "ISO_8859_5")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_5;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_6")==0 || _stricmp(Str, "ISO_8859_6")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_6;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_7")==0 || _stricmp(Str, "ISO_8859_7")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_7;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_8")==0 || _stricmp(Str, "ISO_8859_8")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_8;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_9")==0 || _stricmp(Str, "ISO_8859_9")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_9;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_10")==0 || _stricmp(Str, "ISO_8859_10")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_10;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_11")==0 || _stricmp(Str, "ISO_8859_11")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_11;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_13")==0 || _stricmp(Str, "ISO_8859_13")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_13;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_14")==0 || _stricmp(Str, "ISO_8859_14")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_14;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_15")==0 || _stricmp(Str, "ISO_8859_15")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_15;
+		}
+		else if (_stricmp(Str, "ENCODING_ISO_8859_16")==0 || _stricmp(Str, "ISO_8859_16")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_ISO_8859_16;
+		}
+		else if (_stricmp(Str, "ENCODING_UTF8")==0 || _stricmp(Str, "UTF8")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_UTF8;
+		}
+		else if (_stricmp(Str, "ENCODING_UTF16_BE")==0 || _stricmp(Str, "UTF16_BE")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_UTF16_BE;
+		}
+		else if (_stricmp(Str, "ENCODING_UTF16_LE")==0 || _stricmp(Str, "UTF16_LE")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_UTF16_LE;
+		}
+		else if (_stricmp(Str, "ENCODING_UTF32_BE")==0 || _stricmp(Str, "UTF32_BE")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_UTF32_BE;
+		}
+		else if (_stricmp(Str, "ENCODING_UTF32_LE")==0 || _stricmp(Str, "UTF32_LE")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_UTF32_LE;
+		}
+		else if (_stricmp(Str, "ENCODING_EUC_JP")==0 || _stricmp(Str, "EUC_JP")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_EUC_JP;
+		}
+		else if (_stricmp(Str, "ENCODING_EUC_TW")==0 || _stricmp(Str, "EUC_TW")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_EUC_TW;
+		}
+		else if (_stricmp(Str, "ENCODING_EUC_KR")==0 || _stricmp(Str, "EUC_KR")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_EUC_KR;
+		}
+		else if (_stricmp(Str, "ENCODING_EUC_CN")==0 || _stricmp(Str, "EUC_CN")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_EUC_CN;
+		}
+		else if (_stricmp(Str, "ENCODING_SJIS")==0 || _stricmp(Str, "SJIS")==0
+		      || _stricmp(Str, "ENCODING_CP932")==0 || _stricmp(Str, "CP932")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_SJIS;
+		}
+		else if (_stricmp(Str, "ENCODING_KOI8_R")==0 || _stricmp(Str, "KOI8_R")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_KOI8_R;
+		}
+		else if (_stricmp(Str, "ENCODING_CP1251")==0 || _stricmp(Str, "CP1251")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_CP1251;
+		}
+		else if (_stricmp(Str, "ENCODING_BIG5")==0 || _stricmp(Str, "BIG5")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_BIG5;
+		}
+		else if (_stricmp(Str, "ENCODING_GB18030")==0 || _stricmp(Str, "GB18030")==0) {
+			if (new_enc != ONIG_ENCODING_UNDEF)
+				return ErrSyntax;
+			new_enc = ONIG_ENCODING_GB18030;
+		}
+
+		// Syntax
+		else if (_stricmp(Str, "SYNTAX_DEFAULT")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_DEFAULT;
+		}
+		else if (_stricmp(Str, "SYNTAX_ASIS")==0 || _stricmp(Str, "ASIS")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_ASIS;
+		}
+		else if (_stricmp(Str, "SYNTAX_POSIX_BASIC")==0 || _stricmp(Str, "POSIX_BASIC")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_POSIX_BASIC;
+		}
+		else if (_stricmp(Str, "SYNTAX_POSIX_EXTENDED")==0 || _stricmp(Str, "POSIX_EXTENDED")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_POSIX_EXTENDED;
+		}
+		else if (_stricmp(Str, "SYNTAX_EMACS")==0 || _stricmp(Str, "EMACS")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_EMACS;
+		}
+		else if (_stricmp(Str, "SYNTAX_GREP")==0 || _stricmp(Str, "GREP")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_GREP;
+		}
+		else if (_stricmp(Str, "SYNTAX_GNU_REGEX")==0 || _stricmp(Str, "GNU_REGEX")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_GNU_REGEX;
+		}
+		else if (_stricmp(Str, "SYNTAX_JAVA")==0 || _stricmp(Str, "JAVA")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_JAVA;
+		}
+		else if (_stricmp(Str, "SYNTAX_PERL")==0 || _stricmp(Str, "PERL")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_PERL;
+		}
+		else if (_stricmp(Str, "SYNTAX_PERL_NG")==0 || _stricmp(Str, "PERL_NG")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_PERL_NG;
+		}
+		else if (_stricmp(Str, "SYNTAX_RUBY")==0 || _stricmp(Str, "RUBY")==0) {
+			if (new_syntax != NULL)
+				return ErrSyntax;
+			new_syntax = ONIG_SYNTAX_RUBY;
+		}
+
+		// Option
+		else if (_stricmp(Str, "OPTION_NONE")==0) {
+			if (new_opt != ONIG_OPTION_NONE || opt_none_flag != 0)
+				return ErrSyntax;
+			new_opt = ONIG_OPTION_NONE;
+			opt_none_flag = 1;
+		}
+		else if (_stricmp(Str, "OPTION_SINGLELINE")==0 || _stricmp(Str, "SINGLELINE")==0) {
+			new_opt |= ONIG_OPTION_SINGLELINE;
+		}
+		else if (_stricmp(Str, "OPTION_MULTILINE")==0 || _stricmp(Str, "MULTILINE")==0) {
+			new_opt |= ONIG_OPTION_MULTILINE;
+		}
+		else if (_stricmp(Str, "OPTION_IGNORECASE")==0 || _stricmp(Str, "IGNORECASE")==0) {
+			new_opt |= ONIG_OPTION_IGNORECASE;
+		}
+		else if (_stricmp(Str, "OPTION_EXTEND")==0 || _stricmp(Str, "EXTEND")==0) {
+			new_opt |= ONIG_OPTION_EXTEND;
+		}
+		else if (_stricmp(Str, "OPTION_FIND_LONGEST")==0 || _stricmp(Str, "FIND_LONGEST")==0) {
+			new_opt |= ONIG_OPTION_FIND_LONGEST;
+		}
+		else if (_stricmp(Str, "OPTION_FIND_NOT_EMPTY")==0 || _stricmp(Str, "FIND_NOT_EMPTY")==0) {
+			new_opt |= ONIG_OPTION_FIND_NOT_EMPTY;
+		}
+		else if (_stricmp(Str, "OPTION_NEGATE_SINGLELINE")==0 || _stricmp(Str, "NEGATE_SINGLELINE")==0) {
+			new_opt |= ONIG_OPTION_NEGATE_SINGLELINE;
+		}
+		else if (_stricmp(Str, "OPTION_DONT_CAPTURE_GROUP")==0 || _stricmp(Str, "DONT_CAPTURE_GROUP")==0) {
+			new_opt |= ONIG_OPTION_DONT_CAPTURE_GROUP;
+		}
+		else if (_stricmp(Str, "OPTION_CAPTURE_GROUP")==0 || _stricmp(Str, "CAPTURE_GROUP")==0) {
+			new_opt |= ONIG_OPTION_CAPTURE_GROUP;
+		}
+
+		else {
+			return ErrSyntax;
+		}
+	}
+
+
+	if (new_enc != ONIG_ENCODING_UNDEF) {
+		RegexEnc = new_enc;
+	}
+	if (new_syntax != NULL) {
+		RegexSyntax = new_syntax;
+	}
+	if (new_opt != ONIG_OPTION_NONE || opt_none_flag != 0) {
+		RegexOpt = new_opt;
+	}
+
+	return 0;
+}
+
+WORD TTLReturn()
+{
+	if (GetFirstChar()==0)
+		return ReturnFromSub();
+	else
+		return ErrSyntax;
+}
+
+// add 'rotateleft' and 'rotateright' (2007.8.19 maya)
+#define ROTATE_DIR_LEFT 0
+#define ROTATE_DIR_RIGHT 1
+WORD BitRotate(int direction)
+{
+	TVarId VarId;
+	WORD Err;
+	int x, n;
+
+	Err = 0;
+	GetIntVar(&VarId, &Err);
+	GetIntVal(&x, &Err);
+	GetIntVal(&n, &Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (direction == ROTATE_DIR_RIGHT)
+		n = -n;
+
+	n %= INT_BIT;
+
+	if (n < 0)
+		n += INT_BIT;
+
+	if (n == 0) {
+		SetIntVal(VarId, x);
+	} else {
+		SetIntVal(VarId, (x << n) | ((unsigned int)x >> (INT_BIT-n)));
+	}
+	return Err;
+}
+
+WORD TTLRotateLeft()
+{
+	return BitRotate(ROTATE_DIR_LEFT);
+}
+
+WORD TTLRotateRight()
+{
+	return BitRotate(ROTATE_DIR_RIGHT);
+}
+
+WORD TTLSend()
+{
+	TStrVal Str;
+	WORD Err, ValType;
+	int Val;
+	BOOL EndOfLine;
+
+	if (! Linked)
+		return ErrLinkFirst;
+
+	EndOfLine = FALSE;
+	do {
+		if (GetString(Str,&Err))
+		{
+			if (Err!=0) return Err;
+#if 0
+			DDEOut(Str);
+#else
+			const char *StrU8 = ToCharU8(Str);
+			DDEOut(Str);
+			free((void *)Str);
+#endif
+		}
+		else if (GetExpression(&ValType,&Val,&Err))
+		{
+			if (Err!=0) return Err;
+			switch (ValType) {
+				case TypInteger: DDEOut1Byte(LOBYTE(Val)); break;
+				case TypString: DDEOut(StrVarPtr((TVarId)Val)); break;
+				default:
+					return ErrTypeMismatch;
+			}
+		}
+		else
+			EndOfLine = TRUE;
+	} while (! EndOfLine);
+	return 0;
+}
+
+/*
+ * src に含まれる 0x01 を 0x01 0x02 に置き換えて dst にコピーする。
+ * TStrVal には 0x00 が含まれる事が無い(終端と区別できない)ので 0x00 は考慮する必要なし。
+ */
+static void AddBroadcastString(char *dst, int dstlen, char *src)
+{
+	int i;
+
+	i = strlen(dst);
+	dst += i;
+	dstlen -= i;
+
+	while (*src != 0 && dstlen > 1) {
+		if (*src == 0x01) {
+			// 0x01 を格納するには 0x01 0x02 の2バイト + NUL 終端用の1バイトが必要
+			if (dstlen < 3) {
+				break;
+			}
+			*dst++ = *src++;
+			*dst++ = 0x02;
+			dstlen -= 2;
+		}
+		else {
+			*dst++ = *src++;
+			dstlen--;
+		}
+	}
+
+	*dst = 0;
+}
+
+/*
+ * TTLSendBroadcast / TTLSendMulticast の下請け
+ *
+ * 各パラメータを連結した文字列を buff に格納して返す。
+ * crlf が TRUE の時は各パラメータの間に "\n" を挟む。(要検討)
+ *
+ * パラメータが String の場合はそのまま、Integer の場合は ASCII コードとみなしてその文字を送る。
+ * Tera Term 側では send 等と共通のルーチンが使われる為、DDE 通信の為のエンコードを行う必要有り。
+ *   0x00 -> 0x01 0x01
+ *   0x01 -> 0x01 0x02
+ */
+static WORD GetBroadcastString(char *buff, int bufflen, BOOL crlf)
+{
+	TStrVal Str;
+	WORD Err, ValType;
+	int Val;
+	char tmp[3];
+
+	buff[0] = '\0';
+
+	while (1) {
+		if (GetString(Str, &Err)) {
+			if (Err!=0) return Err;
+			AddBroadcastString(buff, bufflen, Str);
+		}
+		else if (GetExpression(&ValType, &Val, &Err)) {
+			if (Err!=0) return Err;
+			switch (ValType) {
+				case TypInteger:
+					Val = LOBYTE(Val);
+					if (Val == 0 || Val == 1) {
+						tmp[0] = 1;
+						tmp[1] = Val + 1;
+						tmp[2] = 0;
+					}
+					else {
+						tmp[0] = Val;
+						tmp[1] = 0;
+					}
+					strncat_s(buff, bufflen, tmp, _TRUNCATE);
+					break;
+				case TypString: 
+					AddBroadcastString(buff, bufflen, StrVarPtr((TVarId)Val));
+					break;
+				default:
+					return ErrTypeMismatch;
+			}
+		}
+		else {
+			break;
+		}
+	}
+	if (crlf) {
+		strncat_s(buff, bufflen, "\r\n", _TRUNCATE);
+	}
+	return 0;
+}
+
+// sendbroadcast / sendlnbroadcast の二つから利用 (crlfの値で動作を変える)
+static WORD TTLSendBroadcast(BOOL crlf)
+{
+	TStrVal buf;
+	WORD Err;
+
+	if (! Linked)
+		return ErrLinkFirst;
+
+	if ((Err = GetBroadcastString(buf, MaxStrLen, crlf)) != 0)
+		return Err;
+
+	SetFile(buf);
+	return SendCmnd(CmdSendBroadcast, 0);
+}
+
+WORD TTLSetMulticastName()
+{
+	TStrVal Str;
+	WORD Err;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	if (Err!=0) return Err;
+
+	SetFile(Str);
+	return SendCmnd(CmdSetMulticastName, 0);
+}
+
+// sendmulticast / sendlnmulticast の二つから利用 (crlfの値で動作を変える)
+WORD TTLSendMulticast(BOOL crlf)
+{
+	TStrVal buf, Str;
+	WORD Err;
+
+	if (! Linked)
+		return ErrLinkFirst;
+
+	// マルチキャスト識別用の名前を取得する。
+	Err = 0;
+	GetStrVal(Str,&Err);
+	if (Err!=0) return Err;
+	SetFile(Str);
+
+	if ((Err = GetBroadcastString(buf, MaxStrLen, crlf)) != 0)
+		return Err;
+
+	SetSecondFile(buf);
+	return SendCmnd(CmdSendMulticast, 0);
+}
+
+WORD TTLSendFile()
+{
+	TStrVal Str;
+	WORD Err;
+	int BinFlag;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	GetIntVal(&BinFlag,&Err);
+	if ((Err==0) &&
+	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+
+	if (Err!=0) return Err;
+
+	SetFile(Str);
+	SetBinary(BinFlag);
+	return SendCmnd(CmdSendFile,IdTTLWaitCmndEnd);
+}
+
+WORD TTLSendKCode()
+{
+	TStrVal Str;
+	WORD Err;
+	int KCode, Count;
+
+	Err = 0;
+	GetIntVal(&KCode,&Err);
+	GetIntVal(&Count,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	Word2HexStr((WORD)KCode,Str);
+	Word2HexStr((WORD)Count,&Str[4]);
+	SetFile(Str);
+	return SendCmnd(CmdSendKCode,0);
+}
+
+WORD TTLSendLn()
+{
+	WORD Err;
+	char Str[3];
+
+	Err = TTLSend();
+	if (Err==0)
+	{
+		Str[0] = 0x0D;
+		Str[1] = 0x0A;
+		Str[2] = 0;
+		if (Linked)
+			DDEOut(Str);
+		else
+			Err = ErrLinkFirst;
+	}
+	return Err;
+}
+
+WORD TTLSetDate()
+{
+	WORD Err;
+	TStrVal Str;
+	int y, m, d;
+	SYSTEMTIME Time;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	Str[4] = 0;
+	if (sscanf(Str,"%u",&y)!=1) return 0;
+	Str[7] = 0;
+	if (sscanf(&(Str[5]),"%u",&m)!=1) return 0;
+	Str[10] = 0;
+	if (sscanf(&(Str[8]),"%u",&d)!=1) return 0;
+	GetLocalTime(&Time);
+	Time.wYear = y;
+	Time.wMonth = m;
+	Time.wDay = d;
+	SetLocalTime(&Time);
+	return Err;
+}
+
+WORD TTLSetDir()
+{
+	WORD Err;
+	TStrVal Str;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	TTMSetDir(Str);
+
+	return Err;
+}
+
+WORD TTLSetDlgPos()
+{
+	WORD Err;
+	int x, y;
+
+	Err = 0;
+	GetIntVal(&x,&Err);
+	GetIntVal(&y,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	SetDlgPos(x,y);
+	return Err;
+}
+
+// reactivate 'setenv' (2007.8.31 maya)
+WORD TTLSetEnv()
+{
+	WORD Err;
+	TStrVal Str, Str2;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	GetStrVal(Str2,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	_putenv_s(Str,Str2);
+	return Err;
+}
+
+WORD TTLSetExitCode()
+{
+	WORD Err;
+	int Val;
+
+	Err = 0;
+	GetIntVal(&Val,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	ExitCode = Val;
+	return Err;
+}
+
+WORD TTLSetFileAttr()
+{
+	WORD Err;
+	TStrVal Filename;
+	int attributes;
+
+	Err = 0;
+	GetStrVal(Filename,&Err);
+	GetIntVal(&attributes,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (SetFileAttributes(tc::fromUtf8(Filename), attributes) == 0) {
+		SetResult(0);
+	}
+	else {
+		SetResult(1);
+	}
+
+	return Err;
+}
+
+WORD TTLSetSync()
+{
+	WORD Err;
+	int Val;
+
+	Err = 0;
+	GetIntVal(&Val,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err!=0) return Err;
+
+	if (Val==0)
+		SetSync(FALSE);
+	else
+		SetSync(TRUE);
+
+	return 0;
+}
+
+WORD TTLSetTime()
+{
+	WORD Err;
+	TStrVal Str;
+	int h, m, s;
+	SYSTEMTIME Time;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	Str[2] = 0;
+	if (sscanf(Str,"%u",&h)!=1) return 0;
+	Str[5] = 0;
+	if (sscanf(&(Str[3]),"%u",&m)!=1) return 0;
+	Str[8] = 0;
+	if (sscanf(&(Str[6]),"%u",&s)!=1) return 0;
+
+	GetLocalTime(&Time);
+	Time.wHour = h;
+	Time.wMinute = m;
+	Time.wSecond = s;
+	SetLocalTime(&Time);
+
+	return Err;
+}
+
+WORD TTLShow()
+{
+	WORD Err;
+	int Val;
+
+	Err = 0;
+	GetIntVal(&Val,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	if (Val==0)
+		ShowWindow(HMainWin,SW_MINIMIZE);
+	else if (Val>0) {
+		ShowWindow(HMainWin,SW_RESTORE);
+		PostMessage(HMainWin, WM_USER_MACROBRINGUP, 0, 0);
+	}
+	else
+		ShowWindow(HMainWin,SW_HIDE);
+	return Err;
+}
+
+// 'sprintf': Format a string in the style of sprintf
+//
+// (2007.5.1 yutaka)
+// (2007.5.3 maya)
+WORD TTLSprintf(int getvar)
+{
+	TStrVal Fmt;
+	int Num, NumWidth, NumPrecision;
+	TStrVal Str;
+	WORD Err = 0, TmpErr;
+	TVarId VarId;
+	char buf[MaxStrLen];
+	char *p, subFmt[MaxStrLen], buf2[MaxStrLen];
+	int width_asterisk, precision_asterisk, reg_beg, reg_end, reg_len, i;
+	char *match_str;
+
+	enum arg_type {
+		INTEGER,
+		DOUBLE,
+		STRING,
+		NONE
+	};
+	enum arg_type type;
+
+	int r;
+	unsigned char *start, *range, *end;
+	regex_t* reg;
+	OnigErrorInfo einfo;
+	OnigRegion *region;
+	UChar* pattern, * str;
+
+	if (getvar) {
+		GetStrVar(&VarId, &Err);
+		if (Err!=0) {
+			SetResult(4);
+			return Err;
+		}
+	}
+
+//	pattern = (UChar* )"^%[-+0 #]*(?:[1-9][0-9]*)?(?:\\.[0-9]*)?$";
+	pattern = (UChar* )"^%[-+0 #]*([1-9][0-9]*|\\*)?(?:\\.([0-9]*|\\*))?$";
+	//               flags--------
+	//                       width------------------
+	//                                     precision--------------------
+
+	r = onig_new(&reg, pattern, pattern + strlen((char *)pattern),
+	             ONIG_OPTION_NONE, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT,
+	             &einfo);
+	if (r != ONIG_NORMAL) {
+		char s[ONIG_MAX_ERROR_MESSAGE_LEN];
+		onig_error_code_to_str((OnigUChar *)s, r, &einfo);
+		fprintf(stderr, "ERROR: %s\n", s);
+		SetResult(-1);
+		goto exit2;
+	}
+
+	region = onig_region_new();
+
+	GetStrVal(Fmt, &Err);
+	if (Err!=0) {
+		SetResult(1);
+		goto exit2;
+	}
+
+	p = Fmt;
+	memset(buf, 0, sizeof(buf));
+	memset(subFmt, 0, sizeof(subFmt));
+	while(*p != '\0') {
+		if (strlen(subFmt)>0) {
+			type = NONE;
+			switch (*p) {
+				case '%':
+					if (strlen(subFmt) == 1) { // "%%" -> "%"
+						strncat_s(buf, sizeof(buf), "%", _TRUNCATE);
+						memset(subFmt, 0, sizeof(subFmt));
+					}
+					else {
+						// 一つ手前までをそのまま buf に格納
+						strncat_s(buf, sizeof(buf), subFmt, _TRUNCATE);
+						// 仕切り直し
+						memset(subFmt, 0, sizeof(subFmt));
+						strncat_s(subFmt, sizeof(subFmt), p, 1);
+					}
+					break;
+
+				case 'c':
+				case 'd':
+				case 'i':
+				case 'o':
+				case 'u':
+				case 'x':
+				case 'X':
+					type = INTEGER;
+
+				case 'e':
+				case 'E':
+				case 'f':
+				case 'g':
+				case 'G':
+				case 'a':
+				case 'A':
+					if (type == NONE) {
+						type = DOUBLE;
+					}
+
+				case 's':
+					if (type == NONE) {
+						type = STRING;
+					}
+
+					// "%" と *p の間が正しいかチェック
+					str = (UChar* )subFmt;
+					end   = str + strlen(subFmt);
+					start = str;
+					range = end;
+					r = onig_search(reg, str, end, start, range, region,
+					                ONIG_OPTION_NONE);
+					if (r != 0) {
+						SetResult(2);
+						Err = ErrSyntax;
+						goto exit1;
+					}
+
+					strncat_s(subFmt, sizeof(subFmt), p, 1);
+
+					// width, precision が * かどうかチェック
+					width_asterisk = precision_asterisk = 0;
+					if (region->num_regs != 3) {
+						SetResult(-1);
+						goto exit2;
+					}
+					reg_beg = region->beg[1];
+					reg_end = region->end[1];
+					reg_len = reg_end - reg_beg;
+					match_str = (char*)calloc(reg_len + 1, sizeof(char));
+					for (i = 0; i < reg_len; i++) {
+						match_str[i] = str[reg_beg + i];
+					}
+					if (strcmp(match_str, "*") == 0) {
+						width_asterisk = 1;
+					}
+					free(match_str);
+					reg_beg = region->beg[2];
+					reg_end = region->end[2];
+					reg_len = reg_end - reg_beg;
+					match_str = (char*)calloc(reg_len + 1, sizeof(char));
+					for (i = 0; i < reg_len; i++) {
+						match_str[i] = str[reg_beg + i];
+					}
+					if (strcmp(match_str, "*") == 0) {
+						precision_asterisk = 1;
+					}
+					free(match_str);
+
+					// * に対応する引数を取得
+					if (width_asterisk) {
+						TmpErr = 0;
+						GetIntVal(&NumWidth, &TmpErr);
+						if (TmpErr != 0) {
+							SetResult(3);
+							Err = TmpErr;
+							goto exit1;
+						}
+					}
+					if (precision_asterisk) {
+						TmpErr = 0;
+						GetIntVal(&NumPrecision, &TmpErr);
+						if (TmpErr != 0) {
+							SetResult(3);
+							Err = TmpErr;
+							goto exit1;
+						}
+					}
+
+					if (type == STRING || type == DOUBLE) {
+						// 文字列として読めるかトライ
+						TmpErr = 0;
+						GetStrVal(Str, &TmpErr);
+						if (TmpErr == 0) {
+							if (type == STRING) {
+								if (!width_asterisk && !precision_asterisk) {
+									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, Str);
+								}
+								else if (width_asterisk && !precision_asterisk) {
+									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, Str);
+								}
+								else if (!width_asterisk && precision_asterisk) {
+									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, Str);
+								}
+								else { // width_asterisk && precision_asterisk
+									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, Str);
+								}
+							}
+							else { // DOUBLE
+								if (!width_asterisk && !precision_asterisk) {
+									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, atof(Str));
+								}
+								else if (width_asterisk && !precision_asterisk) {
+									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, atof(Str));
+								}
+								else if (!width_asterisk && precision_asterisk) {
+									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, atof(Str));
+								}
+								else { // width_asterisk && precision_asterisk
+									_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, atof(Str));
+								}
+							}
+						}
+						else {
+							SetResult(3);
+							Err = TmpErr;
+							goto exit1;
+						}
+					}
+					else {
+						// 数値として読めるかトライ
+						TmpErr = 0;
+						GetIntVal(&Num, &TmpErr);
+						if (TmpErr == 0) {
+							if (!width_asterisk && !precision_asterisk) {
+								_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, Num);
+							}
+							else if (width_asterisk && !precision_asterisk) {
+								_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, Num);
+							}
+							else if (!width_asterisk && precision_asterisk) {
+								_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, Num);
+							}
+							else { // width_asterisk && precision_asterisk
+								_snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, Num);
+							}
+						}
+						else {
+							SetResult(3);
+							Err = TmpErr;
+							goto exit1;
+						}
+					}
+
+					strncat_s(buf, sizeof(buf), buf2, _TRUNCATE);
+					memset(subFmt, 0, sizeof(subFmt));
+					onig_region_free(region, 0);
+					break;
+
+				default:
+					strncat_s(subFmt, sizeof(subFmt), p, 1);
+			}
+		}
+		else if (*p == '%') {
+			strncat_s(subFmt, sizeof(subFmt), p, 1);
+		}
+		else if (strlen(buf) < sizeof(buf)-1) {
+			strncat_s(buf, sizeof(buf), p, 1);
+		}
+		else {
+			break;
+		}
+		p++;
+	}
+	if (strlen(subFmt) > 0) {
+		strncat_s(buf, sizeof(buf), subFmt, _TRUNCATE);
+	}
+
+	if (getvar) {
+		SetStrVal(VarId, buf);
+	}
+	else {
+		// マッチした行を inputstr へ格納する
+		SetInputStr(buf);  // ここでバッファがクリアされる
+	}
+	SetResult(0);
+
+exit1:
+	onig_region_free(region, 1);
+exit2:
+	onig_free(reg);
+	onig_end();
+
+	return Err;
+}
+
+WORD TTLStatusBox()
+{
+	WORD Err;
+
+	MessageCommand(IdStatusBox, &Err);
+	return Err;
+}
+
+WORD TTLStr2Code()
+{
+	TVarId VarId;
+	WORD Err;
+	TStrVal Str;
+	int Len, c, i;
+	unsigned int Num;
+
+	Err = 0;
+	GetIntVar(&VarId,&Err);
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+
+	if (Err!=0) return Err;
+
+	Len = strlen(Str);
+	if (Len > sizeof(Num))
+		c = sizeof(Num);
+	else
+		c = Len;
+	Num = 0;
+	for (i=c; i>=1; i--)
+		Num = Num*256 + (BYTE)Str[Len-i];
+	SetIntVal(VarId,Num);
+
+	return Err;
+}
+
+WORD TTLStr2Int()
+{
+	TVarId VarId;
+	WORD Err;
+	TStrVal Str;
+	int Num;
+
+	Err = 0;
+	GetIntVar(&VarId,&Err);
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+
+	if (Err!=0) return Err;
+
+	// C言語では16進は0xで始まるが、TTL仕様では $ で始まるため、後者もサポートする。
+	if (Str[0] == '$') {
+		memmove_s(Str + 2, sizeof(Str) - 2, Str + 1, strlen(Str));
+		Str[0] = '0';
+		Str[1] = 'x';
+	}
+
+	// '%d'から'%i'へ変更により、10進以外の数値を変換できるようにする。 (2007.5.1 yutaka)
+	// 下位互換性のため10進と16進のみのサポートとする。(2007.5.2 yutaka)
+	// 10 : decimal
+	// 0x10, $10: hex
+	if (Str[0] == '0' && tolower(Str[1]) == 'x') {
+		if (sscanf(Str,"%i",&Num)!=1)
+		{
+			Num = 0;
+			SetResult(0);
+		}
+		else {
+			SetResult(1);
+		}
+	} else {
+		if (sscanf(Str,"%d",&Num)!=1)
+		{
+			Num = 0;
+			SetResult(0);
+		}
+		else {
+			SetResult(1);
+		}
+	}
+	SetIntVal(VarId,Num);
+
+	return Err;
+}
+
+WORD TTLStrCompare()
+{
+	TStrVal Str1, Str2;
+	WORD Err;
+	int i;
+
+	Err = 0;
+	GetStrVal(Str1,&Err);
+	GetStrVal(Str2,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	i = strcmp(Str1,Str2);
+	if (i<0)
+		i = -1;
+	else if (i>0)
+		i = 1;
+	SetResult(i);
+	return Err;
+}
+
+WORD TTLStrConcat()
+{
+	TVarId VarId;
+	WORD Err;
+	TStrVal Str;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	strncat_s(StrVarPtr(VarId),MaxStrLen,Str,_TRUNCATE);
+	return Err;
+}
+
+WORD TTLStrCopy()
+{
+	WORD Err;
+	TVarId VarId;
+	int From, Len, SrcLen;
+	TStrVal Str;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	GetIntVal(&From,&Err);
+	GetIntVal(&Len,&Err);
+	GetStrVar(&VarId,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (From<1) From = 1;
+	SrcLen = strlen(Str)-From+1;
+	if (Len > SrcLen) Len = SrcLen;
+	if (Len < 0) Len = 0;
+	memcpy(StrVarPtr(VarId),&(Str[From-1]),Len);
+	StrVarPtr(VarId)[Len] = 0;
+	return Err;
+}
+
+WORD TTLStrLen()
+{
+	WORD Err;
+	TStrVal Str;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+	SetResult(strlen(Str));
+	return Err;
+}
+
+/*
+  書式: strmatch <文字列> <正規表現>
+  <文字列>に<正規表現>がマッチするか調べるコマンド(awkのmatch関数相当)。
+  resultには、マッチした位置をセット(マッチしない場合は0)。
+  マッチした場合は、waitregexと同様にmatchstr,groupmatchstr1-9をセット。
+ */
+WORD TTLStrMatch()
+{
+	WORD Err;
+	TStrVal Str1, Str2;
+	int ret, result;
+
+	Err = 0;
+	GetStrVal(Str1,&Err);   // target string
+	GetStrVal(Str2,&Err);   // regex pattern
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	ret = FindRegexStringOne(Str2, strlen(Str2), Str1, strlen(Str1));
+	if (ret > 0) { // matched
+		result = ret; 
+	} else {
+		result = 0;
+	}
+
+	// FindRegexStringOneの中でUnlockVar()されてしまうので、LockVar()しなおす。
+	LockVar();
+
+	SetResult(result);
+
+	return Err;
+}
+
+WORD TTLStrScan()
+{
+	WORD Err;
+	TStrVal Str1, Str2;
+	unsigned char *p;
+
+	Err = 0;
+	GetStrVal(Str1,&Err);
+	GetStrVal(Str2,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if ((Str1[0] == 0) || (Str2[0] == 0)) {
+		SetResult(0);
+		return Err;
+	}
+
+	if ((p = _mbsstr((unsigned char *)Str1, (unsigned char *)Str2)) != NULL) {
+		SetResult(p - (unsigned char *)Str1 + 1);
+	}
+	else {
+		SetResult(0);
+	}
+	return Err;
+}
+
+static void insert_string(char *str, int index, char *addstr)
+{
+	char *np;
+	int srclen;
+	int addlen;
+
+	srclen = strlen(str);
+	addlen = strlen(addstr);
+
+	// まずは挿入される箇所以降のデータを、後ろに移動する。
+	np = str + (index - 1);
+	memmove_s(np + addlen, MaxStrLen, np, srclen - (index - 1));
+
+	// 文字列を挿入する
+	memcpy(np, addstr, addlen);
+
+	// null-terminate
+	str[srclen + addlen] = '\0';
+}
+
+WORD TTLStrInsert()
+{
+	WORD Err;
+	TVarId VarId;
+	int Index;
+	TStrVal Str;
+	int srclen, addlen;
+	char *srcptr;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetIntVal(&Index,&Err);
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	srcptr = StrVarPtr(VarId);
+	srclen = strlen(srcptr);
+	if (Index <= 0 || Index > srclen+1) {
+		Err = ErrSyntax;
+	}
+	addlen = strlen(Str);
+	if (srclen + addlen + 1 > MaxStrLen) {
+		Err = ErrSyntax;
+	}
+	if (Err!=0) return Err;
+
+	insert_string(srcptr, Index, Str);
+
+	return Err;
+}
+
+// 文字列 str の index 文字目(1オリジン)から len 文字削除する
+static void remove_string(char *str, int index, int len)
+{
+	char *np;
+	int srclen, copylen;
+
+	srclen = strlen(str);
+
+	if (len <=0 || index <= 0 || (index-1 + len) > srclen) {
+		return;
+	}
+
+	/*
+	   remove_string(str, 6, 4);
+
+	   <------------>srclen
+			 <-->len
+	   XXXXXX****YYY
+	        ^index(np)
+			     ^np+len 
+				 <-->srclen - len - index
+		    ↓
+	   XXXXXXYYY
+	 */
+
+	np = str + (index - 1);
+	copylen = srclen - len - (index - 1);
+	if (copylen > 0)
+		memmove_s(np, MaxStrLen, np + len, copylen);
+
+	// null-terminate
+	str[srclen - len] = '\0';
+}
+
+WORD TTLStrRemove()
+{
+	WORD Err;
+	TVarId VarId;
+	int Index, Len;
+	int srclen;
+	char *srcptr;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetIntVal(&Index,&Err);
+	GetIntVal(&Len,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	srcptr = StrVarPtr(VarId);
+	srclen = strlen(srcptr);
+	if (Len <=0 || Index <= 0 || (Index-1 + Len) > srclen) {
+		Err = ErrSyntax;
+	}
+	if (Err!=0) return Err;
+
+	remove_string(srcptr, Index, Len);
+
+	return Err;
+}
+
+WORD TTLStrReplace()
+{
+	WORD Err, VarType;
+	TVarId VarId;
+	TStrVal oldstr;
+	TStrVal newstr;
+	TStrVal tmpstr;
+	char *srcptr, *matchptr;
+	char *p;
+	int srclen, oldlen, matchlen;
+	int pos, ret;
+	int result = 0;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetIntVal(&pos,&Err);
+	GetStrVal(oldstr,&Err);
+	GetStrVal(newstr,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	srcptr = StrVarPtr(VarId);
+	srclen = strlen(srcptr);
+
+	if (pos > srclen || pos <= 0) {
+		result = 0;
+		goto error;
+	}
+	pos--;
+
+	strncpy_s(tmpstr, MaxStrLen, srcptr, _TRUNCATE);
+
+	oldlen = strlen(oldstr);
+
+	// strptr文字列の pos 文字目以降において、oldstr を探す。
+	p = tmpstr + pos;
+	ret = FindRegexStringOne(oldstr, oldlen, p, strlen(p));
+	// FindRegexStringOneの中でUnlockVar()されてしまうので、LockVar()しなおす。
+	LockVar();
+	if (ret == 0) {
+		// 見つからなかった場合は、"0"で戻る。
+		result = 0;
+		goto error;
+	}
+	else if (ret < 0) {
+		// 正しくない正規表現等でエラーの場合は -1 を返す
+		result = -1;
+		goto error;
+	}
+	ret--;
+
+	if (CheckVar("matchstr",&VarType,&VarId) &&
+		(VarType==TypString)) {
+		matchptr = StrVarPtr(VarId);
+		matchlen = strlen(matchptr);
+	} else {
+		result = 0;
+		goto error;
+	}
+
+	strncpy_s(srcptr, MaxStrLen, tmpstr, pos + ret);
+	strncat_s(srcptr, MaxStrLen, newstr, _TRUNCATE);
+	strncat_s(srcptr, MaxStrLen, tmpstr + pos + ret + matchlen, _TRUNCATE);
+
+	result = 1;
+
+error:
+	SetResult(result);
+	return Err;
+}
+
+WORD TTLStrSpecial()
+{
+	WORD Err;
+	TVarId VarId;
+	TStrVal srcstr;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	if (Err!=0) return Err;
+
+	if (CheckParameterGiven()) { // strspecial strvar strval
+		GetStrVal(srcstr,&Err);
+		if ((Err==0) && (GetFirstChar()!=0))
+			Err = ErrSyntax;
+		if (Err!=0) {
+			return Err;
+		}
+
+		RestoreNewLine(srcstr);
+		SetStrVal(VarId, srcstr);
+	}
+	else { // strspecial strvar
+		RestoreNewLine(StrVarPtr(VarId));
+	}
+
+	return Err;
+}
+
+WORD TTLStrTrim()
+{
+	TStrVal trimchars;
+	WORD Err;
+	TVarId VarId;
+	int srclen;
+	int i, start, end;
+	char *srcptr, *p;
+	char table[256];
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetStrVal(trimchars,&Err);
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	srcptr = StrVarPtr(VarId);
+	srclen = strlen(srcptr);
+
+	// 削除する文字のテーブルを作る。
+	memset(table, 0, sizeof(table));
+	for (p = trimchars; *p ; p++) {
+		table[*p] = 1;
+	}
+
+	// 文字列の先頭から検索する
+	for (i = 0 ; i < srclen ; i++) {
+		if (table[srcptr[i]] == 0) 
+			break;
+	}
+	// 削除されない有効な文字列の始まり。
+	// すべて削除対象となる場合は、start == srclen 。
+	start = i;  
+
+	// 文字列の末尾から検索する
+	for (i = srclen - 1 ; i >= 0 ; i--) {
+		if (table[srcptr[i]] == 0) 
+			break;
+	}
+	// 削除されない有効な文字列の終わり。
+	// すべて削除対象となる場合は、end == -1 。
+	end = i;
+
+	// 末尾を削る
+	srcptr[end + 1] = '\0';
+
+	// 次に、先頭から削る。
+	remove_string(srcptr, 1, start);
+
+	return Err;
+}
+
+WORD TTLStrSplit()
+{
+#define MAXVARNUM 9
+	TStrVal src, delimchars, buf;
+	WORD Err;
+	int maxvar;
+	int srclen, len;
+	int i, count;
+	BOOL ary = FALSE, omit = FALSE;
+	char *p;
+	char /* *last, */ *tok[MAXVARNUM];
+
+	Err = 0;
+	GetStrVal(src,&Err);
+	GetStrVal(delimchars,&Err);
+	// 3rd arg (optional)
+	if (CheckParameterGiven()) {
+		GetIntVal(&maxvar,&Err);
+		if (Err!=0) {
+			// TODO array
+#if 0
+			Err = 0;
+			// Parameter から array を受け取る
+			if (Err==0) {
+				ary = TRUE;
+			}
+#endif
+		}
+	}
+	else {
+		maxvar = 9;
+		omit = TRUE;
+	}
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (!ary && (maxvar < 1 || maxvar > MAXVARNUM) )
+		return ErrSyntax;
+
+	// デリミタは1文字のみとする。
+	len = strlen(delimchars);
+	if (len != 1)
+		return ErrSyntax;
+
+	srclen = strlen(src);
+	strcpy_s(buf, MaxStrLen, src);  /* 破壊されてもいいように、コピーバッファを使う。*/
+
+#if 0
+	// トークンの切り出しを行う。
+	memset(tok, 0, sizeof(tok));
+#if 0
+	tok[0] = strtok_s(srcptr, delimchars, &last);
+	for (i = 1 ; i < MAXVARNUM ; i++) {
+		tok[i] = strtok_s(NULL, delimchars, &last);
+		if (tok[i] == NULL)
+			break;
+	} 
+#else
+	/* strtokを使うと、連続した区切りが1つに丸められるため、自前でポインタを
+	 * たどる。ただし、区切り文字は1つのみとする。
+	 */
+	i = 0;
+	for (p = buf; *p == delimchars[0] ; p++) {
+		tok[i++] = NULL;
+		if (i >= maxvar)
+			goto end;
+	}
+	
+	for (p = strtok_s(p, delimchars, &last); p != NULL ; p = strtok_s(NULL, delimchars, &last) ) {
+		tok[i++] = p;
+		if (i >= maxvar)
+			goto end;
+		for (p += strlen(p) + 1 ; *p == delimchars[0] ; p++) {
+			tok[i++] = NULL;
+			if (i >= maxvar)
+				goto end;
+		}
+	}
+#endif
+#else
+	if (ary) {
+		// TODO array
+	}
+	else {
+		p = buf;
+		count = 1;
+		tok[count-1] = p;
+		for (i=0; i < srclen && count < maxvar + omit; i++) { // count 省略時には、超過分を捨てるため 1 つ余分に進める
+			if (*p == *delimchars) {
+				*p = '\0';
+				count++;
+				if (count <= MAXVARNUM) { // tok の要素数を超えて代入しないようにする(count 省略時のため)
+					tok[count-1] = p+1;
+				}
+			}
+			p++;
+		}
+	}
+#endif
+
+//end:
+	// 結果の格納
+	for (i = 1 ; i <= count ; i++) {
+		SetGroupMatchStr(i, tok[i-1]);
+	}
+	for (i = count+1 ; i <= MAXVARNUM ; i++) {
+		SetGroupMatchStr(i, "");
+	}
+	SetResult(count);
+	return Err;
+#undef MAXVARNUM
+}
+
+WORD TTLStrJoin()
+{
+#define MAXVARNUM 9
+	TStrVal delimchars, buf;
+	WORD Err;
+	TVarId VarId;
+	WORD VarType;
+	int maxvar;
+	int srclen;
+	int i;
+	BOOL ary = FALSE;
+	char *srcptr, *p;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetStrVal(delimchars,&Err);
+	// 3rd arg (optional)
+	if (CheckParameterGiven()) {
+		GetIntVal(&maxvar,&Err);
+		if (Err!=0) {
+			// TODO array
+#if 0
+			Err = 0;
+			// Parameter から array を受け取る
+			if (Err==0) {
+				ary = TRUE;
+			}
+#endif
+		}
+	}
+	else {
+		maxvar = 9;
+	}
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if (!ary && (maxvar < 1 || maxvar > MAXVARNUM) )
+		return ErrSyntax;
+
+	srcptr = StrVarPtr(VarId);
+	srclen = strlen(srcptr);
+
+	srcptr[0] = '\0';
+	if (ary) {
+		// TODO array
+	}
+	else {
+		for (i = 0 ; i < maxvar ; i++) {
+			_snprintf_s(buf, sizeof(buf), _TRUNCATE, "groupmatchstr%d", i + 1);
+			if (CheckVar(buf,&VarType,&VarId)) {
+				if (VarType!=TypString)
+					return ErrSyntax;
+				p = StrVarPtr(VarId);
+				strncat_s(srcptr, MaxStrLen, p, _TRUNCATE);
+				if (i < maxvar-1) {
+					strncat_s(srcptr, MaxStrLen, delimchars, _TRUNCATE);
+				}
+			}
+		}
+	}
+
+	return Err;
+#undef MAXVARNUM
+}
+
+WORD TTLTestLink()
+{
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+
+	if (! Linked)
+		SetResult(0);
+	else if (ComReady==0)
+		SetResult(1);
+	else
+		SetResult(2);
+
+	return 0;
+}
+
+// added (2007.7.12 maya)
+WORD TTLToLower()
+{
+	WORD Err;
+	TVarId VarId;
+	TStrVal Str;
+	int i=0;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	while (Str[i] != 0) {
+		if(_ismbblead(Str[i])) {
+			i = i + 2;
+			continue;
+		}
+		if (Str[i] >= 'A' && Str[i] <= 'Z') {
+			Str[i] = Str[i] + 0x20;
+		}
+		i++;
+	}
+
+	strncpy_s(StrVarPtr(VarId), MaxStrLen, Str, _TRUNCATE);
+	return Err;
+}
+
+// added (2007.7.12 maya)
+WORD TTLToUpper()
+{
+	WORD Err;
+	TVarId VarId;
+	TStrVal Str;
+	int i=0;
+
+	Err = 0;
+	GetStrVar(&VarId,&Err);
+	GetStrVal(Str,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	while (Str[i] != 0) {
+		if(_ismbblead(Str[i])) {
+			i = i + 2;
+			continue;
+		}
+		if (Str[i] >= 'a' && Str[i] <= 'z') {
+			Str[i] = Str[i] - 0x20;
+		}
+		i++;
+	}
+
+	strncpy_s(StrVarPtr(VarId), MaxStrLen, Str, _TRUNCATE);
+	return Err;
+}
+
+WORD TTLUnlink()
+{
+	if (GetFirstChar()!=0)
+		return ErrSyntax;
+
+	if (Linked)
+	{
+		EndDDE();
+	}
+	return 0;
+}
+
+
+WORD TTLUptime()
+{
+	WORD Err;
+	TVarId VarId;
+	DWORD tick;
+
+	Err = 0;
+	GetIntVar(&VarId,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	// Windows OSが起動してからの経過時間(ミリ秒)を取得する。ただし、49日を経過すると、0に戻る。
+	// GetTickCount64() API(Vista以降)を使うと、オーバーフローしなくなるが、そもそもTera Termでは
+	// 64bit変数をサポートしていないので、意味がない。
+	tick = GetTickCount();
+
+	SetIntVal(VarId, tick);
+
+	return Err;
+}
+
+
+
+WORD TTLWait(BOOL Ln)
+{
+	TStrVal Str;
+	WORD Err, ValType;
+	TVarId VarId;
+	int i, Val;
+	int TimeOut;
+
+	ClearWait();
+
+	for (i=0; i<10; i++) {
+		Err = 0;
+		if (GetString(Str, &Err)) {
+			SetWait(i+1, Str);
+		}
+		else if (GetExpression(&ValType, &Val, &Err) && Err == 0) {
+			if (ValType == TypString)
+				SetWait(i+1, StrVarPtr((TVarId)Val));
+			else
+				Err = ErrTypeMismatch;
+		}
+		else
+			break;
+
+		if (Err)
+			break;
+	}
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+
+	if (! Linked)
+		Err = ErrLinkFirst;
+
+	if ((Err==0) && (i>0))
+	{
+		if (Ln)
+			TTLStatus = IdTTLWaitLn;
+		else
+			TTLStatus = IdTTLWait;
+		TimeOut = 0;
+		if (CheckVar("timeout",&ValType,&VarId) && (ValType==TypInteger)) {
+			TimeOut = CopyIntVal(VarId) * 1000;
+		}
+		if (CheckVar("mtimeout",&ValType,&VarId) && (ValType==TypInteger)) {
+			TimeOut += CopyIntVal(VarId);
+		}
+
+		if (TimeOut>0)
+		{
+			TimeLimit = (DWORD)TimeOut;
+			TimeStart = GetTickCount();
+			SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
+		}
+	}
+	else
+		ClearWait();
+
+	return Err;
+}
+
+
+WORD TTLWait4all(BOOL Ln)
+{
+	WORD Err = 0;
+
+	Err = TTLWait(Ln);
+	TTLStatus = IdTTLWait4all;
+
+	Wait4allGotIndex = FALSE;
+	Wait4allFoundNum = 0;
+
+	return Err;
+}
+
+
+// 'waitregex'(wait regular expression): wait command with regular expression
+//
+// This command has almost same function of 'wait' command. Additionally 'waitregex' can search 
+// the keyword with regular expression. Tera Term uses a regex library that is called 'Oniguruma'.
+// cf. http://www.geocities.jp/kosako3/oniguruma/
+//
+// (2005.10.5 yutaka)
+WORD TTLWaitRegex(BOOL Ln)
+{
+	WORD ret;
+
+	ret = TTLWait(Ln);
+
+	RegexActionType = REGEX_WAIT; // regex enabled
+
+	return (ret);
+}
+
+
+
+WORD TTLWaitEvent()
+{
+	WORD Err, ValType;
+	TVarId VarId;
+	int TimeOut;
+
+	Err = 0;
+	GetIntVal(&WakeupCondition,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	WakeupCondition &= 15;
+	TimeOut = 0;
+	if (CheckVar("timeout",&ValType,&VarId) && (ValType==TypInteger)) {
+		TimeOut = CopyIntVal(VarId) * 1000;
+	}
+	if (CheckVar("mtimeout",&ValType,&VarId) && (ValType==TypInteger)) {
+		TimeOut += CopyIntVal(VarId);
+	}
+
+	if (TimeOut>0)
+	{
+		TimeLimit = (DWORD)TimeOut;
+		TimeStart = GetTickCount();
+		SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
+	}
+
+	TTLStatus = IdTTLSleep;
+	return Err;
+}
+
+
+WORD TTLWaitN()
+{
+	WORD Err, ValType;
+	TVarId VarId;
+	int TimeOut, WaitBytes;
+
+	ClearWaitN();
+
+	Err = 0;
+	GetIntVal(&WaitBytes,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	SetWaitN(WaitBytes);
+
+	if (! Linked)
+		Err = ErrLinkFirst;
+	if (Err!=0) return Err;
+
+	TTLStatus = IdTTLWaitN;
+	TimeOut = 0;
+	if (CheckVar("timeout",&ValType,&VarId) && (ValType==TypInteger)) {
+		TimeOut = CopyIntVal(VarId) * 1000;
+	}
+	if (CheckVar("mtimeout",&ValType,&VarId) && (ValType==TypInteger)) {
+		TimeOut += CopyIntVal(VarId);
+	}
+
+	if (TimeOut>0)
+	{
+		TimeLimit = (DWORD)TimeOut;
+		TimeStart = GetTickCount();
+		SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
+	}
+
+	return Err;
+}
+
+
+WORD TTLWaitRecv()
+{
+	TStrVal Str;
+	WORD Err;
+	int Pos, Len, TimeOut;
+	WORD VarType;
+	TVarId VarId;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	GetIntVal(&Len,&Err);
+	GetIntVal(&Pos,&Err);
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if ((Err==0) && (! Linked))
+		Err = ErrLinkFirst;
+	if (Err!=0) return Err;
+	SetInputStr("");
+	SetWait2(Str,Len,Pos);
+
+	TTLStatus = IdTTLWait2;
+	TimeOut = 0;
+	if (CheckVar("timeout",&VarType,&VarId) && (VarType==TypInteger)) {
+		TimeOut = CopyIntVal(VarId) * 1000;
+	}
+	if (CheckVar("mtimeout",&VarType,&VarId) && (VarType==TypInteger)) {
+		TimeOut += CopyIntVal(VarId);
+	}
+
+	if (TimeOut>0)
+	{
+		TimeLimit = (DWORD)TimeOut;
+		TimeStart = GetTickCount();
+		SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
+	}
+	return Err;
+}
+
+WORD TTLWhile(BOOL mode)
+{
+	WORD Err;
+	int Val = mode;
+
+	Err = 0;
+	if (CheckParameterGiven()) {
+		GetIntVal(&Val,&Err);
+	}
+
+	if ((Err==0) && (GetFirstChar()!=0))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	if ((Val!=0) == mode)
+		return SetWhileLoop();
+	else
+		EndWhileLoop();
+	return Err;
+}
+
+WORD TTLXmodemRecv()
+{
+	TStrVal Str;
+	WORD Err;
+	int BinFlag, XOption;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	GetIntVal(&BinFlag,&Err);
+	GetIntVal(&XOption,&Err);
+	if ((Err==0) &&
+	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+
+	if (Err!=0) return Err;
+
+	switch (XOption) {
+	case XoptCRC:
+		// NOP
+		break;
+	case Xopt1kCRC:
+		// for compatibility
+		XOption = XoptCRC;
+		break;
+	default:
+		XOption = XoptCheck;
+	}
+
+	SetFile(Str);
+	SetBinary(BinFlag);
+	SetXOption(XOption);
+	return SendCmnd(CmdXmodemRecv,IdTTLWaitCmndResult);
+}
+
+WORD TTLXmodemSend()
+{
+	TStrVal Str;
+	WORD Err;
+	int XOption;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	GetIntVal(&XOption,&Err);
+	if ((Err==0) &&
+	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	switch (XOption) {
+	case Xopt1kCRC:
+		// NOP
+		break;
+	default:
+		XOption = XoptCRC;
+	}
+
+	SetFile(Str);
+	SetXOption(XOption);
+	return SendCmnd(CmdXmodemSend,IdTTLWaitCmndResult);
+}
+
+WORD TTLYesNoBox()
+{
+	WORD Err;
+	int YesNo;
+
+	YesNo = MessageCommand(IdYesNoBox, &Err);
+	if (Err!=0) return Err;
+	if (YesNo==IDOK)
+		YesNo = 1;	// Yes
+	else
+		YesNo = 0;	// No
+	SetResult(YesNo);
+	return Err;
+}
+
+WORD TTLZmodemSend()
+{
+	TStrVal Str;
+	WORD Err;
+	int BinFlag;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+	GetIntVal(&BinFlag,&Err);
+	if ((Err==0) &&
+	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	SetFile(Str);
+	SetBinary(BinFlag);
+	return SendCmnd(CmdZmodemSend,IdTTLWaitCmndResult);
+}
+
+WORD TTLYmodemSend()
+{
+	TStrVal Str;
+	WORD Err;
+//	int BinFlag;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+//	GetIntVal(&BinFlag,&Err);
+	if ((Err==0) &&
+	    ((strlen(Str)==0) || (GetFirstChar()!=0)))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	SetFile(Str);
+//	SetBinary(BinFlag);
+	return SendCmnd(CmdYmodemSend,IdTTLWaitCmndResult);
+}
+
+// SYNOPSIS: 
+//   scpsend "c:\usr\sample.chm" "doc/sample.chm"
+//   scpsend "c:\usr\sample.chm"
+WORD TTLScpSend()
+{
+	TStrVal Str;
+	TStrVal Str2;
+	WORD Err;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+
+	if ((Err==0) &&
+	    ((strlen(Str)==0)))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	GetStrVal(Str2,&Err);
+	if (Err) {
+		Str2[0] = '\0';
+		Err = 0;
+	}
+
+	if (GetFirstChar() != 0)
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	SetFile(Str);
+	SetSecondFile(Str2);
+	return SendCmnd(CmdScpSend, 0);
+}
+
+// SYNOPSIS: 
+//   scprecv "foo.txt"
+//   scprecv "src/foo.txt" "c:\foo.txt"
+WORD TTLScpRecv()
+{
+	TStrVal Str;
+	TStrVal Str2;
+	WORD Err;
+
+	Err = 0;
+	GetStrVal(Str,&Err);
+
+	if ((Err==0) &&
+	    ((strlen(Str)==0)))
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	GetStrVal(Str2,&Err);
+	if (Err) {
+		Str2[0] = '\0';
+		Err = 0;
+	}
+
+	if (GetFirstChar() != 0)
+		Err = ErrSyntax;
+	if (Err!=0) return Err;
+
+	SetFile(Str);
+	SetSecondFile(Str2);
+	return SendCmnd(CmdScpRcv, 0);
+}
+
+int ExecCmnd()
+{
+	WORD WId, Err;
+	BOOL StrConst, E, WithIndex, Result;
+	TStrVal Str;
+	TName Cmnd;
+	WORD ValType, VarType;
+	TVarId VarId;
+	int Val, Index;
+
+	Err = 0;
+
+	Result = GetReservedWord(&WId);
+
+	if (EndWhileFlag>0) {
+		if (Result) {
+			switch (WId) {
+			case RsvWhile:
+			case RsvUntil:
+			case RsvDo:
+				EndWhileFlag++; break;
+
+			case RsvEndWhile:
+			case RsvEndUntil:
+			case RsvLoop:
+				EndWhileFlag--; break;
+			}
+		}
+		return 0;
+	}
+
+	if (BreakFlag>0) {
+		if (Result) {
+			switch (WId) {
+			case RsvIf:
+				if (CheckThen(&Err))
+					IfNest++;
+				break;
+
+			case RsvEndIf:
+				if (IfNest<1)
+					Err = ErrInvalidCtl;
+				else
+					IfNest--;
+				break;
+
+			case RsvFor:
+			case RsvWhile:
+			case RsvUntil:
+			case RsvDo:
+				BreakFlag++; break;
+
+			case RsvNext:
+			case RsvEndWhile:
+			case RsvEndUntil:
+			case RsvLoop:
+				BreakFlag--; break;
+			}
+		}
+		if (BreakFlag>0 || !ContinueFlag)
+			return Err;
+		ContinueFlag = FALSE;
+	}
+
+	if (EndIfFlag>0) {
+		if (! Result)
+			;
+		else if ((WId==RsvIf) && CheckThen(&Err))
+			EndIfFlag++;
+		else if (WId==RsvEndIf)
+			EndIfFlag--;
+		return Err;
+	}
+
+	if (ElseFlag>0) {
+		if (! Result)
+			;
+		else if ((WId==RsvIf) && CheckThen(&Err))
+			EndIfFlag++;
+		else if (WId==RsvElse)
+			ElseFlag--;
+		else if (WId==RsvElseIf)
+		{
+			if (CheckElseIf(&Err)!=0)
+				ElseFlag--;
+		}
+		else if (WId==RsvEndIf)
+		{
+			ElseFlag--;
+			if (ElseFlag==0)
+				IfNest--;
+		}
+		return Err;
+	}
+
+	if (Result) 
+		switch (WId) {
+		case RsvBasename:
+			Err = TTLBasename(); break;
+		case RsvBeep:
+			Err = TTLBeep(); break;
+		case RsvBPlusRecv:
+			Err = TTLCommCmd(CmdBPlusRecv,IdTTLWaitCmndResult); break;
+		case RsvBPlusSend:
+			Err = TTLCommCmdFile(CmdBPlusSend,IdTTLWaitCmndResult); break;
+		case RsvBreak:
+		case RsvContinue:
+			Err = TTLBreak(WId); break;
+		case RsvBringupBox:
+			Err = TTLBringupBox(); break;
+		case RsvCall:
+			Err = TTLCall(); break;
+		case RsvCallMenu:
+			Err = TTLCommCmdInt(CmdCallMenu,0); break;
+		case RsvChangeDir:
+			Err = TTLCommCmdFile(CmdChangeDir,0); break;
+		case RsvChecksum8:
+			Err = TTLDoChecksum(CHECKSUM8); break;
+		case RsvChecksum8File:
+			Err = TTLDoChecksumFile(CHECKSUM8); break;
+		case RsvChecksum16:
+			Err = TTLDoChecksum(CHECKSUM16); break;
+		case RsvChecksum16File:
+			Err = TTLDoChecksumFile(CHECKSUM16); break;
+		case RsvChecksum32:
+			Err = TTLDoChecksum(CHECKSUM32); break;
+		case RsvChecksum32File:
+			Err = TTLDoChecksumFile(CHECKSUM32); break;
+		case RsvClearScreen:
+			Err = TTLCommCmdInt(CmdClearScreen,0); break;
+		case RsvClipb2Var:
+			Err = TTLClipb2Var(); break;    // add 'clipb2var' (2006.9.17 maya)
+		case RsvCloseSBox:
+			Err = TTLCloseSBox(); break;
+		case RsvCloseTT:
+			Err = TTLCloseTT(); break;
+		case RsvCode2Str:
+			Err = TTLCode2Str(); break;
+		case RsvConnect:
+		case RsvCygConnect:
+			Err = TTLConnect(WId); break;
+		case RsvCrc16:
+			Err = TTLDoChecksum(CRC16); break;
+		case RsvCrc16File:
+			Err = TTLDoChecksumFile(CRC16); break;
+		case RsvCrc32:
+			Err = TTLDoChecksum(CRC32); break;
+		case RsvCrc32File:
+			Err = TTLDoChecksumFile(CRC32); break;
+		case RsvDelPassword:
+			Err = TTLDelPassword(); break;
+		case RsvDirname:
+			Err = TTLDirname(); break;
+		case RsvDirnameBox:
+			Err = TTLDirnameBox(); break;
+		case RsvDisconnect:
+			Err = TTLDisconnect(); break;
+		case RsvDispStr:
+			Err = TTLDispStr(); break;
+		case RsvDo:
+			Err = TTLDo(); break;
+		case RsvElse:
+			Err = TTLElse(); break;
+		case RsvElseIf:
+			Err = TTLElseIf(); break;
+		case RsvEnableKeyb:
+			Err = TTLCommCmdBin(CmdEnableKeyb,0); break;
+		case RsvEnd:
+			Err = TTLEnd(); break;
+		case RsvEndIf:
+			Err = TTLEndIf(); break;
+		case RsvEndUntil:
+			Err = TTLEndWhile(FALSE); break;
+		case RsvEndWhile:
+			Err = TTLEndWhile(TRUE); break;
+		case RsvExec:
+			Err = TTLExec(); break;
+		case RsvExecCmnd:
+			Err = TTLExecCmnd(); break;
+		case RsvExit:
+			Err = TTLExit(); break;
+		case RsvExpandEnv:
+			Err = TTLExpandEnv(); break;
+		case RsvFileClose:
+			Err = TTLFileClose(); break;
+		case RsvFileConcat:
+			Err = TTLFileConcat(); break;
+		case RsvFileCopy:
+			Err = TTLFileCopy(); break;
+		case RsvFileCreate:
+			Err = TTLFileCreate(); break;
+		case RsvFileDelete:
+			Err = TTLFileDelete(); break;
+		case RsvFileMarkPtr:
+			Err = TTLFileMarkPtr(); break;
+		case RsvFilenameBox:
+			Err = TTLFilenameBox(); break;  // add 'filenamebox' (2007.9.13 maya)
+		case RsvFileOpen:
+			Err = TTLFileOpen(); break;
+		case RsvFileLock:
+			Err = TTLFileLock(); break;
+		case RsvFileUnLock:
+			Err = TTLFileUnLock(); break;
+		case RsvFileReadln:
+			Err = TTLFileReadln(); break;
+		case RsvFileRead:
+			Err = TTLFileRead(); break;    // add 'fileread'
+		case RsvFileRename:
+			Err = TTLFileRename(); break;
+		case RsvFileSearch:
+			Err = TTLFileSearch(); break;
+		case RsvFileSeek:
+			Err = TTLFileSeek(); break;
+		case RsvFileSeekBack:
+			Err = TTLFileSeekBack(); break;
+		case RsvFileStat:
+			Err = TTLFileStat(); break;
+		case RsvFileStrSeek:
+			Err = TTLFileStrSeek(); break;
+		case RsvFileStrSeek2:
+			Err = TTLFileStrSeek2(); break;
+		case RsvFileTruncate:
+			Err = TTLFileTruncate(); break;
+		case RsvFileWrite:
+			Err = TTLFileWrite(FALSE); break;
+		case RsvFileWriteLn:
+			Err = TTLFileWrite(TRUE); break;
+		case RsvFindClose:
+			Err = TTLFindClose(); break;
+		case RsvFindFirst:
+			Err = TTLFindFirst(); break;
+		case RsvFindNext:
+			Err = TTLFindNext(); break;
+		case RsvFlushRecv:
+			Err = TTLFlushRecv(); break;
+		case RsvFolderCreate:
+			Err = TTLFolderCreate(); break;
+		case RsvFolderDelete:
+			Err = TTLFolderDelete(); break;
+		case RsvFolderSearch:
+			Err = TTLFolderSearch(); break;
+		case RsvFor:
+			Err = TTLFor(); break;
+		case RsvGetDate:
+		case RsvGetTime:
+			Err = TTLGetTime(WId); break;
+		case RsvGetDir:
+			Err = TTLGetDir(); break;
+		case RsvGetEnv:
+			Err = TTLGetEnv(); break;
+		case RsvGetFileAttr:
+			Err = TTLGetFileAttr(); break;
+		case RsvGetHostname:
+			Err = TTLGetHostname(); break;
+		case RsvGetIPv4Addr:
+			Err = TTLGetIPv4Addr(); break;
+		case RsvGetIPv6Addr:
+			Err = TTLGetIPv6Addr(); break;
+		case RsvGetModemStatus:
+			Err = TTLGetModemStatus(); break;
+		case RsvGetPassword:
+			Err = TTLGetPassword(); break;
+		case RsvSetPassword:
+			Err = TTLSetPassword(); break;
+		case RsvIsPassword:
+			Err = TTLIsPassword(); break;
+		case RsvGetSpecialFolder:
+			Err = TTLGetSpecialFolder(); break;
+		case RsvGetTitle:
+			Err = TTLGetTitle(); break;
+		case RsvGetTTDir:
+			Err = TTLGetTTDir(); break;
+		case RsvGetVer:
+			Err = TTLGetVer(); break;
+		case RsvGoto:
+			Err = TTLGoto(); break;
+		case RsvIfDefined:
+			Err = TTLIfDefined(); break;
+		case RsvIf:
+			Err = TTLIf(); break;
+		case RsvInclude:
+			Err = TTLInclude(); break;
+		case RsvInputBox:
+			Err = TTLInputBox(FALSE); break;
+		case RsvInt2Str:
+			Err = TTLInt2Str(); break;
+		case RsvIntDim:
+		case RsvStrDim:
+			Err = TTLDim(WId); break;
+		case RsvKmtFinish:
+			Err = TTLCommCmd(CmdKmtFinish,IdTTLWaitCmndResult); break;
+		case RsvKmtGet:
+			Err = TTLCommCmdFile(CmdKmtGet,IdTTLWaitCmndResult); break;
+		case RsvKmtRecv:
+			Err = TTLCommCmd(CmdKmtRecv,IdTTLWaitCmndResult); break;
+		case RsvKmtSend:
+			Err = TTLCommCmdFile(CmdKmtSend,IdTTLWaitCmndResult); break;
+		case RsvListBox:
+			Err = TTLListBox(); break;
+		case RsvLoadKeyMap:
+			Err = TTLCommCmdFile(CmdLoadKeyMap,0); break;
+		case RsvLogAutoClose:
+			Err = TTLCommCmdBin(CmdLogAutoClose, 0); break;
+		case RsvLogClose:
+			Err = TTLCommCmd(CmdLogClose,0); break;
+		case RsvLogInfo:
+			Err = TTLLogInfo(); break;
+		case RsvLogOpen:
+			Err = TTLLogOpen(); break;
+		case RsvLogPause:
+			Err = TTLCommCmd(CmdLogPause,0); break;
+		case RsvLogRotate:
+			Err = TTLLogRotate(); break;
+		case RsvLogStart:
+			Err = TTLCommCmd(CmdLogStart,0); break;
+		case RsvLogWrite:
+			Err = TTLCommCmdFile(CmdLogWrite,0); break;
+		case RsvLoop:
+			Err = TTLLoop(); break;
+		case RsvMakePath:
+			Err = TTLMakePath(); break;
+		case RsvMessageBox:
+			Err = TTLMessageBox(); break;
+		case RsvNext:
+			Err = TTLNext(); break;
+		case RsvPasswordBox:
+			Err = TTLInputBox(TRUE); break;
+		case RsvPause:
+			Err = TTLPause(); break;
+		case RsvMilliPause:
+			Err = TTLMilliPause(); break;    // add 'mpause'
+		case RsvQuickVANRecv:
+			Err = TTLCommCmd(CmdQVRecv,IdTTLWaitCmndResult); break;
+		case RsvQuickVANSend:
+			Err = TTLCommCmdFile(CmdQVSend,IdTTLWaitCmndResult); break;
+		case RsvRandom:
+			Err = TTLRandom(); break;
+		case RsvRecvLn:
+			Err = TTLRecvLn(); break;
+		case RsvRegexOption:
+			Err = TTLRegexOption(); break;
+		case RsvRestoreSetup:
+			Err = TTLCommCmdFile(CmdRestoreSetup,0); break;
+		case RsvReturn:
+			Err = TTLReturn(); break;
+		case RsvRotateL:
+			Err = TTLRotateLeft(); break;   // add 'rotateleft' (2007.8.19 maya)
+		case RsvRotateR:
+			Err = TTLRotateRight(); break;  // add 'rotateright' (2007.8.19 maya)
+		case RsvScpSend:
+			Err = TTLScpSend(); break;      // add 'scpsend' (2008.1.1 yutaka)
+		case RsvScpRecv:
+			Err = TTLScpRecv(); break;      // add 'scprecv' (2008.1.4 yutaka)
+		case RsvSend:
+			Err = TTLSend(); break;
+		case RsvSendBreak:
+			Err = TTLCommCmd(CmdSendBreak,0); break;
+		case RsvSendBroadcast:
+			Err = TTLSendBroadcast(FALSE); break;
+		case RsvSendlnBroadcast:
+			Err = TTLSendBroadcast(TRUE); break;
+		case RsvSendlnMulticast:
+			Err = TTLSendMulticast(TRUE); break;
+		case RsvSendMulticast:
+			Err = TTLSendMulticast(FALSE); break;
+		case RsvSetMulticastName:
+			Err = TTLSetMulticastName(); break;
+		case RsvSendFile:
+			Err = TTLSendFile(); break;
+		case RsvSendKCode:
+			Err = TTLSendKCode(); break;
+		case RsvSendLn:
+			Err = TTLSendLn(); break;
+		case RsvSetBaud:
+			Err = TTLCommCmdInt(CmdSetBaud,0); break;
+		case RsvSetDate:
+			Err = TTLSetDate(); break;
+		case RsvSetDebug:
+			Err = TTLCommCmdDeb(); break;
+		case RsvSetDir:
+			Err = TTLSetDir(); break;
+		case RsvSetDlgPos:
+			Err = TTLSetDlgPos(); break;
+		case RsvSetDtr:
+			Err = TTLCommCmdInt(CmdSetDtr,0); break;
+		case RsvSetEcho:
+			Err = TTLCommCmdBin(CmdSetEcho,0); break;
+		case RsvSetEnv:
+			Err = TTLSetEnv(); break;
+		case RsvSetExitCode:
+			Err = TTLSetExitCode(); break;
+		case RsvSetFileAttr:
+			Err = TTLSetFileAttr(); break;
+		case RsvSetFlowCtrl:
+			Err = TTLCommCmdInt(CmdSetFlowCtrl,0); break;
+		case RsvSetRts:
+			Err = TTLCommCmdInt(CmdSetRts,0); break;
+		case RsvSetSync:
+			Err = TTLSetSync(); break;
+		case RsvSetTime:
+			Err = TTLSetTime(); break;
+		case RsvSetTitle:
+			Err = TTLCommCmdFile(CmdSetTitle,0); break;
+		case RsvShow:
+			Err = TTLShow(); break;
+		case RsvShowTT:
+			Err = TTLCommCmdInt(CmdShowTT,0); break;
+		case RsvSprintf:
+			Err = TTLSprintf(0); break;
+		case RsvSprintf2:
+			Err = TTLSprintf(1); break;
+		case RsvStatusBox:
+			Err = TTLStatusBox(); break;
+		case RsvStr2Code:
+			Err = TTLStr2Code(); break;
+		case RsvStr2Int:
+			Err = TTLStr2Int(); break;
+		case RsvStrCompare:
+			Err = TTLStrCompare(); break;
+		case RsvStrConcat:
+			Err = TTLStrConcat(); break;
+		case RsvStrCopy:
+			Err = TTLStrCopy(); break;
+		case RsvStrInsert:
+			Err = TTLStrInsert(); break;
+		case RsvStrJoin:
+			Err = TTLStrJoin(); break;
+		case RsvStrLen:
+			Err = TTLStrLen(); break;
+		case RsvStrMatch:
+			Err = TTLStrMatch(); break;
+		case RsvStrRemove:
+			Err = TTLStrRemove(); break;
+		case RsvStrReplace:
+			Err = TTLStrReplace(); break;
+		case RsvStrScan:
+			Err = TTLStrScan(); break;
+		case RsvStrSpecial:
+			Err = TTLStrSpecial(); break;
+		case RsvStrSplit:
+			Err = TTLStrSplit(); break;
+		case RsvStrTrim:
+			Err = TTLStrTrim(); break;
+		case RsvTestLink:
+			Err = TTLTestLink(); break;
+		case RsvToLower:
+			Err = TTLToLower(); break;    // add 'tolower' (2007.7.12 maya)
+		case RsvToUpper:
+			Err = TTLToUpper(); break;    // add 'toupper' (2007.7.12 maya)
+		case RsvUnlink:
+			Err = TTLUnlink(); break;
+		case RsvUntil:
+			Err = TTLWhile(FALSE); break;
+		case RsvUptime:
+			Err = TTLUptime(); break;
+		case RsvVar2Clipb:
+			Err = TTLVar2Clipb(); break;    // add 'var2clipb' (2006.9.17 maya)
+		case RsvWaitRegex:
+			Err = TTLWaitRegex(FALSE); break;    // add 'waitregex' (2005.10.5 yutaka)
+		case RsvWait:
+			Err = TTLWait(FALSE); break;
+		case RsvWait4all:
+			Err = TTLWait4all(FALSE); break;
+		case RsvWaitEvent:
+			Err = TTLWaitEvent(); break;
+		case RsvWaitLn:
+			Err = TTLWait(TRUE); break;
+		case RsvWaitN:
+			Err = TTLWaitN(); break;
+		case RsvWaitRecv:
+			Err = TTLWaitRecv(); break;
+		case RsvWhile:
+			Err = TTLWhile(TRUE); break;
+		case RsvXmodemRecv:
+			Err = TTLXmodemRecv(); break;
+		case RsvXmodemSend:
+			Err = TTLXmodemSend(); break;
+		case RsvYesNoBox:
+			Err = TTLYesNoBox(); break;
+		case RsvZmodemRecv:
+			Err = TTLCommCmd(CmdZmodemRecv,IdTTLWaitCmndResult); break;
+		case RsvZmodemSend:
+			Err = TTLZmodemSend(); break;
+		case RsvYmodemRecv:
+			Err = TTLCommCmd(CmdYmodemRecv,IdTTLWaitCmndResult); break;
+		case RsvYmodemSend:
+			Err = TTLYmodemSend(); break;
+		default:
+			Err = ErrSyntax;
+		}
+	else if (GetIdentifier(Cmnd)) {
+		if (GetIndex(&Index, &Err)) {
+			WithIndex = TRUE;
+		}
+		else {
+			WithIndex = FALSE;
+		}
+
+		if (!Err && GetFirstChar() == '=') {
+			StrConst = GetString(Str,&Err);
+			if (StrConst)
+				ValType = TypString;
+			else
+				if (! GetExpression(&ValType,&Val,&Err))
+					Err = ErrSyntax;
+
+			if (!Err) {
+				if (CheckVar(Cmnd,&VarType,&VarId)) {
+					if (WithIndex) {
+						switch (VarType) {
+						case TypIntArray:
+							VarId = GetIntVarFromArray(VarId, Index, &Err);
+							if (!Err) VarType = TypInteger;
+							break;
+						case TypStrArray:
+							VarId = GetStrVarFromArray(VarId, Index, &Err);
+							if (!Err) VarType = TypString;
+							break;
+						default:
+							Err = ErrSyntax;
+						}
+					}
+					if (Err) return Err;
+					if (VarType==ValType) {
+						switch (ValType) {
+						case TypInteger: SetIntVal(VarId,Val); break;
+						case TypString:
+							if (StrConst)
+								SetStrVal(VarId,Str);
+							else
+							// StrVarPtr の返り値が TStrVal のポインタであることを期待してサイズを固定
+							// (2007.6.23 maya)
+								strncpy_s(StrVarPtr(VarId),MaxStrLen,StrVarPtr((TVarId)Val),_TRUNCATE);
+						break;
+						default:
+							Err = ErrSyntax;
+						}
+					}
+					else {
+						Err = ErrTypeMismatch;
+					}
+				}
+				else if (WithIndex) {
+					Err = ErrSyntax;
+				}
+				else {
+					switch (ValType) {
+					case TypInteger: E = NewIntVar(Cmnd,Val); break;
+					case TypString:
+						if (StrConst)
+							E = NewStrVar(Cmnd,Str);
+						else
+							E = NewStrVar(Cmnd,StrVarPtr((TVarId)Val));
+						break;
+					default: 
+						E = FALSE;
+					}
+					if (! E) Err = ErrTooManyVar;
+				}
+				if (!Err && (GetFirstChar()!=0))
+					Err = ErrSyntax;
+			}
+		}
+		else Err = ErrNotSupported;
+	}
+	else
+		Err = ErrSyntax;
+
+	return Err;
+}
+
+void Exec()
+{
+	WORD Err;
+
+	// ParseAgain is set by 'ExecCmnd'
+	if (! ParseAgain &&
+	    ! GetNewLine())
+	{
+		TTLStatus = IdTTLEnd;
+		return;
+	}
+	ParseAgain = FALSE;
+
+	LockVar();
+	Err = ExecCmnd();
+	if (Err>0) DispErr(Err);
+	UnlockVar();
+}
+
+// 正規表現でマッチした文字列を記録する
+// (2005.10.7 yutaka)
+void SetMatchStr(PCHAR Str)
+{
+	WORD VarType;
+	TVarId VarId;
+
+	if (CheckVar("matchstr",&VarType,&VarId) &&
+	    (VarType==TypString))
+		SetStrVal(VarId,Str);
+}
+
+// 正規表現でグループマッチした文字列を記録する
+// (2005.10.15 yutaka)
+void SetGroupMatchStr(int no, PCHAR Str)
+{
+	WORD VarType;
+	TVarId VarId;
+	char buf[128];
+	char *p;
+
+	if (Str == NULL)
+		p = "";
+	else
+		p = Str;
+
+	_snprintf_s(buf, sizeof(buf), _TRUNCATE, "groupmatchstr%d", no);
+
+	if (CheckVar(buf,&VarType,&VarId) &&
+	    (VarType==TypString))
+		SetStrVal(VarId,p);
+}
+
+void SetInputStr(PCHAR Str)
+{
+	WORD VarType;
+	TVarId VarId;
+
+	if (CheckVar("inputstr",&VarType,&VarId) &&
+	    (VarType==TypString))
+		SetStrVal(VarId,Str);
+}
+
+void SetResult(int ResultCode)
+{
+  WORD VarType;
+  TVarId VarId;
+
+	if (CheckVar("result",&VarType,&VarId) &&
+	    (VarType==TypInteger))
+		SetIntVal(VarId,ResultCode);
+}
+
+BOOL CheckTimeout()
+{
+	BOOL ret;
+	DWORD TimeUp = (TimeStart+TimeLimit);
+
+	if (TimeUp > TimeStart) {
+		ret = (GetTickCount() > TimeUp);
+	}
+	else { // for DWORD overflow (49.7 days)
+		DWORD TimeTmp = GetTickCount();
+		ret = (TimeUp < TimeTmp && TimeTmp >= TimeStart);
+	}
+	return ret;
+}
+
+BOOL TestWakeup(int Wakeup)
+{
+	return ((Wakeup & WakeupCondition) != 0);
+}
+
+void SetWakeup(int Wakeup)
+{
+	WakeupCondition = Wakeup;
+}


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