Revision: 7292 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/7292 Author: zmatsuo Date: 2018-12-01 01:28:47 +0900 (Sat, 01 Dec 2018) Log Message: ----------- マクロのファイルハンドルを変数にそのまま入れないようにした Modified Paths: -------------- trunk/teraterm/common/win16api.c trunk/teraterm/ttpmacro/ttl.c -------------- next part -------------- Modified: trunk/teraterm/common/win16api.c =================================================================== --- trunk/teraterm/common/win16api.c 2018-11-30 16:28:38 UTC (rev 7291) +++ trunk/teraterm/common/win16api.c 2018-11-30 16:28:47 UTC (rev 7292) @@ -43,7 +43,7 @@ // read/write (teratermではttpmacro/ttl.c内の1箇所のみで使用されている handle = CreateFileA(FileName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE, NULL, - CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); break; default: assert(FALSE); @@ -89,8 +89,13 @@ } /* + * @param[in] iOrigin + * @arg 0(FILE_BEGIN) + * @arg 1(FILE_CURRENT) + * @arg 2(FILE_END) * @retval ファイル位置 * @retval HFILE_ERROR((HFILE)-1) エラー + * @retval INVALID_SET_FILE_POINTER((DWORD)-1) エラー */ LONG win16_llseek(HANDLE hFile, LONG lOffset, int iOrigin) { Modified: trunk/teraterm/ttpmacro/ttl.c =================================================================== --- trunk/teraterm/ttpmacro/ttl.c 2018-11-30 16:28:38 UTC (rev 7291) +++ trunk/teraterm/ttpmacro/ttl.c 2018-11-30 16:28:47 UTC (rev 7292) @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 1994-1998 T. Teranishi * (C) 2005-2018 TeraTerm Project * All rights reserved. @@ -93,12 +93,53 @@ 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 HANDLE FHandle[NumFHandle]; +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; + 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; @@ -115,7 +156,7 @@ // System variables NewIntVar("result",0); NewIntVar("timeout",0); - NewIntVar("mtimeout",0); // \x83~\x83\x8A\x95b\x92P\x88ʂ̃^\x83C\x83\x80\x83A\x83E\x83g\x97p (2009.1.23 maya) + 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) @@ -131,9 +172,9 @@ if (ParamCnt == 0) { ParamCnt++; } - NewIntVar("paramcnt",ParamCnt); // \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xE0\x8A܂ވ\xF8\x90\x94\x82̌\x94 (2012.4.10 yutaka) + NewIntVar("paramcnt",ParamCnt); // ファイル名も含む引数の個数 (2012.4.10 yutaka) - // \x8B\x8C\x8C`\x8E\xAE\x82̃p\x83\x89\x83\x81\x81[\x83^\x90ݒ\xE8 (param1 \x81` param9) + // 旧形式のパラメータ設定 (param1 〜 param9) NewStrVar("param1", ShortName); if (Params) { for (i=2; i<=9; i++) { @@ -147,7 +188,7 @@ } } - // \x90V\x8C`\x8E\xAE\x82̃p\x83\x89\x83\x81\x81[\x83^\x90ݒ\xE8 (params[1\x81`ParamCnt]) + // 新形式のパラメータ設定 (params[1〜ParamCnt]) if (NewStrAryVar("params", ParamCnt+1) == 0) { Err = 0; GetStrAryVarByName(&ParamsVarId, "params", &Err); @@ -178,8 +219,7 @@ for (i=0; i<NumDirHandle; i++) DirHandle[i] = -1L; - for (i=0; i<NumFHandle; i++) - FHandle[i] = INVALID_HANDLE_VALUE; + HandleInit(); if (! InitBuff(FileName)) { @@ -752,7 +792,7 @@ static unsigned int crc16(int n, unsigned char c[]) { #define CRC16POLY1 0x1021U /* x^{16}+x^{12}+x^5+1 */ -#define CRC16POLY2 0x8408U /* \x8D\xB6\x89E\x8Bt\x93] */ +#define CRC16POLY2 0x8408U /* 左右逆転 */ int i, j; unsigned long r; @@ -772,7 +812,7 @@ #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 /* \x8D\xB6\x89E\x8Bt\x93] */ +#define CRC32POLY2 0xEDB88320UL /* 左右逆転 */ int i, j; unsigned long r; @@ -786,7 +826,7 @@ return r ^ 0xFFFFFFFFUL; } -// \x83`\x83F\x83b\x83N\x83T\x83\x80\x83A\x83\x8B\x83S\x83\x8A\x83Y\x83\x80\x81E\x8B\xA4\x92ʃ\x8B\x81[\x83`\x83\x93 +// チェックサムアルゴリズム・共通ルーチン WORD TTLDoChecksum(enum checksum_type type) { TStrVal Str; @@ -848,12 +888,12 @@ if (Str[0]==0) return Err; fh = CreateFile(Str,GENERIC_READ,0,NULL,OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL,NULL); /* \x83t\x83@\x83C\x83\x8B\x83I\x81[\x83v\x83\x93 */ + FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ if (fh == INVALID_HANDLE_VALUE) { result = -1; goto error; } - /* \x83t\x83@\x83C\x83\x8B\x83}\x83b\x83s\x83\x93\x83O\x83I\x83u\x83W\x83F\x83N\x83g\x8D쐬 */ + /* ファイルマッピングオブジェクト作成 */ hMap = CreateFileMapping(fh,NULL,PAGE_READONLY,0,0,NULL); if (hMap == NULL) { result = -1; @@ -860,7 +900,7 @@ goto error; } - /* \x83t\x83@\x83C\x83\x8B\x82\xF0\x83}\x83b\x83v\x82\xB5\x81A\x90擪\x83A\x83h\x83\x8C\x83X\x82\xF0lpBuf\x82Ɏ擾 */ + /* ファイルをマップし、先頭アドレスをlpBufに取得 */ lpBuf = (LPBYTE)MapViewOfFile(hMap,FILE_MAP_READ,0,0,0); if (lpBuf == NULL) { result = -1; @@ -1259,12 +1299,12 @@ return Err; } - // \x83t\x83@\x83C\x83\x8B\x83p\x83X\x82Ɋ\xAB\x95ϐ\x94\x82\xAA\x8A܂܂\xEA\x82Ă\xA2\x82\xE9\x82Ȃ\xE7\x82A\x93W\x8AJ\x82\xB7\x82\xE9\x81B + // ファイルパスに環境変数が含まれているならば、展開する。 ExpandEnvironmentStrings(srcptr, deststr, MaxStrLen); SetStrVal(VarId, deststr); } else { // expandenv strvar - // \x83t\x83@\x83C\x83\x8B\x83p\x83X\x82Ɋ\xAB\x95ϐ\x94\x82\xAA\x8A܂܂\xEA\x82Ă\xA2\x82\xE9\x82Ȃ\xE7\x82A\x93W\x8AJ\x82\xB7\x82\xE9\x81B + // ファイルパスに環境変数が含まれているならば、展開する。 ExpandEnvironmentStrings(StrVarPtr(VarId), deststr, MaxStrLen); SetStrVal(VarId, deststr); } @@ -1275,18 +1315,17 @@ WORD TTLFileClose() { WORD Err; + int fhi; // handle index HANDLE FH; - int i; Err = 0; - GetIntVal(&FH,&Err); + GetIntVal(&fhi,&Err); + FH = HandleGet(fhi); if ((Err==0) && (GetFirstChar()!=0)) Err = ErrSyntax; if (Err!=0) return Err; _lclose(FH); - i = 0; - while ((i<NumFHandle) && (FH!=FHandle[i])) i++; - if (i<NumFHandle) FHandle[i] = INVALID_HANDLE_VALUE; + HandleFree(fhi); return Err; } @@ -1387,6 +1426,7 @@ WORD Err; TVarId VarId; HANDLE FH; + int fhi; TStrVal FName; Err = 0; @@ -1412,7 +1452,11 @@ else { SetResult(0); } - SetIntVal(VarId, FH); + fhi = HandlePut(FH); + SetIntVal(VarId, fhi); + if (fhi == -1) { + _lclose(FH); + } return Err; } @@ -1449,27 +1493,21 @@ WORD TTLFileMarkPtr() { WORD Err; + int fhi; HANDLE FH; - int i; + LONG pos; Err = 0; - GetIntVal(&FH,&Err); + GetIntVal(&fhi,&Err); + FH = HandleGet(fhi); if ((Err==0) && (GetFirstChar()!=0)) Err = ErrSyntax; if (Err!=0) return Err; - i = 0; - while ((i<NumFHandle) && (FH!=FHandle[i])) i++; - if (i>=NumFHandle) - { - i = 0; - while ((i<NumFHandle) && (FHandle[i]!=INVALID_HANDLE_VALUE)) i++; - if (i<NumFHandle) FHandle[i] = FH; + pos = _llseek(FH,0,1); /* mark current pos */ + if (pos == INVALID_SET_FILE_POINTER) { + pos = 0; // ? } - if (i<NumFHandle) - { - FPointer[i] = _llseek(FH,0,1); /* mark current pos */ - if (FPointer[i]<0) FPointer[i] = 0; - } + FPointer[fhi] = pos; return Err; } @@ -1537,6 +1575,7 @@ { WORD Err; TVarId VarId; + int fhi; HANDLE FH; int Append, ReadonlyFlag=0; TStrVal FName; @@ -1567,11 +1606,21 @@ } if (FH == INVALID_HANDLE_VALUE) FH = _lcreat(FName,0); - if (FH == INVALID_HANDLE_VALUE) FH = INVALID_HANDLE_VALUE; - SetIntVal(VarId, FH); - if (FH == INVALID_HANDLE_VALUE) return Err; - if (Append!=0) _llseek(FH, 0, 2); - return Err; + 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>] @@ -1589,7 +1638,7 @@ GetIntVal(&FH,&Err); if (Err!=0) return Err; - timeout = -1; // \x96\xB3\x8C\xC0\x91\xE5 + timeout = -1; // 無限大 if (CheckParameterGiven()) { GetIntVal(&timeout, &Err); if (Err!=0) return Err; @@ -1599,7 +1648,7 @@ dwStart = GetTickCount(); do { ret = LockFile((HANDLE)FH, 0, 0, (DWORD)-1, (DWORD)-1); - if (ret != 0) { // \x83\x8D\x83b\x83N\x90\xAC\x8C\xF7 + if (ret != 0) { // ロック成功 result = 0; // success break; } @@ -1625,7 +1674,7 @@ if (Err!=0) return Err; ret = UnlockFile((HANDLE)FH, 0, 0, (DWORD)-1, (DWORD)-1); - if (ret != 0) { // \x83A\x83\x93\x83\x8D\x83b\x83N\x90\xAC\x8C\xF7 + if (ret != 0) { // アンロック成功 SetResult(0); } else { SetResult(1); @@ -1638,6 +1687,7 @@ { WORD Err; TVarId VarId; + int fhi; HANDLE FH; int i, c; TStrVal Str; @@ -1645,7 +1695,8 @@ BYTE b; Err = 0; - GetIntVal(&FH, &Err); + GetIntVal(&fhi, &Err); + FH = HandleGet(fhi); GetStrVar(&VarId, &Err); if ((Err==0) && (GetFirstChar()!=0)) Err = ErrSyntax; @@ -1688,27 +1739,29 @@ // Format: fileread <file handle> <read byte> <strvar> -// \x8Ew\x92肵\x82\xBD\x83o\x83C\x83g\x90\x94\x82\xBE\x82\xAF\x83t\x83@\x83C\x83\x8B\x82\xA9\x82\xE7\x93ǂݍ\x9E\x82ށB -// \x82\xBD\x82\xBE\x82\xB5\x81A<read byte>\x82\xCD 1\x81`255 \x82܂ŁB +// 指定したバイト数だけファイルから読み込む。 +// ただし、<read byte>は 1〜255 まで。 // (2006.11.1 yutaka) WORD TTLFileRead() { WORD Err; TVarId VarId; + int fhi; HANDLE FH; int i, c; - int ReadByte; // \x93ǂݍ\x9E\x82ރo\x83C\x83g\x90\x94 + int ReadByte; // 読み込むバイト数 TStrVal Str; BOOL EndFile, EndLine; BYTE b; Err = 0; - GetIntVal(&FH,&Err); + 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)) // \x94͈̓`\x83F\x83b\x83N + if ((Err==0) && (ReadByte < 1 || ReadByte > MaxStrLen-1)) // 範囲チェック Err = ErrSyntax; if (Err!=0) return Err; @@ -1768,7 +1821,7 @@ return Err; } if (rename(FName1,FName2) != 0) { - // \x83\x8A\x83l\x81[\x83\x80\x82Ɏ\xB8\x94s\x82\xB5\x82\xBD\x82\xE7\x81A\x83G\x83\x89\x81[\x82ŕԂ\xB7\x81B + // リネームに失敗したら、エラーで返す。 SetResult(-3); return Err; } @@ -1800,11 +1853,13 @@ WORD TTLFileSeek() { WORD Err; + int fhi; HANDLE FH; int i, j; Err = 0; - GetIntVal(&FH,&Err); + GetIntVal(&fhi,&Err); + FH = HandleGet(fhi); GetIntVal(&i,&Err); GetIntVal(&j,&Err); if ((Err==0) && (GetFirstChar()!=0)) @@ -1817,19 +1872,17 @@ WORD TTLFileSeekBack() { WORD Err; + int fhi; HANDLE FH; - int i; Err = 0; - GetIntVal(&FH,&Err); + GetIntVal(&fhi,&Err); + FH = HandleGet(fhi); if ((Err==0) && (GetFirstChar()!=0)) Err = ErrSyntax; if (Err!=0) return Err; - i = 0; - while ((i<NumFHandle) && (FH!=FHandle[i])) i++; /* move back to the marked pos */ - if (i<NumFHandle) - _llseek(FH,FPointer[i],0); + _llseek(FH,FPointer[fhi],0); return Err; } @@ -1891,6 +1944,7 @@ WORD TTLFileStrSeek() { WORD Err; + int fhi; HANDLE FH; int Len, i, c; TStrVal Str; @@ -1898,7 +1952,8 @@ long int pos; Err = 0; - GetIntVal(&FH,&Err); + GetIntVal(&fhi,&Err); + FH = HandleGet(fhi); GetStrVal(Str,&Err); if ((Err==0) && ((strlen(Str)==0) || (GetFirstChar()!=0))) @@ -1905,7 +1960,7 @@ Err = ErrSyntax; if (Err!=0) return Err; pos = _llseek(FH,0,1); - if (pos==-1) return Err; + if (pos == INVALID_SET_FILE_POINTER) return Err; Len = strlen(Str); i = 0; @@ -1934,6 +1989,7 @@ WORD TTLFileStrSeek2() { WORD Err; + int fhi; HANDLE FH; int Len, i, c; TStrVal Str; @@ -1942,7 +1998,8 @@ BOOL Last; Err = 0; - GetIntVal(&FH,&Err); + GetIntVal(&fhi,&Err); + FH = HandleGet(fhi); GetStrVal(Str,&Err); if ((Err==0) && ((strlen(Str)==0) || (GetFirstChar()!=0))) @@ -1949,7 +2006,7 @@ Err = ErrSyntax; if (Err!=0) return Err; pos = _llseek(FH,0,1); - if (pos<=0) return Err; + if (pos == INVALID_SET_FILE_POINTER) return Err; Len = strlen(Str); i = 0; @@ -1970,9 +2027,10 @@ } } while (!Last && (i!=Len)); if (i==Len) { - // \x83t\x83@\x83C\x83\x8B\x82\xCC1\x83o\x83C\x83g\x96ڂ\xAA\x83q\x83b\x83g\x82\xB7\x82\xE9\x82ƁA\x83t\x83@\x83C\x83\x8B\x83|\x83C\x83\x93\x83^\x82\xAA\x93˂\xAB\x94j\x82\xC1\x82\xC4 -1 \x82ɂȂ\xE9\x82̂ŁA - // \x83[\x83\x8D\x83I\x83t\x83Z\x83b\x83g\x82ɂȂ\xE9\x82悤\x82ɒ\xB2\x90\xAE\x82\xB7\x82\xE9\x81B(2008.10.10 yutaka) - if (pos2 < 0) + // ファイルの1バイト目がヒットすると、ファイルポインタが突き破って + // INVALID_SET_FILE_POINTER になるので、 + // ゼロオフセットになるように調整する。(2008.10.10 yutaka) + if (pos == INVALID_SET_FILE_POINTER) _llseek(FH, 0, 0); SetResult(1); } else { @@ -2010,7 +2068,7 @@ goto end; } - // \x83t\x83@\x83C\x83\x8B\x82\xF0\x8Ew\x92肵\x82\xBD\x83T\x83C\x83Y\x82Ő\xE8\x8Bl\x82߂\xE9\x81B + // ファイルを指定したサイズで切り詰める。 ret = _sopen_s( &fh, FName, _O_RDWR | _O_CREAT, _SH_DENYNO, _S_IREAD | _S_IWRITE ); if (ret != 0) { Err = ErrCantOpen; @@ -2037,12 +2095,14 @@ WORD TTLFileWrite(BOOL addCRLF) { WORD Err, P; + int fhi; HANDLE FH; int Val; TStrVal Str; Err = 0; - GetIntVal(&FH, &Err); + GetIntVal(&fhi, &Err); + FH = HandleGet(fhi); if (Err) return Err; P = LinePtr; @@ -2392,7 +2452,7 @@ Err = ErrSyntax; if (Err!=0) return Err; - // \x8E\xA9\x95\xAA\x8E\xA9\x90g\x82̑SIPv4\x83A\x83h\x83\x8C\x83X\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B + // 自分自身の全IPv4アドレスを取得する。 if (WSAStartup(MAKEWORD(2,2), &ws) != 0) { SetResult(-1); SetIntVal(VarId2, 0); @@ -2431,7 +2491,7 @@ } -// IPv6\x83A\x83h\x83\x8C\x83X\x82\x9A\x97\xF1\x82ɕϊ\xB7\x82\xB7\x82\xE9\x81B +// IPv6アドレスを文字列に変換する。 static void myInetNtop(int Family, char *pAddr, char *pStringBuf, size_t StringBufSize) { int i; @@ -2466,7 +2526,7 @@ Err = ErrSyntax; if (Err!=0) return Err; - // GetAdaptersAddresses \x82\xAA\x83T\x83|\x81[\x83g\x82\xB3\x82\xEA\x82Ă\xA2\x82Ȃ\xA2 OS \x82͂\xB1\x82\xB1\x82\xC5 return + // GetAdaptersAddresses がサポートされていない OS はここで return if (!HasGetAdaptersAddresses()) { SetResult(-1); SetIntVal(VarId2, 0); @@ -2473,7 +2533,7 @@ return Err; } - // \x8E\xA9\x95\xAA\x8E\xA9\x90g\x82̑SIPv6\x83A\x83h\x83\x8C\x83X\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B + // 自分自身の全IPv6アドレスを取得する。 arysize = GetStrAryVarSize(VarId); num = 0; result = 1; @@ -2557,7 +2617,7 @@ SetStrVal(VarId,Temp2); - SetResult(result); // \x90\xAC\x8C\xF7\x89ۂ\xF0\x90ݒ肷\x82\xE9\x81B + SetResult(result); // 成功可否を設定する。 return Err; } @@ -2572,30 +2632,30 @@ int result = 0; /* failure */ Err = 0; - GetStrVal(FileNameStr, &Err); // \x83t\x83@\x83C\x83\x8B\x96\xBC - GetStrVal(KeyStr, &Err); // \x83L\x81[\x96\xBC + GetStrVal(FileNameStr, &Err); // ファイル名 + GetStrVal(KeyStr, &Err); // キー名 GetStrVar(&VarId, &Err); - VarStr = StrVarPtr(VarId); // \x95ϐ\x94\x82ւ̃|\x83C\x83\x93\x83^ + VarStr = StrVarPtr(VarId); // 変数へのポインタ if ((Err==0) && (GetFirstChar()!=0)) Err = ErrSyntax; if (Err!=0) return Err; - // \x95\xB6\x8E\x9A\x97\xF3\x82̏ꍇ\x82̓G\x83\x89\x81[\x82Ƃ\xB7\x82\xE9\x81B + // 文字列が空の場合はエラーとする。 if (FileNameStr[0]==0 || KeyStr[0]==0 || - VarStr[0]==0) // "getpassword"\x93\xAF\x97l\x81A\x8B\xF3\x83p\x83X\x83\x8F\x81[\x83h\x82\xE0\x8B\x96\x89\xB5\x82Ȃ\xA2\x81B + VarStr[0]==0) // "getpassword"同様、空パスワードも許可しない。 Err = ErrSyntax; if (Err!=0) return Err; GetAbsPath(FileNameStr, sizeof(FileNameStr)); - // \x83p\x83X\x83\x8F\x81[\x83h\x82\xF0\x88Í\x86\x89\xBB\x82\xB7\x82\xE9\x81B + // パスワードを暗号化する。 Encrypt(VarStr, Temp); if (WritePrivateProfileString("Password", KeyStr, Temp, FileNameStr) != 0) result = 1; /* success */ - SetResult(result); // \x90\xAC\x8C\xF7\x89ۂ\xF0\x90ݒ肷\x82\xE9\x81B + SetResult(result); // 成功可否を設定する。 return Err; } @@ -2608,13 +2668,13 @@ int result = 0; Err = 0; - GetStrVal(FileNameStr, &Err); // \x83t\x83@\x83C\x83\x8B\x96\xBC - GetStrVal(KeyStr, &Err); // \x83L\x81[\x96\xBC + GetStrVal(FileNameStr, &Err); // ファイル名 + GetStrVal(KeyStr, &Err); // キー名 if ((Err==0) && (GetFirstChar()!=0)) Err = ErrSyntax; if (Err!=0) return Err; - // \x95\xB6\x8E\x9A\x97\xF3\x82̏ꍇ\x82̓G\x83\x89\x81[\x82Ƃ\xB7\x82\xE9\x81B + // 文字列が空の場合はエラーとする。 if (FileNameStr[0]==0 || KeyStr[0]==0) Err = ErrSyntax; @@ -2631,7 +2691,7 @@ result = 1; } - SetResult(result); // \x90\xAC\x8C\xF7\x89ۂ\xF0\x90ݒ肷\x82\xE9\x81B + SetResult(result); // 成功可否を設定する。 return Err; } @@ -2691,7 +2751,7 @@ } set_result = TRUE; - // \x83^\x83C\x83\x80\x83]\x81[\x83\x93\x82̎w\x92肪\x82\xA0\x82\xEA\x82Alocaltime()\x82ɉe\x8B\xBF\x82\xB3\x82\xB9\x82\xE9\x81B(2012.5.2 yutaka) + // タイムゾーンの指定があれば、localtime()に影響させる。(2012.5.2 yutaka) if (CheckParameterGiven()) { GetStrVal(tzStr, &Err); if (Err!=0) return Err; @@ -2779,7 +2839,7 @@ return Err; } -// COM\x83|\x81[\x83g\x82\xA9\x82烌\x83W\x83X\x83^\x92l\x82\xF0\x93ǂށB +// COMポートからレジスタ値を読む。 // (2015.1.8 yutaka) WORD TTLGetModemStatus() { @@ -2811,9 +2871,9 @@ } // -// Tera Term \x82̃o\x81[\x83W\x83\x87\x83\x93\x8E擾 & \x94\xE4\x8Ar -// \x83o\x81[\x83W\x83\x87\x83\x93\x94ԍ\x86\x82̓R\x83\x93\x83p\x83C\x83\x8B\x8E\x9E\x82Ɍ\x88\x92肷\x82\xE9\x81B -// (\x8C\xBB\x8D݂͎\xC0\x8Ds\x83t\x83@\x83C\x83\x8B\x82̃o\x81[\x83W\x83\x87\x83\x93\x8F\xEE\x95\xF1\x82͎Q\x8FƂ\xB5\x82Ȃ\xA2) +// Tera Term のバージョン取得 & 比較 +// バージョン番号はコンパイル時に決定する。 +// (現在は実行ファイルのバージョン情報は参照しない) // WORD TTLGetVer() { @@ -3066,7 +3126,7 @@ if (Err!=0) return Err; Err = ErrSyntax; - if (strcmp(Str, "size") == 0) { // \x83\x8D\x81[\x83e\x81[\x83g\x83T\x83C\x83Y + if (strcmp(Str, "size") == 0) { // ローテートサイズ if (CheckParameterGiven()) { Err = 0; size = 0; @@ -3093,7 +3153,7 @@ _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s %u", Str, size); } - } else if (strcmp(Str, "rotate") == 0) { // \x83\x8D\x81[\x83e\x81[\x83g\x82̐\xA2\x91㐔 + } else if (strcmp(Str, "rotate") == 0) { // ローテートの世代数 if (CheckParameterGiven()) { Err = 0; num = 0; @@ -3262,12 +3322,12 @@ _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); // \x96\x96\x94\xF6\x82\xCC \ \x82\xF0\x8E\xE6\x82菜\x82\xAD + 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); // \x96\x96\x94\xF6\x82\xCC \ \x82\xF0\x8E\xE6\x82菜\x82\xAD + DeleteSlash(dirname); // 末尾の \ を取り除く strncpy_s(basename, sizeof(basename), fname, _TRUNCATE); strncat_s(basename, sizeof(basename), ext, _TRUNCATE); } @@ -3410,7 +3470,7 @@ if (BoxId==IdMsgBox) { ret = OpenMsgDlg(Str1,Str2,FALSE); - // \x83\x81\x83b\x83Z\x81[\x83W\x83{\x83b\x83N\x83X\x82\xF0\x83L\x83\x83\x83\x93\x83Z\x83\x8B\x82\xB7\x82\xE9\x82ƁA\x83}\x83N\x83\x8D\x82̏I\x97\xB9\x82Ƃ\xB7\x82\xE9\x81B + // メッセージボックスをキャンセルすると、マクロの終了とする。 // (2008.8.5 yutaka) if (ret == IDCANCEL) { TTLStatus = IdTTLEnd; @@ -3417,7 +3477,7 @@ } } else if (BoxId==IdYesNoBox) { ret = OpenMsgDlg(Str1,Str2,TRUE); - // \x83\x81\x83b\x83Z\x81[\x83W\x83{\x83b\x83N\x83X\x82\xF0\x83L\x83\x83\x83\x93\x83Z\x83\x8B\x82\xB7\x82\xE9\x82ƁA\x83}\x83N\x83\x8D\x82̏I\x97\xB9\x82Ƃ\xB7\x82\xE9\x81B + // メッセージボックスをキャンセルすると、マクロの終了とする。 // (2008.8.6 yutaka) if (ret == IDCLOSE) { TTLStatus = IdTTLEnd; @@ -3428,7 +3488,7 @@ OpenStatDlg(Str1,Str2); } else if (BoxId==IdListBox) { - // \x83\x8A\x83X\x83g\x83{\x83b\x83N\x83X\x82̑I\x91\xF0\x8E\x88\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B + // リストボックスの選択肢を取得する。 GetStrAryVar(&VarId, Err); if (CheckParameterGiven()) { @@ -3459,8 +3519,8 @@ } // return - // 0\x88ȏ\xE3: \x91I\x91\xF0\x8D\x80\x96\xDA - // -1: \x83L\x83\x83\x83\x93\x83Z\x83\x8B + // 0以上: 選択項目 + // -1: キャンセル ret = OpenListDlg(Str1, Str2, s, sel); for (i = 0 ; i < ary_size ; i++) { @@ -3474,7 +3534,7 @@ return 0; } -// \x83\x8A\x83X\x83g\x83{\x83b\x83N\x83X +// リストボックス // (2013.3.13 yutaka) WORD TTLListBox() { @@ -3990,8 +4050,8 @@ } /* - * src \x82Ɋ܂܂\xEA\x82\xE9 0x01 \x82\xF0 0x01 0x02 \x82ɒu\x82\xAB\x8A\xB7\x82\xA6\x82\xC4 dst \x82ɃR\x83s\x81[\x82\xB7\x82\xE9\x81B - * TStrVal \x82ɂ\xCD 0x00 \x82\xAA\x8A܂܂\xEA\x82鎖\x82\xAA\x96\xB3\x82\xA2(\x8FI\x92[\x82Ƌ\xE6\x95ʂł\xAB\x82Ȃ\xA2)\x82̂\xC5 0x00 \x82͍l\x97\xB6\x82\xB7\x82\xE9\x95K\x97v\x82Ȃ\xB5\x81B + * src に含まれる 0x01 を 0x01 0x02 に置き換えて dst にコピーする。 + * TStrVal には 0x00 が含まれる事が無い(終端と区別できない)ので 0x00 は考慮する必要なし。 */ static void AddBroadcastString(char *dst, int dstlen, char *src) { @@ -4003,7 +4063,7 @@ while (*src != 0 && dstlen > 1) { if (*src == 0x01) { - // 0x01 \x82\xF0\x8Ai\x94[\x82\xB7\x82\xE9\x82ɂ\xCD 0x01 0x02 \x82\xCC2\x83o\x83C\x83g + NUL \x8FI\x92[\x97p\x82\xCC1\x83o\x83C\x83g\x82\xAA\x95K\x97v + // 0x01 を格納するには 0x01 0x02 の2バイト + NUL 終端用の1バイトが必要 if (dstlen < 3) { break; } @@ -4021,13 +4081,13 @@ } /* - * TTLSendBroadcast / TTLSendMulticast \x82̉\xBA\x90\xBF\x82\xAF + * TTLSendBroadcast / TTLSendMulticast の下請け * - * \x8Ae\x83p\x83\x89\x83\x81\x81[\x83^\x82\xF0\x98A\x8C\x8B\x82\xB5\x82\xBD\x95\xB6\x8E\x9A\x97\xF1\x82\xF0 buff \x82Ɋi\x94[\x82\xB5\x82ĕԂ\xB7\x81B - * crlf \x82\xAA TRUE \x82̎\x9E\x82͊e\x83p\x83\x89\x83\x81\x81[\x83^\x82̊Ԃ\xC9 "\n" \x82\xF0\x8B\xB2\x82ށB(\x97v\x8C\x9F\x93\xA2) + * 各パラメータを連結した文字列を buff に格納して返す。 + * crlf が TRUE の時は各パラメータの間に "\n" を挟む。(要検討) * - * \x83p\x83\x89\x83\x81\x81[\x83^\x82\xAA String \x82̏ꍇ\x82͂\xBB\x82̂܂܁AInteger \x82̏ꍇ\x82\xCD ASCII \x83R\x81[\x83h\x82Ƃ݂Ȃ\xB5\x82Ă\xBB\x82̕\xB6\x8E\x9A\x82𑗂\xE9\x81B - * Tera Term \x91\xA4\x82ł\xCD send \x93\x99\x82Ƌ\xA4\x92ʂ̃\x8B\x81[\x83`\x83\x93\x82\xAA\x8Eg\x82\xED\x82\xEA\x82\xE9\x88ׁADDE \x92ʐM\x82ׂ̈̃G\x83\x93\x83R\x81[\x83h\x82\xF0\x8Ds\x82\xA4\x95K\x97v\x97L\x82\xE8\x81B + * パラメータが String の場合はそのまま、Integer の場合は ASCII コードとみなしてその文字を送る。 + * Tera Term 側では send 等と共通のルーチンが使われる為、DDE 通信の為のエンコードを行う必要有り。 * 0x00 -> 0x01 0x01 * 0x01 -> 0x01 0x02 */ @@ -4078,7 +4138,7 @@ return 0; } -// sendbroadcast / sendlnbroadcast \x82̓\xF1\x82\xA9\x82痘\x97p (crlf\x82̒l\x82œ\xAE\x8D\xEC\x82\xF0\x95ς\xA6\x82\xE9) +// sendbroadcast / sendlnbroadcast の二つから利用 (crlfの値で動作を変える) static WORD TTLSendBroadcast(BOOL crlf) { TStrVal buf; @@ -4107,7 +4167,7 @@ return SendCmnd(CmdSetMulticastName, 0); } -// sendmulticast / sendlnmulticast \x82̓\xF1\x82\xA9\x82痘\x97p (crlf\x82̒l\x82œ\xAE\x8D\xEC\x82\xF0\x95ς\xA6\x82\xE9) +// sendmulticast / sendlnmulticast の二つから利用 (crlfの値で動作を変える) WORD TTLSendMulticast(BOOL crlf) { TStrVal buf, Str; @@ -4116,7 +4176,7 @@ if (! Linked) return ErrLinkFirst; - // \x83}\x83\x8B\x83`\x83L\x83\x83\x83X\x83g\x8E\xAF\x95ʗp\x82̖\xBC\x91O\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B + // マルチキャスト識別用の名前を取得する。 Err = 0; GetStrVal(Str,&Err); if (Err!=0) return Err; @@ -4447,9 +4507,9 @@ memset(subFmt, 0, sizeof(subFmt)); } else { - // \x88\xEA\x82\xE8\x91O\x82܂ł\xF0\x82\xBB\x82̂܂\xDC buf \x82Ɋi\x94[ + // 一つ手前までをそのまま buf に格納 strncat_s(buf, sizeof(buf), subFmt, _TRUNCATE); - // \x8Ed\x90蒼\x82\xB5 + // 仕切り直し memset(subFmt, 0, sizeof(subFmt)); strncat_s(subFmt, sizeof(subFmt), p, 1); } @@ -4480,7 +4540,7 @@ type = STRING; } - // "%" \x82\xC6 *p \x82̊Ԃ\xAA\x90\xB3\x82\xB5\x82\xA2\x82\xA9\x83`\x83F\x83b\x83N + // "%" と *p の間が正しいかチェック str = (UChar* )subFmt; end = str + strlen(subFmt); start = str; @@ -4495,7 +4555,7 @@ strncat_s(subFmt, sizeof(subFmt), p, 1); - // width, precision \x82\xAA * \x82\xA9\x82ǂ\xA4\x82\xA9\x83`\x83F\x83b\x83N + // width, precision が * かどうかチェック width_asterisk = precision_asterisk = 0; if (region->num_regs != 3) { SetResult(-1); @@ -4524,7 +4584,7 @@ } free(match_str); - // * \x82ɑΉ\x9E\x82\xB7\x82\xE9\x88\xF8\x90\x94\x82\xF0\x8E擾 + // * に対応する引数を取得 if (width_asterisk) { TmpErr = 0; GetIntVal(&NumWidth, &TmpErr); @@ -4545,7 +4605,7 @@ } if (type == STRING || type == DOUBLE) { - // \x95\xB6\x8E\x9A\x97\xF1\x82Ƃ\xB5\x82ēǂ߂邩\x83g\x83\x89\x83C + // 文字列として読めるかトライ TmpErr = 0; GetStrVal(Str, &TmpErr); if (TmpErr == 0) { @@ -4585,7 +4645,7 @@ } } else { - // \x90\x94\x92l\x82Ƃ\xB5\x82ēǂ߂邩\x83g\x83\x89\x83C + // 数値として読めるかトライ TmpErr = 0; GetIntVal(&Num, &TmpErr); if (TmpErr == 0) { @@ -4637,8 +4697,8 @@ SetStrVal(VarId, buf); } else { - // \x83}\x83b\x83`\x82\xB5\x82\xBD\x8Ds\x82\xF0 inputstr \x82֊i\x94[\x82\xB7\x82\xE9 - SetInputStr(buf); // \x82\xB1\x82\xB1\x82Ńo\x83b\x83t\x83@\x82\xAA\x83N\x83\x8A\x83A\x82\xB3\x82\xEA\x82\xE9 + // マッチした行を inputstr へ格納する + SetInputStr(buf); // ここでバッファがクリアされる } SetResult(0); @@ -4703,7 +4763,7 @@ if (Err!=0) return Err; - // C\x8C\xBE\x8C\xEA\x82ł\xCD16\x90i\x82\xCD0x\x82Ŏn\x82܂邪\x81ATTL\x8Ed\x97l\x82ł\xCD $ \x82Ŏn\x82܂邽\x82߁A\x8C\xE3\x8E҂\xE0\x83T\x83|\x81[\x83g\x82\xB7\x82\xE9\x81B + // C言語では16進は0xで始まるが、TTL仕様では $ で始まるため、後者もサポートする。 if (Str[0] == '$') { memmove_s(Str + 2, sizeof(Str) - 2, Str + 1, strlen(Str)); Str[0] = '0'; @@ -4710,8 +4770,8 @@ Str[1] = 'x'; } - // '%d'\x82\xA9\x82\xE7'%i'\x82֕ύX\x82ɂ\xE6\x82\xE8\x81A10\x90i\x88ȊO\x82̐\x94\x92l\x82\xF0\x95ϊ\xB7\x82ł\xAB\x82\xE9\x82悤\x82ɂ\xB7\x82\xE9\x81B (2007.5.1 yutaka) - // \x89\xBA\x88ʌ݊\xB7\x90\xAB\x82̂\xBD\x82\xDF10\x90i\x82\xC616\x90i\x82݂̂̃T\x83|\x81[\x83g\x82Ƃ\xB7\x82\xE9\x81B(2007.5.2 yutaka) + // '%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') { @@ -4817,10 +4877,10 @@ } /* - \x8F\x91\x8E\xAE: strmatch <\x95\xB6\x8E\x9A\x97\xF1> <\x90\xB3\x8BK\x95\\x8C\xBB> - <\x95\xB6\x8E\x9A\x97\xF1>\x82\xC9<\x90\xB3\x8BK\x95\\x8C\xBB>\x82\xAA\x83}\x83b\x83`\x82\xB7\x82邩\x92\xB2\x82ׂ\xE9\x83R\x83}\x83\x93\x83h(awk\x82\xCCmatch\x8A\x94\x91\x8A\x93\x96)\x81B - result\x82ɂ́A\x83}\x83b\x83`\x82\xB5\x82\xBD\x88ʒu\x82\xF0\x83Z\x83b\x83g(\x83}\x83b\x83`\x82\xB5\x82Ȃ\xA2\x8Fꍇ\x82\xCD0)\x81B - \x83}\x83b\x83`\x82\xB5\x82\xBD\x8Fꍇ\x82́Awaitregex\x82Ɠ\xAF\x97l\x82\xC9matchstr,groupmatchstr1-9\x82\xF0\x83Z\x83b\x83g\x81B + 書式: strmatch <文字列> <正規表現> + <文字列>に<正規表現>がマッチするか調べるコマンド(awkのmatch関数相当)。 + resultには、マッチした位置をセット(マッチしない場合は0)。 + マッチした場合は、waitregexと同様にmatchstr,groupmatchstr1-9をセット。 */ WORD TTLStrMatch() { @@ -4842,7 +4902,7 @@ result = 0; } - // FindRegexStringOne\x82̒\x86\x82\xC5UnlockVar()\x82\xB3\x82\xEA\x82Ă\xB5\x82܂\xA4\x82̂ŁALockVar()\x82\xB5\x82Ȃ\xA8\x82\xB7\x81B + // FindRegexStringOneの中でUnlockVar()されてしまうので、LockVar()しなおす。 LockVar(); SetResult(result); @@ -4886,11 +4946,11 @@ srclen = strlen(str); addlen = strlen(addstr); - // \x82܂\xB8\x82͑}\x93\xFC\x82\xB3\x82\xEA\x82\xE9\x89ӏ\x8A\x88ȍ~\x82̃f\x81[\x83^\x82\xF0\x81A\x8C\xE3\x82\xEB\x82Ɉړ\xAE\x82\xB7\x82\xE9\x81B + // まずは挿入される箇所以降のデータを、後ろに移動する。 np = str + (index - 1); memmove_s(np + addlen, MaxStrLen, np, srclen - (index - 1)); - // \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x91}\x93\xFC\x82\xB7\x82\xE9 + // 文字列を挿入する memcpy(np, addstr, addlen); // null-terminate @@ -4930,7 +4990,7 @@ return Err; } -// \x95\xB6\x8E\x9A\x97\xF1 str \x82\xCC index \x95\xB6\x8E\x9A\x96ځi1\x83I\x83\x8A\x83W\x83\x93\x81j\x82\xA9\x82\xE7 len \x95\xB6\x8E\x9A\x8D폜\x82\xB7\x82\xE9 +// 文字列 str の index 文字目(1オリジン)から len 文字削除する static void remove_string(char *str, int index, int len) { char *np; @@ -4951,7 +5011,7 @@ ^index(np) ^np+len <-->srclen - len - index - \x81\xAB + ↓ XXXXXXYYY */ @@ -5027,18 +5087,18 @@ oldlen = strlen(oldstr); - // strptr\x95\xB6\x8E\x9A\x97\xF1\x82\xCC pos \x95\xB6\x8E\x9A\x96ڈȍ~\x82ɂ\xA8\x82\xA2\x82āAoldstr \x82\xF0\x92T\x82\xB7\x81B + // strptr文字列の pos 文字目以降において、oldstr を探す。 p = tmpstr + pos; ret = FindRegexStringOne(oldstr, oldlen, p, strlen(p)); - // FindRegexStringOne\x82̒\x86\x82\xC5UnlockVar()\x82\xB3\x82\xEA\x82Ă\xB5\x82܂\xA4\x82̂ŁALockVar()\x82\xB5\x82Ȃ\xA8\x82\xB7\x81B + // FindRegexStringOneの中でUnlockVar()されてしまうので、LockVar()しなおす。 LockVar(); if (ret == 0) { - // \x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xA9\x82\xC1\x82\xBD\x8Fꍇ\x82́A"0"\x82Ŗ߂\xE9\x81B + // 見つからなかった場合は、"0"で戻る。 result = 0; goto error; } else if (ret < 0) { - // \x90\xB3\x82\xB5\x82\xAD\x82Ȃ\xA2\x90\xB3\x8BK\x95\\x8C\xBB\x93\x99\x82ŃG\x83\x89\x81[\x82̏ꍇ\x82\xCD -1 \x82\xF0\x95Ԃ\xB7 + // 正しくない正規表現等でエラーの場合は -1 を返す result = -1; goto error; } @@ -5113,34 +5173,34 @@ srcptr = StrVarPtr(VarId); srclen = strlen(srcptr); - // \x8D폜\x82\xB7\x82镶\x8E\x9A\x82̃e\x81[\x83u\x83\x8B\x82\xF0\x8D\xEC\x82\xE9\x81B + // 削除する文字のテーブルを作る。 memset(table, 0, sizeof(table)); for (p = trimchars; *p ; p++) { table[*p] = 1; } - // \x95\xB6\x8E\x9A\x97\xF1\x82̐擪\x82\xA9\x82猟\x8D\x{142DC2}\xE9 + // 文字列の先頭から検索する for (i = 0 ; i < srclen ; i++) { if (table[srcptr[i]] == 0) break; } - // \x8D폜\x82\xB3\x82\xEA\x82Ȃ\xA2\x97L\x8C\xF8\x82ȕ\xB6\x8E\x9A\x97\xF1\x82̎n\x82܂\xE8\x81B - // \x82\xB7\x82ׂč폜\x91ΏۂƂȂ\xE9\x8Fꍇ\x82́Astart == srclen \x81B + // 削除されない有効な文字列の始まり。 + // すべて削除対象となる場合は、start == srclen 。 start = i; - // \x95\xB6\x8E\x9A\x97\xF1\x82̖\x96\x94\x{182A42}猟\x8D\x{142DC2}\xE9 + // 文字列の末尾から検索する for (i = srclen - 1 ; i >= 0 ; i--) { if (table[srcptr[i]] == 0) break; } - // \x8D폜\x82\xB3\x82\xEA\x82Ȃ\xA2\x97L\x8C\xF8\x82ȕ\xB6\x8E\x9A\x97\xF1\x82̏I\x82\xED\x82\xE8\x81B - // \x82\xB7\x82ׂč폜\x91ΏۂƂȂ\xE9\x8Fꍇ\x82́Aend == -1 \x81B + // 削除されない有効な文字列の終わり。 + // すべて削除対象となる場合は、end == -1 。 end = i; - // \x96\x96\x94\xF6\x82\xF0\x8D\xED\x82\xE9 + // 末尾を削る srcptr[end + 1] = '\0'; - // \x8E\x9F\x82ɁA\x90擪\x82\xA9\x82\xE7\x8D\xED\x82\xE9\x81B + // 次に、先頭から削る。 remove_string(srcptr, 1, start); return Err; @@ -5168,7 +5228,7 @@ // TODO array #if 0 Err = 0; - // Parameter \x82\xA9\x82\xE7 array \x82\xF0\x8E\xE6\x82\xE9 + // Parameter から array を受け取る if (Err==0) { ary = TRUE; } @@ -5187,16 +5247,16 @@ if (!ary && (maxvar < 1 || maxvar > MAXVARNUM) ) return ErrSyntax; - // \x83f\x83\x8A\x83~\x83^\x82\xCD1\x95\xB6\x8E\x9A\x82݂̂Ƃ\xB7\x82\xE9\x81B + // デリミタは1文字のみとする。 len = strlen(delimchars); if (len != 1) return ErrSyntax; srclen = strlen(src); - strcpy_s(buf, MaxStrLen, src); /* \x94j\x89\xEA\x82Ă\xE0\x82\xA2\x82\xA2\x82悤\x82ɁA\x83R\x83s\x81[\x83o\x83b\x83t\x83@\x82\xF0\x8Eg\x82\xA4\x81B*/ + strcpy_s(buf, MaxStrLen, src); /* 破壊されてもいいように、コピーバッファを使う。*/ #if 0 - // \x83g\x81[\x83N\x83\x93\x82̐\xE8\x8Fo\x82\xB5\x82\xF0\x8Ds\x82\xA4\x81B + // トークンの切り出しを行う。 memset(tok, 0, sizeof(tok)); #if 0 tok[0] = strtok_s(srcptr, delimchars, &last); @@ -5206,8 +5266,8 @@ break; } #else - /* strtok\x82\xF0\x8Eg\x82\xA4\x82ƁA\x98A\x91\xB1\x82\xB5\x82\xBD\x8B\xE6\x90肪1\x82Ɋۂ߂\xE7\x82\xEA\x82邽\x82߁A\x8E\xA9\x91O\x82Ń|\x83C\x83\x93\x83^\x82\xF0 - * \x82\xBD\x82ǂ\xE9\x81B\x82\xBD\x82\xBE\x82\xB5\x81A\x8B\xE6\x90蕶\x8E\x9A\x82\xCD1\x82݂̂Ƃ\xB7\x82\xE9\x81B + /* strtokを使うと、連続した区切りが1つに丸められるため、自前でポインタを + * たどる。ただし、区切り文字は1つのみとする。 */ i = 0; for (p = buf; *p == delimchars[0] ; p++) { @@ -5235,11 +5295,11 @@ p = buf; count = 1; tok[count-1] = p; - for (i=0; i < srclen && count < maxvar + omit; i++) { // count \x8Fȗ\xAA\x8E\x9E\x82ɂ́A\x92\xB4\x89ߕ\xAA\x82\xF0\x8ÊĂ邽\x82\xDF 1 \x82]\x95\xAA\x82ɐi\x82߂\xE9 + for (i=0; i < srclen && count < maxvar + omit; i++) { // count 省略時には、超過分を捨てるため 1 つ余分に進める if (*p == *delimchars) { *p = '\0'; count++; - if (count <= MAXVARNUM) { // tok \x82̗v\x91f\x90\x94\x82\xA6\x82đ\xE3\x93\xFC\x82\xB5\x82Ȃ\xA2\x82悤\x82ɂ\xB7\x82\xE9(count \x8Fȗ\xAA\x8E\x9E\x82̂\xBD\x82\xDF) + if (count <= MAXVARNUM) { // tok の要素数を超えて代入しないようにする(count 省略時のため) tok[count-1] = p+1; } } @@ -5249,7 +5309,7 @@ #endif //end: - // \x8C\x8B\x89ʂ̊i\x94[ + // 結果の格納 for (i = 1 ; i <= count ; i++) { SetGroupMatchStr(i, tok[i-1]); } @@ -5284,7 +5344,7 @@ // TODO array #if 0 Err = 0; - // Parameter \x82\xA9\x82\xE7 array \x82\xF0\x8E\xE6\x82\xE9 + // Parameter から array を受け取る if (Err==0) { ary = TRUE; } @@ -5428,9 +5488,9 @@ Err = ErrSyntax; if (Err!=0) return Err; - // Windows OS\x82\xAA\x8BN\x93\xAE\x82\xB5\x82Ă\xA9\x82\xE7\x82̌o\x89ߎ\x9E\x8Aԁi\x83~\x83\x8A\x95b\x81j\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B\x82\xBD\x82\xBE\x82\xB5\x81A49\x93\xFA\x82\xF0\x8Co\x89߂\xB7\x82\xE9\x82ƁA0\x82ɖ߂\xE9\x81B - // GetTickCount64() API(Vista\x88ȍ~)\x82\xF0\x8Eg\x82\xA4\x82ƁA\x83I\x81[\x83o\x81[\x83t\x83\x8D\x81[\x82\xB5\x82Ȃ\xAD\x82Ȃ邪\x81A\x82\xBB\x82\xE0\x82\xBB\x82\xE0Tera Term\x82ł\xCD - // 64bit\x95ϐ\x94\x82\xF0\x83T\x83|\x81[\x83g\x82\xB5\x82Ă\xA2\x82Ȃ\xA2\x82̂ŁA\x88Ӗ\xA1\x82\xAA\x82Ȃ\xA2\x81B + // Windows OSが起動してからの経過時間(ミリ秒)を取得する。ただし、49日を経過すると、0に戻る。 + // GetTickCount64() API(Vista以降)を使うと、オーバーフローしなくなるが、そもそもTera Termでは + // 64bit変数をサポートしていないので、意味がない。 tick = GetTickCount(); SetIntVal(VarId, tick); @@ -6376,7 +6436,7 @@ if (StrConst) SetStrVal(VarId,Str); else - // StrVarPtr \x82̕Ԃ\xE8\x92l\x82\xAA TStrVal \x82̃|\x83C\x83\x93\x83^\x82ł\xA0\x82邱\x82Ƃ\xF0\x8A\xFA\x91҂\xB5\x82ăT\x83C\x83Y\x82\xF0\x8CŒ\xE8 + // StrVarPtr の返り値が TStrVal のポインタであることを期待してサイズを固定 // (2007.6.23 maya) strncpy_s(StrVarPtr(VarId),MaxStrLen,StrVarPtr((TVarId)Val),_TRUNCATE); break; @@ -6436,7 +6496,7 @@ UnlockVar(); } -// \x90\xB3\x8BK\x95\\x8C\xBB\x82Ń}\x83b\x83`\x82\xB5\x82\xBD\x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8BL\x98^\x82\xB7\x82\xE9 +// 正規表現でマッチした文字列を記録する // (2005.10.7 yutaka) void SetMatchStr(PCHAR Str) { @@ -6448,7 +6508,7 @@ SetStrVal(VarId,Str); } -// \x90\xB3\x8BK\x95\\x8C\xBB\x82ŃO\x83\x8B\x81[\x83v\x83}\x83b\x83`\x82\xB5\x82\xBD\x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8BL\x98^\x82\xB7\x82\xE9 +// 正規表現でグループマッチした文字列を記録する // (2005.10.15 yutaka) void SetGroupMatchStr(int no, PCHAR Str) {