svnno****@sourc*****
svnno****@sourc*****
2011年 9月 13日 (火) 16:53:32 JST
Revision: 4624 http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=4624 Author: doda Date: 2011-09-13 16:53:31 +0900 (Tue, 13 Sep 2011) Log Message: ----------- é åã®å®è£ ã ç¾å¨ã®ã¨ãããä¸æå ã®ã¿ã Modified Paths: -------------- trunk/teraterm/ttpmacro/ttl.c trunk/teraterm/ttpmacro/ttmbuff.c trunk/teraterm/ttpmacro/ttmparse.c trunk/teraterm/ttpmacro/ttmparse.h -------------- next part -------------- Modified: trunk/teraterm/ttpmacro/ttl.c =================================================================== --- trunk/teraterm/ttpmacro/ttl.c 2011-09-13 07:00:56 UTC (rev 4623) +++ trunk/teraterm/ttpmacro/ttl.c 2011-09-13 07:53:31 UTC (rev 4624) @@ -319,11 +319,11 @@ WORD TTLCall() { TName LabName; - WORD Err, VarType, VarId; + WORD Err, VarType; + TVarId VarId; - if (GetLabelName(LabName) && (GetFirstChar()==0)) - { - if (CheckVar(LabName,&VarType,&VarId) && (VarType==TypLabel)) + if (GetLabelName(LabName) && (GetFirstChar()==0)) { + if (CheckVar(LabName, &VarType, &VarId) && (VarType==TypLabel)) Err = CallToLabel(VarId); else Err = ErrLabelReq; @@ -337,7 +337,8 @@ // add 'clipb2var' (2006.9.17 maya) WORD TTLClipb2Var() { - WORD VarId, Err; + WORD Err; + TVarId VarId; HANDLE hText; PTSTR clipbText; char buf[MaxStrLen]; @@ -347,7 +348,7 @@ static int cbbuffsize, cblen; Err = 0; - GetStrVar(&VarId,&Err); + GetStrVar(&VarId, &Err); if (Err!=0) return Err; // get 2nd arg(optional) if given @@ -376,7 +377,7 @@ strncpy_s(buf,sizeof(buf),clipbText,_TRUNCATE); GlobalUnlock(hText); CloseClipboard(); - SetStrVal(VarId,buf); + SetStrVal(VarId, buf); SetResult(3); return Err; } @@ -398,7 +399,7 @@ else { SetResult(1); } - SetStrVal(VarId,buf); + SetStrVal(VarId, buf); } else { SetResult(0); @@ -462,13 +463,14 @@ WORD TTLCode2Str() { - WORD VarId, Err; + TVarId VarId; + WORD Err; int Num, Len, c, i; BYTE d; TStrVal Str; Err = 0; - GetStrVar(&VarId,&Err); + GetStrVar(&VarId, &Err); GetIntVal(&Num,&Err); if ((Err==0) && (GetFirstChar()!=0)) @@ -487,7 +489,7 @@ } } Str[i] = 0; - SetStrVal(VarId,Str); + SetStrVal(VarId, Str); return Err; } @@ -601,17 +603,18 @@ WORD TTLCrc32() { TStrVal Str; - WORD Err, CRC; + WORD Err; + TVarId VarId; Err = 0; - GetIntVar(&CRC, &Err); + GetIntVar(&VarId, &Err); GetStrVal(Str,&Err); if ((Err==0) && (GetFirstChar()!=0)) Err = ErrSyntax; if (Err!=0) return Err; if (Str[0]==0) return Err; - SetIntVal(CRC, crc2(strlen(Str), Str)); + SetIntVal(VarId, crc2(strlen(Str), Str)); return Err; } @@ -624,13 +627,14 @@ { TStrVal Str; int result = 0; - WORD Err, CRC; + WORD Err; + TVarId VarId; HANDLE fh = INVALID_HANDLE_VALUE, hMap = NULL; LPBYTE lpBuf = NULL; DWORD fsize; Err = 0; - GetIntVar(&CRC, &Err); + GetIntVar(&VarId, &Err); GetStrVal(Str,&Err); if ((Err==0) && (GetFirstChar()!=0)) Err = ErrSyntax; @@ -659,7 +663,7 @@ fsize = GetFileSize(fh,NULL); - SetIntVal(CRC, crc2(fsize, lpBuf)); + SetIntVal(VarId, crc2(fsize, lpBuf)); error: if (lpBuf != NULL) { @@ -700,6 +704,33 @@ 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) { + if (!NewIntAryVar(Name, size)) + Err = ErrTooManyVar; + } + else { + if (!NewStrAryVar(Name, size)) + Err = ErrTooManyVar; + } + return Err; +} + WORD TTLDisconnect() { WORD Err; @@ -976,11 +1007,12 @@ WORD TTLExpandEnv() { - WORD Err, VarId; + WORD Err; + TVarId VarId; TStrVal deststr, srcptr; Err = 0; - GetStrVar(&VarId,&Err); + GetStrVar(&VarId, &Err); if (Err!=0) return Err; if (CheckParameterGiven()) { // expandenv strvar strval @@ -1114,13 +1146,14 @@ WORD TTLFileCreate() { - WORD Err, VarId; + WORD Err; + TVarId VarId; int FH; TStrVal FName; Err = 0; - GetIntVar(&VarId,&Err); - GetStrVal(FName,&Err); + GetIntVar(&VarId, &Err); + GetStrVal(FName, &Err); if ((Err==0) && ((strlen(FName)==0) || (GetFirstChar()!=0))) Err = ErrSyntax; @@ -1130,7 +1163,7 @@ } if (!GetAbsPath(FName,sizeof(FName))) { - SetIntVal(VarId,-1); + SetIntVal(VarId, -1); SetResult(-1); return Err; } @@ -1142,7 +1175,7 @@ else { SetResult(0); } - SetIntVal(VarId,FH); + SetIntVal(VarId, FH); return Err; } @@ -1201,7 +1234,8 @@ WORD TTLFilenameBox() { TStrVal Str1; - WORD Err, ValType, VarId; + WORD Err, ValType; + TVarId VarId; OPENFILENAME ofn; char uimsg[MAX_UIMSG]; BOOL SaveFlag = FALSE; @@ -1221,7 +1255,7 @@ if (Err!=0) return Err; SetInputStr(""); - if (CheckVar("inputstr",&ValType,&VarId) && + if (CheckVar("inputstr", &ValType, &VarId) && (ValType==TypString)) { memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); @@ -1246,44 +1280,46 @@ WORD TTLFileOpen() { - WORD Err, VarId; + WORD Err; + TVarId VarId; int Append, FH; TStrVal FName; Err = 0; - GetIntVar(&VarId,&Err); - GetStrVal(FName,&Err); - GetIntVal(&Append,&Err); + GetIntVar(&VarId, &Err); + GetStrVal(FName, &Err); + GetIntVal(&Append, &Err); if ((Err==0) && ((strlen(FName)==0) || (GetFirstChar()!=0))) Err = ErrSyntax; if (Err!=0) return Err; if (!GetAbsPath(FName,sizeof(FName))) { - SetIntVal(VarId,-1); + SetIntVal(VarId, -1); return Err; } FH = _lopen(FName,OF_READWRITE); if (FH<0) FH = _lcreat(FName,0); if (FH<0) FH = -1; - SetIntVal(VarId,FH); + SetIntVal(VarId, FH); if (FH<0) return Err; - if (Append!=0) _llseek(FH,0,2); + if (Append!=0) _llseek(FH, 0, 2); return Err; } WORD TTLFileReadln() { - WORD Err, VarId; + WORD Err; + TVarId VarId; int FH, i, c; TStrVal Str; BOOL EndFile, EndLine; BYTE b; Err = 0; - GetIntVal(&FH,&Err); - GetStrVar(&VarId,&Err); + GetIntVal(&FH, &Err); + GetStrVar(&VarId, &Err); if ((Err==0) && (GetFirstChar()!=0)) Err = ErrSyntax; if (Err!=0) return Err; @@ -1292,14 +1328,14 @@ EndLine = FALSE; EndFile = TRUE; do { - c = _lread(FH,&b,1); + c = _lread(FH, &b, 1); if (c>0) EndFile = FALSE; if (c==1) { switch (b) { case 0x0d: - c = _lread(FH,&b,1); + c = _lread(FH, &b, 1); if ((c==1) && (b!=0x0a)) - _llseek(FH,-1,1); + _llseek(FH, -1, 1); EndLine = TRUE; break; case 0x0a: EndLine = TRUE; break; @@ -1319,7 +1355,7 @@ SetResult(0); Str[i] = 0; - SetStrVal(VarId,Str); + SetStrVal(VarId, Str); return Err; } @@ -1330,7 +1366,8 @@ // (2006.11.1 yutaka) WORD TTLFileRead() { - WORD Err, VarId; + WORD Err; + TVarId VarId; int FH, i, c; int ReadByte; // ÇÝÞoCg TStrVal Str; @@ -1464,7 +1501,8 @@ WORD TTLFileStat() { - WORD Err, SizeVarId, TimeVarId, DrvVarId; + WORD Err; + TVarId SizeVarId, TimeVarId, DrvVarId; TStrVal FName, TimeStr, DrvStr; struct _stat st; int ret; @@ -1717,7 +1755,8 @@ WORD TTLFindFirst() { - WORD DH, Name, Err; + TVarId DH, Name; + WORD Err; TStrVal Dir; int i; struct _finddata_t data; @@ -1760,7 +1799,8 @@ WORD TTLFindNext() { - WORD Name, Err; + TVarId Name; + WORD Err; int DH; struct _finddata_t data; @@ -1875,7 +1915,8 @@ WORD TTLFor() { - WORD Err, VarId; + WORD Err; + TVarId VarId; int ValStart, ValEnd, i; Err = 0; @@ -1912,7 +1953,8 @@ WORD TTLGetDir() { - WORD VarId, Err; + WORD Err; + TVarId VarId; TStrVal Str; Err = 0; @@ -1928,7 +1970,8 @@ WORD TTLGetEnv() { - WORD VarId, Err; + WORD Err; + TVarId VarId; TStrVal Str; PCHAR Str2; @@ -1966,7 +2009,8 @@ WORD TTLGetHostname() { - WORD VarId, Err; + WORD Err; + TVarId VarId; char Str[MaxStrLen]; Err = 0; @@ -1987,7 +2031,8 @@ { TStrVal Str, Str2, Temp2; char Temp[512]; - WORD VarId, Err; + WORD Err; + TVarId VarId; int result = 0; /* failure */ Err = 0; @@ -2028,7 +2073,8 @@ WORD TTLGetTime(WORD mode) { - WORD VarId, Err; + WORD Err; + TVarId VarId; TStrVal Str1, Str2; time_t time1; struct tm *ptm; @@ -2082,7 +2128,8 @@ WORD TTLGetTitle() { - WORD VarId, Err; + TVarId VarId; + WORD Err; char Str[TitleBuffSize*2]; Err = 0; @@ -2101,7 +2148,8 @@ WORD TTLGetTTDir() { - WORD VarId, Err; + TVarId VarId; + WORD Err; char Temp[MAX_PATH],HomeDir[MAX_PATH]; Err = 0; @@ -2188,7 +2236,8 @@ // WORD TTLGetVer() { - WORD VarId, Err; + TVarId VarId; + WORD Err; TStrVal Str1, Str2; int a, b, c, d; int compare = 0; @@ -2241,7 +2290,8 @@ WORD TTLGoto() { TName LabName; - WORD Err, VarType, VarId; + WORD Err, VarType; + TVarId VarId; if (GetLabelName(LabName) && (GetFirstChar()==0)) { @@ -2349,7 +2399,8 @@ WORD TTLInputBox(BOOL Paswd) { TStrVal Str1, Str2, Str3; - WORD Err, ValType, VarId, P; + WORD Err, ValType, P; + TVarId VarId; int sp = 0; Err = 0; @@ -2393,7 +2444,8 @@ WORD TTLInt2Str() { - WORD VarId, Err; + TVarId VarId; + WORD Err; int Num; TStrVal Str2; @@ -2502,7 +2554,8 @@ WORD TTLMakePath() { - WORD VarId, Err; + TVarId VarId; + WORD Err; TStrVal Dir, Name; Err = 0; @@ -2562,7 +2615,8 @@ WORD TTLBasename() { - WORD VarId, Err; + TVarId VarId; + WORD Err; TStrVal Src, Name; Err = 0; @@ -2582,7 +2636,8 @@ WORD TTLDirname() { - WORD VarId, Err; + TVarId VarId; + WORD Err; TStrVal Src, Dir; Err = 0; @@ -2717,7 +2772,8 @@ WORD TTLRecvRandom() { static int srand_init = 0; - WORD VarId, Err; + TVarId VarId; + WORD Err; int MaxNum, Num; double d; @@ -2749,7 +2805,8 @@ WORD TTLRecvLn() { TStrVal Str; - WORD ValType, VarId; + WORD ValType; + TVarId VarId; int TimeOut; if (GetFirstChar()!=0) @@ -2796,7 +2853,8 @@ #define ROTATE_DIR_RIGHT 1 WORD BitRotate(int direction) { - WORD VarId, Err; + TVarId VarId; + WORD Err; int x, n; Err = 0; @@ -3245,7 +3303,8 @@ TStrVal Fmt; int Num; TStrVal Str; - WORD Err = 0, TmpErr, VarId; + WORD Err = 0, TmpErr; + TVarId VarId; char buf[MaxStrLen]; char *p, subFmt[MaxStrLen], buf2[MaxStrLen]; @@ -3265,7 +3324,7 @@ UChar* pattern, * str; if (getvar) { - GetStrVar(&VarId,&Err); + GetStrVar(&VarId, &Err); if (Err!=0) { SetResult(4); return Err; @@ -3437,7 +3496,8 @@ WORD TTLStr2Code() { - WORD VarId, Err; + TVarId VarId; + WORD Err; TStrVal Str; int Len, c, i; unsigned int Num; @@ -3465,7 +3525,8 @@ WORD TTLStr2Int() { - WORD VarId, Err; + TVarId VarId; + WORD Err; TStrVal Str; int Num; @@ -3536,7 +3597,8 @@ WORD TTLStrConcat() { - WORD VarId, Err; + TVarId VarId; + WORD Err; TStrVal Str; Err = 0; @@ -3552,7 +3614,8 @@ WORD TTLStrCopy() { - WORD Err, VarId; + WORD Err; + TVarId VarId; int From, Len, SrcLen; TStrVal Str; @@ -3671,7 +3734,8 @@ WORD TTLStrInsert() { - WORD Err, VarId; + WORD Err; + TVarId VarId; int Index; TStrVal Str; int srclen, addlen; @@ -3737,7 +3801,8 @@ WORD TTLStrRemove() { - WORD Err, VarId; + WORD Err; + TVarId VarId; int Index, Len; int srclen; char *srcptr; @@ -3764,7 +3829,8 @@ WORD TTLStrReplace() { - WORD Err, VarId, VarType; + WORD Err, VarType; + TVarId VarId; TStrVal oldstr; TStrVal newstr; char *srcptr, *matchptr; @@ -3845,7 +3911,8 @@ WORD TTLStrSpecial() { - WORD Err, VarId; + WORD Err; + TVarId VarId; TStrVal srcstr; Err = 0; @@ -3873,7 +3940,8 @@ WORD TTLStrTrim() { TStrVal trimchars; - WORD Err, VarId; + WORD Err; + TVarId VarId; int srclen; int i, start, end; char *srcptr, *p; @@ -4042,7 +4110,8 @@ { #define MAXVARNUM 9 TStrVal delimchars, buf; - WORD Err, VarId; + WORD Err; + TVarId VarId; WORD VarType; int maxvar; int srclen; @@ -4122,7 +4191,8 @@ // added (2007.7.12 maya) WORD TTLToLower() { - WORD Err, VarId; + WORD Err; + TVarId VarId; TStrVal Str; int i=0; @@ -4151,7 +4221,8 @@ // added (2007.7.12 maya) WORD TTLToUpper() { - WORD Err, VarId; + WORD Err; + TVarId VarId; TStrVal Str; int i=0; @@ -4194,7 +4265,8 @@ WORD TTLWait(BOOL Ln) { TStrVal Str; - WORD Err, ValType, VarId; + WORD Err, ValType; + TVarId VarId; int i, Val; BOOL NoMore; int TimeOut; @@ -4299,7 +4371,8 @@ WORD TTLWaitEvent() { - WORD Err, ValType, VarId; + WORD Err, ValType; + TVarId VarId; int TimeOut; Err = 0; @@ -4331,7 +4404,8 @@ WORD TTLWaitN() { - WORD Err, ValType, VarId; + WORD Err, ValType; + TVarId VarId; int TimeOut, WaitBytes; ClearWaitN(); @@ -4376,7 +4450,8 @@ TStrVal Str; WORD Err; int Pos, Len, TimeOut; - WORD VarType, VarId; + WORD VarType; + TVarId VarId; Err = 0; GetStrVal(Str,&Err); @@ -4590,18 +4665,17 @@ int ExecCmnd() { WORD WId, Err; - BOOL StrConst, E; + BOOL StrConst, E, WithIndex; TStrVal Str; TName Cmnd; - WORD ValType, VarType, VarId; - int Val; + WORD ValType, VarType; + TVarId VarId; + int Val, Index; Err = 0; - if (EndWhileFlag>0) - { - if (GetReservedWord(&WId)) - { + if (EndWhileFlag>0) { + if (GetReservedWord(&WId)) { switch (WId) { case RsvWhile: case RsvUntil: @@ -4617,10 +4691,8 @@ return 0; } - if (BreakFlag>0) - { - if (GetReservedWord(&WId)) - { + if (BreakFlag>0) { + if (GetReservedWord(&WId)) { switch (WId) { case RsvIf: if (CheckThen(&Err)) @@ -4650,8 +4722,7 @@ return Err; } - if (EndIfFlag>0) - { + if (EndIfFlag>0) { if (! GetReservedWord(&WId)) ; else if ((WId==RsvIf) && CheckThen(&Err)) @@ -4661,8 +4732,7 @@ return Err; } - if (ElseFlag>0) - { + if (ElseFlag>0) { if (! GetReservedWord(&WId)) ; else if ((WId==RsvIf) && CheckThen(&Err)) @@ -4837,6 +4907,9 @@ 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: @@ -5022,10 +5095,15 @@ default: Err = ErrSyntax; } - else if (GetIdentifier(Cmnd)) - { - if (GetFirstChar()=='=') - { + else if (GetIdentifier(Cmnd)) { + if (GetIndex(&Index, &Err)) { + WithIndex = TRUE; + } + else { + WithIndex = FALSE; + } + + if (!Err && GetFirstChar() == '=') { StrConst = GetString(Str,&Err); if (StrConst) ValType = TypString; @@ -5033,11 +5111,24 @@ if (! GetExpression(&ValType,&Val,&Err)) Err = ErrSyntax; - if (Err==0) - { - if (CheckVar(Cmnd,&VarType,&VarId)) - { - if (VarType==ValType) + 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: @@ -5047,10 +5138,14 @@ // StrVarPtr ÌÔèlª TStrVal Ì|C^Å é±ÆðúÒµÄTCYðÅè // (2007.6.23 maya) strncpy_s(StrVarPtr(VarId),MaxStrLen,StrVarPtr((WORD)Val),_TRUNCATE); - break; + break; + default: + Err = ErrSyntax; } - else + } + else { Err = ErrTypeMismatch; + } } else { switch (ValType) { @@ -5066,7 +5161,7 @@ } if (! E) Err = ErrTooManyVar; } - if ((Err==0) && (GetFirstChar()!=0)) + if (!Err && (GetFirstChar()!=0)) Err = ErrSyntax; } } @@ -5101,7 +5196,8 @@ // (2005.10.7 yutaka) void SetMatchStr(PCHAR Str) { - WORD VarType, VarId; + WORD VarType; + TVarId VarId; if (CheckVar("matchstr",&VarType,&VarId) && (VarType==TypString)) @@ -5112,7 +5208,8 @@ // (2005.10.15 yutaka) void SetGroupMatchStr(int no, PCHAR Str) { - WORD VarType, VarId; + WORD VarType; + TVarId VarId; char buf[128]; char *p; @@ -5130,7 +5227,8 @@ void SetInputStr(PCHAR Str) { - WORD VarType, VarId; + WORD VarType; + TVarId VarId; if (CheckVar("inputstr",&VarType,&VarId) && (VarType==TypString)) @@ -5139,7 +5237,8 @@ void SetResult(int ResultCode) { - WORD VarType, VarId; + WORD VarType; + TVarId VarId; if (CheckVar("result",&VarType,&VarId) && (VarType==TypInteger)) Modified: trunk/teraterm/ttpmacro/ttmbuff.c =================================================================== --- trunk/teraterm/ttpmacro/ttmbuff.c 2011-09-13 07:00:56 UTC (rev 4623) +++ trunk/teraterm/ttpmacro/ttmbuff.c 2011-09-13 07:53:31 UTC (rev 4624) @@ -229,7 +229,8 @@ BYTE b; TName LabName; WORD Err; - WORD VarType, VarId; + WORD VarType; + TVarId VarId; TStrVal tmp; Buff[IBuff] = GlobalLock(BuffHandle[IBuff]); @@ -244,7 +245,7 @@ b = GetFirstChar(); if (b==':') { if (GetLabelName(LabName) && (GetFirstChar()==0)) { - if (CheckVar(LabName,&VarType,&VarId)) { + if (CheckVar(LabName, &VarType, &VarId)) { Err = ErrLabelAlreadyDef; } else { Modified: trunk/teraterm/ttpmacro/ttmparse.c =================================================================== --- trunk/teraterm/ttpmacro/ttmparse.c 2011-09-13 07:00:56 UTC (rev 4623) +++ trunk/teraterm/ttpmacro/ttmparse.c 2011-09-13 07:53:31 UTC (rev 4624) @@ -20,28 +20,44 @@ WORD LinePtr; WORD LineLen; +typedef struct { + int size; + int *val; +} TIntAry, *PIntAry; + +typedef struct { + int size; + PStrVal val; +} TStrAry, *PStrAry; + // ÏÌÂð128->256AxÌÂð256->512Ög£µ½B(2006.2.1 yutaka) // ÏÌÂðAInitTTL ÅìÁÄ¢éVXeÏ̪¾¯ÇÁµ½B(2006.7.26 maya) -#define MaxNumOfIntVar (LONG)(128*2+3) -#define MaxNumOfStrVar (LONG)(128*2+19) -#define MaxNumOfLabVar (LONG)256*2 +#define MaxNumOfIntVar (LONG)(256+3) +#define MaxNumOfStrVar (LONG)(256+19) +#define MaxNumOfLabVar (LONG)512 +#define MaxNumOfIntAryVar (LONG)256 +#define MaxNumOfStrAryVar (LONG)256 #define IntVarIdOff (LONG)0 #define StrVarIdOff (IntVarIdOff+MaxNumOfIntVar) #define LabVarIdOff (StrVarIdOff+MaxNumOfStrVar) -#define MaxNumOfName (MaxNumOfIntVar+MaxNumOfStrVar+MaxNumOfLabVar) +#define IntAryVarIdOff (LabVarIdOff+MaxNumOfLabVar) +#define StrAryVarIdOff (IntAryVarIdOff+MaxNumOfIntAryVar) +#define MaxNumOfName (MaxNumOfIntVar+MaxNumOfStrVar+MaxNumOfLabVar+MaxNumOfIntAryVar+MaxNumOfStrAryVar) #define NameBuffLen MaxNumOfName*MaxNameLen #define StrBuffLen MaxNumOfStrVar*MaxStrLen static int IntVal[MaxNumOfIntVar]; static BINT LabVal[MaxNumOfLabVar]; static BYTE LabLevel[MaxNumOfLabVar]; +static TIntAry IntAryVal[MaxNumOfIntAryVar]; +static TStrAry StrAryVal[MaxNumOfStrAryVar]; static HANDLE HNameBuff; static PCHAR NameBuff; static HANDLE HStrBuff; static PCHAR StrBuff; -static WORD IntVarCount, StrVarCount, LabVarCount; +static WORD IntVarCount, StrVarCount, LabVarCount, IntAryVarCount, StrAryVarCount; BOOL InitVar() { @@ -88,6 +104,8 @@ case ErrTypeMismatch: strncpy_s(Msg, sizeof(Msg),"Type mismatch.", _TRUNCATE); break; case ErrVarNotInit: strncpy_s(Msg, sizeof(Msg),"Variable not initialized.", _TRUNCATE); break; case ErrCloseComment: strncpy_s(Msg, sizeof(Msg),"\"*/\" expected.", _TRUNCATE); break; + case ErrOutOfRange: strncpy_s(Msg, sizeof(Msg), "Index out of range.", _TRUNCATE); break; + case ErrCloseBracket: strncpy_s(Msg, sizeof(Msg), "\"]\" expected.", _TRUNCATE); break; } i = OpenErrDlg(Msg,LineBuff); @@ -216,6 +234,7 @@ else if (_stricmp(Str,"include")==0) *WordId = RsvInclude ; else if (_stricmp(Str,"inputbox")==0) *WordId = RsvInputBox; else if (_stricmp(Str,"int2str")==0) *WordId = RsvInt2Str; + else if (_stricmp(Str,"intdim")==0) *WordId = RsvIntDim; break; case 'k': if (_stricmp(Str,"kmtfinish")==0) *WordId = RsvKmtFinish; @@ -296,6 +315,7 @@ else if (_stricmp(Str,"strcompare")==0) *WordId = RsvStrCompare; else if (_stricmp(Str,"strconcat")==0) *WordId = RsvStrConcat; else if (_stricmp(Str,"strcopy")==0) *WordId = RsvStrCopy; + else if (_stricmp(Str,"strdim")==0) *WordId = RsvStrDim; else if (_stricmp(Str,"strinsert")==0) *WordId = RsvStrInsert; else if (_stricmp(Str,"strjoin")==0) *WordId = RsvStrJoin; else if (_stricmp(Str,"strlen")==0) *WordId = RsvStrLen; @@ -752,52 +772,58 @@ return TRUE; } -BOOL CheckVar(PCHAR Name, LPWORD VarType, LPWORD VarId) +BOOL CheckVar(PCHAR Name, LPWORD VarType, PVarId VarId) { int i; long P; *VarType = TypUnknown; - i = 0; - while (i<IntVarCount) - { - P = (i+IntVarIdOff)*MaxNameLen; - if (_stricmp(&NameBuff[P],Name)==0) - { + for (i=0; i<IntVarCount; i++) { + P = (i + IntVarIdOff) * MaxNameLen; + if (_stricmp(&NameBuff[P], Name) == 0) { *VarType = TypInteger; - *VarId = (WORD)i; + *VarId = (TVarId)i; return TRUE; } - i++; } - i = 0; - while (i<StrVarCount) - { - P = (i+StrVarIdOff)*MaxNameLen; - if (_stricmp(&NameBuff[P],Name)==0) - { + for (i=0; i<StrVarCount; i++) { + P = (i + StrVarIdOff) * MaxNameLen; + if (_stricmp(&NameBuff[P], Name) == 0) { *VarType = TypString; *VarId = i; return TRUE; } - i++; } - i = 0; - while (i<LabVarCount) - { - P = (i+LabVarIdOff)*MaxNameLen; - if (_stricmp(&NameBuff[P],Name)==0) - { + for (i=0; i<LabVarCount; i++) { + P = (i + LabVarIdOff) * MaxNameLen; + if (_stricmp(&NameBuff[P], Name) == 0) { *VarType = TypLabel; *VarId = i; return TRUE; } - i++; } + for (i=0; i<IntAryVarCount; i++) { + P = (i + IntAryVarIdOff) * MaxNameLen; + if (_stricmp(&NameBuff[P], Name) == 0) { + *VarType = TypIntArray; + *VarId = i; + return TRUE; + } + } + + for (i=0; i<StrAryVarCount; i++) { + P = (i + StrAryVarIdOff) * MaxNameLen; + if (_stricmp(&NameBuff[P], Name) == 0) { + *VarType = TypStrArray; + *VarId = i; + return TRUE; + } + } + return FALSE; } @@ -826,6 +852,36 @@ return TRUE; } +BOOL NewIntAryVar(PCHAR Name, int size) +{ + long P; + if (IntAryVarCount >= MaxNumOfIntAryVar) return FALSE; + + if ((IntAryVal[IntAryVarCount].val = calloc(size, sizeof(int))) == NULL) return FALSE; + IntAryVal[IntAryVarCount].size = size; + + P = (IntAryVarIdOff + IntAryVarCount) * MaxNameLen; + strncpy_s(&NameBuff[P], MaxNameLen, Name, _TRUNCATE); + + IntAryVarCount++; + return TRUE; +} + +BOOL NewStrAryVar(PCHAR Name, int size) +{ + long P; + if (StrAryVarCount >= MaxNumOfStrAryVar) return FALSE; + + if ((StrAryVal[StrAryVarCount].val = calloc(size, sizeof(TStrVal))) == NULL) return FALSE; + StrAryVal[StrAryVarCount].size = size; + + P = (StrAryVarIdOff + StrAryVarCount) * MaxNameLen; + strncpy_s(&NameBuff[P], MaxNameLen, Name, _TRUNCATE); + + StrAryVarCount++; + return TRUE; +} + BOOL NewLabVar(PCHAR Name, BINT InitVal, WORD ILevel) { long P; @@ -863,16 +919,18 @@ BOOL GetFactor(LPWORD ValType, int far *Val, LPWORD Err) { TName Name; - WORD P, Id; + WORD P, WId; + TVarId VarId; + int Index; P = LinePtr; *Err = 0; if (GetIdentifier(Name)) { - if (CheckReservedWord(Name,&Id)) { + if (CheckReservedWord(Name,&WId)) { if (GetFactor(ValType, Val, Err)) { if ((*Err==0) && (*ValType!=TypInteger)) *Err = ErrTypeMismatch; - switch (Id) { + switch (WId) { case RsvBNot: *Val = ~(*Val); break; case RsvLNot: *Val = !(*Val); break; default: *Err = ErrSyntax; @@ -882,10 +940,36 @@ *Err = ErrSyntax; } } - else if (CheckVar(Name, ValType, &Id)) { + else if (CheckVar(Name, ValType, &VarId)) { switch (*ValType) { - case TypInteger: *Val = IntVal[Id]; break; - case TypString: *Val = Id; break; + case TypInteger: *Val = IntVal[VarId]; break; + case TypString: *Val = VarId; break; + case TypIntArray: + if (GetIndex(&Index, Err)) { + if (Index >= 0 && Index < IntAryVal[VarId].size) { + *Val = IntAryVal[VarId].val[Index]; + *ValType = TypInteger; + } + else { + *Err = ErrOutOfRange; + } + } + else if (*Err == 0) { + *Val = VarId; + } + break; + case TypStrArray: + if (GetIndex(&Index, Err)) { + VarId = GetStrVarFromArray(VarId, Index, Err); + if (*Err == 0) { + *Val = VarId; + *ValType = TypString; + } + } + else if (*Err == 0) { + *Val = VarId; + } + break; } } else @@ -893,11 +977,11 @@ } else if (GetNumber(Val)) *ValType = TypInteger; - else if (GetOperator(&Id)) { + else if (GetOperator(&WId)) { if (GetFactor(ValType, Val, Err)) { if ((*Err==0) && (*ValType != TypInteger)) *Err = ErrTypeMismatch; - switch (Id) { + switch (WId) { case RsvPlus: break; case RsvMinus: *Val = -(*Val); break; case RsvBNot: *Val = ~(*Val); break; @@ -1490,33 +1574,54 @@ *Err = ErrTypeMismatch; } -void SetIntVal(WORD VarId, int Val) +void SetIntVal(TVarId VarId, int Val) { - IntVal[VarId] = Val; + if (VarId >> 16) { + IntAryVal[(VarId>>16)-1].val[VarId & 0xffff] = Val; + } + else { + IntVal[VarId] = Val; + } } -int CopyIntVal(WORD VarId) +int CopyIntVal(TVarId VarId) { - return IntVal[VarId]; + if (VarId >> 16) { + return IntAryVal[(VarId>>16)-1].val[VarId & 0xffff]; + } + else { + return IntVal[VarId]; + } } -void GetIntVar(LPWORD VarId, LPWORD Err) +void GetIntVar(PVarId VarId, LPWORD Err) { TName Name; WORD VarType; + int Index; if (*Err!=0) return; - if (GetIdentifier(Name)) - { - if (CheckVar(Name,&VarType,VarId)) - { - if (VarType!=TypInteger) + if (GetIdentifier(Name)) { + if (CheckVar(Name, &VarType, VarId)) { + switch (VarType) { + case TypInteger: + break; + case TypIntArray: + if (GetIndex(&Index, Err)) { + *VarId = GetIntVarFromArray(*VarId, Index, Err); + } + else if (*Err == 0) { + *Err = ErrTypeMismatch; + } + break; + default: *Err = ErrTypeMismatch; + } } else { - if (NewIntVar(Name,0)) - CheckVar(Name,&VarType,VarId); + if (NewIntVar(Name, 0)) + CheckVar(Name, &VarType, VarId); else *Err = ErrTooManyVar; } @@ -1538,18 +1643,17 @@ Str[0] = 0; if (*Err!=0) return; - if (GetString(Str,Err)) + if (GetString(Str, Err)) return; - else if (GetExpression(&VarType,&VarId,Err)) - { + else if (GetExpression(&VarType, &VarId, Err)) { if (*Err!=0) return; switch (VarType) { case TypString: - strncpy_s(Str,MaxStrLen,&StrBuff[VarId*MaxStrLen],_TRUNCATE); + strncpy_s(Str, MaxStrLen, StrVarPtr(VarId), _TRUNCATE); break; case TypInteger: if (AutoConversion) - _snprintf_s(Str,MaxStrLen,_TRUNCATE,"%d",VarId); + _snprintf_s(Str, MaxStrLen, _TRUNCATE, "%d", VarId); else *Err = ErrTypeMismatch; break; @@ -1561,23 +1665,34 @@ *Err = ErrSyntax; } -void GetStrVar(LPWORD VarId, LPWORD Err) +void GetStrVar(PVarId VarId, LPWORD Err) { TName Name; WORD VarType; + int Index; if (*Err!=0) return; - if (GetIdentifier(Name)) - { - if (CheckVar(Name,&VarType,VarId)) - { - if (VarType!=TypString) + if (GetIdentifier(Name)) { + if (CheckVar(Name, &VarType, VarId)) { + switch (VarType) { + case TypString: + break; + case TypStrArray: + if (GetIndex(&Index, Err)) { + *VarId = GetStrVarFromArray(*VarId, Index, Err); + } + else if (*Err == 0) { + *Err = ErrTypeMismatch; + } + break; + default: *Err = ErrTypeMismatch; + } } else { - if (NewStrVar(Name,"")) - CheckVar(Name,&VarType,VarId); + if (NewStrVar(Name, "")) + CheckVar(Name, &VarType, VarId); else *Err = ErrTooManyVar; } @@ -1586,16 +1701,21 @@ *Err = ErrSyntax; } -void SetStrVal(WORD VarId, PCHAR Str) +void SetStrVal(TVarId VarId, PCHAR Str) { // StrBuf Ì^pã MaxStrLen ª³µ¢TCYÈÌÅTCYðÅè // (2007.6.23 maya) - strncpy_s(&StrBuff[VarId*MaxStrLen],MaxStrLen,Str,_TRUNCATE); + strncpy_s(StrVarPtr(VarId), MaxStrLen, Str, _TRUNCATE); } -PCHAR StrVarPtr(WORD VarId) +PCHAR StrVarPtr(TVarId VarId) { - return (&StrBuff[VarId*MaxStrLen]); + if (VarId >> 16) { + return StrAryVal[(VarId>>16)-1].val[VarId & 0xffff]; + } + else { + return &StrBuff[VarId*MaxStrLen]; + } } // for ifdefined (2006.9.23 maya) @@ -1609,3 +1729,44 @@ *Err = 0; } + +BOOL GetIndex(int *Index, LPWORD Err) +{ + WORD P; + int Idx; + + *Err = 0; + P = LinePtr; + if (GetFirstChar() == '[') { + GetIntVal(&Idx, Err); + if (*Err == 0) { + if (GetFirstChar() == ']') { + *Index = Idx; + return TRUE; + } + *Err = ErrCloseBracket; + } + } + LinePtr = P; + return FALSE; +} + +TVarId GetIntVarFromArray(TVarId VarId, int Index, LPWORD Err) +{ + if (Index < 0 || Index >= IntAryVal[VarId].size) { + *Err = ErrOutOfRange; + return -1; + } + *Err = 0; + return ((VarId+1) << 16) | Index; +} + +TVarId GetStrVarFromArray(TVarId VarId, int Index, LPWORD Err) +{ + if (Index < 0 || Index >= StrAryVal[VarId].size) { + *Err = ErrOutOfRange; + return -1; + } + *Err = 0; + return ((VarId+1) << 16) | Index; +} Modified: trunk/teraterm/ttpmacro/ttmparse.h =================================================================== --- trunk/teraterm/ttpmacro/ttmparse.h 2011-09-13 07:00:56 UTC (rev 4623) +++ trunk/teraterm/ttpmacro/ttmparse.h 2011-09-13 07:53:31 UTC (rev 4624) @@ -34,12 +34,16 @@ #define ErrTypeMismatch 14 #define ErrVarNotInit 15 #define ErrCloseComment 16 +#define ErrOutOfRange 17 +#define ErrCloseBracket 18 #define TypUnknown 0 #define TypInteger 1 #define TypLogical 2 #define TypString 3 #define TypLabel 4 +#define TypIntArray 5 +#define TypStrArray 6 #define RsvBeep 1 #define RsvBPlusRecv 2 @@ -190,6 +194,8 @@ #define RsvSendlnBroadcast 147 #define RsvWait4all 148 #define RsvDispStr 149 +#define RsvIntDim 150 +#define RsvStrDim 151 #define RsvSetDebug 175 #define RsvYmodemRecv 176 #define RsvYmodemSend 177 @@ -250,6 +256,9 @@ typedef char TStrVal [MaxStrLen]; typedef TStrVal far *PStrVal; +typedef DWORD TVarId; +typedef TVarId far *PVarId; + #ifdef __cplusplus extern "C" { #endif @@ -264,25 +273,31 @@ BOOL CheckParameterGiven(); BOOL GetIdentifier(PCHAR Name); BOOL GetReservedWord(LPWORD WordId); +BOOL CheckReservedWord(PCHAR Str, LPWORD WordId); BOOL GetLabelName(PCHAR Name); BOOL GetString(PCHAR Str, LPWORD Err); -BOOL CheckVar(PCHAR Name, LPWORD VarType, LPWORD VarId); +BOOL CheckVar(PCHAR Name, LPWORD VarType, PVarId VarId); BOOL NewIntVar(PCHAR Name, int InitVal); BOOL NewStrVar(PCHAR Name, PCHAR InitVal); BOOL NewLabVar(PCHAR Name, BINT InitVal, WORD ILevel); +BOOL NewIntAryVar(PCHAR Name, int size); +BOOL NewStrAryVar(PCHAR Name, int size); void DelLabVar(WORD ILevel); void CopyLabel(WORD ILabel, BINT far *Ptr, LPWORD Level); BOOL GetExpression(LPWORD ValType, int far *Val, LPWORD Err); void GetIntVal(int far *Val, LPWORD Err); -void SetIntVal(WORD VarId, int Val); -int CopyIntVal(WORD VarId); -void GetIntVar(LPWORD VarId, LPWORD Err); +void SetIntVal(TVarId VarId, int Val); +int CopyIntVal(TVarId VarId); +void GetIntVar(PVarId VarId, LPWORD Err); void GetStrVal(PCHAR Str, LPWORD Err); void GetStrVal2(PCHAR Str, LPWORD Err, BOOL AutoConversion); -void GetStrVar(LPWORD VarId, LPWORD Err); -void SetStrVal(WORD VarId, PCHAR Str); -PCHAR StrVarPtr(WORD VarId); +void GetStrVar(PVarId VarId, LPWORD Err); +void SetStrVal(TVarId VarId, PCHAR Str); +PCHAR StrVarPtr(TVarId VarId); void GetVarType(LPWORD ValType, int far *Val, LPWORD Err); +TVarId GetIntVarFromArray(TVarId VarId, int Index, LPWORD Err); +TVarId GetStrVarFromArray(TVarId VarId, int Index, LPWORD Err); +BOOL GetIndex(int *Index, LPWORD Err); extern WORD TTLStatus; extern char LineBuff[MaxLineLen];