Revision: 8652 https://osdn.net/projects/ttssh2/scm/svn/commits/8652 Author: zmatsuo Date: 2020-03-30 01:34:55 +0900 (Mon, 30 Mar 2020) Log Message: ----------- マクロ内の識別子に関するいくつかの上限をなくした - 変数(ラベルも含む)の数の上限 - 変更前の上限 - 整数変数 256+4個 - 文字列変数 256+20個 - 整数配列変数 256個 - 文字列配列変数 256個 - ラベルの個数 512個 - 識別子長上限 (MaxNameLen) - 変更前の上限 - 32バイト - 文字列変数に格納できる文字長上限 (MaxStrLen) - 変更前の上限 - 512バイト(文字列終端'\0'含む) Modified Paths: -------------- branches/unicode_macro_2/teraterm/ttpmacro/ttmparse.c -------------- next part -------------- Modified: branches/unicode_macro_2/teraterm/ttpmacro/ttmparse.c =================================================================== --- branches/unicode_macro_2/teraterm/ttpmacro/ttmparse.c 2020-03-28 16:04:24 UTC (rev 8651) +++ branches/unicode_macro_2/teraterm/ttpmacro/ttmparse.c 2020-03-29 16:34:55 UTC (rev 8652) @@ -1,6 +1,6 @@ /* * Copyright (C) 1994-1998 T. Teranishi - * (C) 2005-2019 TeraTerm Project + * (C) 2005-2020 TeraTerm Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -59,9 +59,16 @@ typedef struct { int size; - PStrVal val; +// PStrVal val; + char **val; } TStrAry, *PStrAry; +typedef struct { + BINT val; + WORD level; +} TLab; + +#if 0 // \x95ϐ\x94\x82̌\x94\x82\xF0128->256\x81A\x83\x89\x83x\x83\x8B\x82̌\x94\x82\xF0256->512\x82֊g\x92\xA3\x82\xB5\x82\xBD\x81B(2006.2.1 yutaka) // \x95ϐ\x94\x82̌\x94\x82\xF0\x81AInitTTL \x82ō\xEC\x82\xC1\x82Ă\xA2\x82\xE9\x83V\x83X\x83e\x83\x80\x95ϐ\x94\x82̕\xAA\x82\xBE\x82\xAF\x92lj\xC1\x82\xB5\x82\xBD\x81B(2006.7.26 maya) #define MaxNumOfIntVar (LONG)(256+4) @@ -90,8 +97,33 @@ static HANDLE HStrBuff; static PCHAR StrBuff; static WORD IntVarCount, StrVarCount, LabVarCount, IntAryVarCount, StrAryVarCount; +#endif +typedef enum { + TypeUnknown = TypUnknown, + TypeInteger = TypInteger, + //TypeLogical = TypLogical, + TypeString = TypString, + TypeLabel = TypLabel, + TypeIntArray = TypIntArray, + TypeStrArray = TypStrArray, +} VariableType_t; +typedef struct { + char *Name; + VariableType_t Type; + union { + char *Str; + int Int; + TLab Lab; + TIntAry IntAry; + TStrAry StrAry; + } Value; +} Variable_t; + +static Variable_t *Variables; +static int VariableCount; + // \x83g\x81[\x83N\x83\x93\x82̉\xF0\x90͊J\x8En\x88ʒu\x82\xF0\x8DX\x90V\x82\xB7\x82\xE9\x81B static void UpdateLineParsePtr(void) { @@ -101,6 +133,7 @@ BOOL InitVar() { +#if 0 HNameBuff = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,NameBuffLen); if (HNameBuff==NULL) return FALSE; NameBuff = NULL; @@ -113,13 +146,21 @@ LabVarCount = 0; StrVarCount = 0; return TRUE; +#else + Variables = NULL; + VariableCount = 0; + return TRUE; +#endif } void EndVar() { +#if 0 UnlockVar(); GlobalFree(HNameBuff); GlobalFree(HStrBuff); +#endif + // TODO Variables \x82\xF0\x82\xB7\x82ׂ\xC4 free \x82\xB7\x82\xE9 } void DispErr(WORD Err) @@ -168,6 +209,7 @@ void LockVar() { +#if 0 if (NameBuff==NULL) NameBuff = GlobalLock(HNameBuff); if (NameBuff==NULL) @@ -177,10 +219,12 @@ StrBuff = GlobalLock(HStrBuff); if (StrBuff==NULL) PostQuitMessage(0); +#endif } void UnlockVar() { +#if 0 if (NameBuff!=NULL) GlobalUnlock(HNameBuff); NameBuff = NULL; @@ -188,6 +232,7 @@ if (StrBuff!=NULL) GlobalUnlock(HStrBuff); StrBuff = NULL; +#endif } BOOL CheckReservedWord(PCHAR Str, LPWORD WordId) @@ -858,6 +903,7 @@ BOOL CheckVar(PCHAR Name, LPWORD VarType, PVarId VarId) { +#if 0 int i; long P; @@ -909,10 +955,40 @@ } return FALSE; +#else + int i; + const Variable_t *v = Variables; + for (i = 0; i < VariableCount; v++,i++) { + if (_stricmp(v->Name, Name) == 0) { + *VarType = v->Type; + *VarId = (TVarId)i; + return TRUE; + } + } + *VarType = TypUnknown; + *VarId = 0; + return FALSE; +#endif } +static Variable_t *NewVar(const char *name, VariableType_t type) +{ + Variable_t *new_v = realloc(Variables, sizeof(Variable_t) * (VariableCount + 1)); + if (new_v == NULL) { + // TODO \x83\x81\x83\x82\x83\x8A\x82\xAA\x82Ȃ\xA2 + return NULL; + }; + Variables = new_v; + Variable_t *v = &Variables[VariableCount]; + VariableCount++; + v->Name = strdup(name); + v->Type = type; + return v; +} + BOOL NewIntVar(PCHAR Name, int InitVal) { +#if 0 long P; if (IntVarCount>=MaxNumOfIntVar) return FALSE; @@ -921,10 +997,16 @@ IntVal[IntVarCount] = InitVal; IntVarCount++; return TRUE; +#else + Variable_t *v = NewVar(Name, TypeInteger); + v->Value.Int = InitVal; + return TRUE; +#endif } BOOL NewStrVar(PCHAR Name, PCHAR InitVal) { +#if 0 long P; if (StrVarCount>=MaxNumOfStrVar) return FALSE; @@ -934,10 +1016,16 @@ strncpy_s(&StrBuff[P],MaxStrLen,InitVal,_TRUNCATE); StrVarCount++; return TRUE; +#else + Variable_t *v = NewVar(Name, TypeString); + v->Value.Str = strdup(InitVal); + return TRUE; +#endif } int NewIntAryVar(PCHAR Name, int size) { +#if 0 long P; if (IntAryVarCount >= MaxNumOfIntAryVar) return ErrTooManyVar; if (size <= 0 || size > 65536) return ErrOutOfRange; @@ -950,10 +1038,22 @@ IntAryVarCount++; return 0; +#else + Variable_t *v = NewVar(Name, TypeIntArray); + TIntAry *intAry = &v->Value.IntAry; + int *array = calloc(size, sizeof(int)); + if (array == NULL) { + return ErrFewMemory; + } + intAry->val = array; + intAry->size = size; + return 0; +#endif } int NewStrAryVar(PCHAR Name, int size) { +#if 0 long P; if (StrAryVarCount >= MaxNumOfStrAryVar) return ErrTooManyVar; if (size <= 0 || size > 65536) return ErrOutOfRange; @@ -966,10 +1066,22 @@ StrAryVarCount++; return 0; +#else + Variable_t *v = NewVar(Name, TypeStrArray); + TStrAry *strAry = &v->Value.StrAry; + char **array = calloc(size, sizeof(char *)); + if (array == NULL) { + return ErrFewMemory; + } + strAry->val = array; + strAry->size = size; + return 0; +#endif } BOOL NewLabVar(PCHAR Name, BINT InitVal, WORD ILevel) { +#if 0 long P; if (LabVarCount>=MaxNumOfLabVar) return FALSE; @@ -980,18 +1092,59 @@ LabLevel[LabVarCount] = LOBYTE(ILevel); LabVarCount++; return TRUE; +#else + Variable_t *v = NewVar(Name, TypeLabel); + TLab *lab = &v->Value.Lab; + lab->val = InitVal; + lab->level = ILevel; + return TRUE; +#endif } void DelLabVar(WORD ILevel) { +#if 0 while ((LabVarCount>0) && (LabLevel[LabVarCount-1]>=ILevel)) LabVarCount--; +#else + Variable_t *v = Variables; + for (;;) { + if (v == &Variables[VariableCount]) { + // \x8DŌ\xE3\x82܂ŗ\x88\x82\xBD + break; + } + if (v->Type == TypeLabel) { + if (v->Value.Lab.level >= ILevel) { + size_t left; + // \x8D폜\x82\xB7\x82\xE9 + free(v->Name); + // \x8C\xE3\x82\xEB\x82\xF0\x91O\x82ɂ߂\xE9 + left = &Variables[VariableCount - 1] - v; + if (left > 0) { + memmove(v, v+1, sizeof(Variable_t) * left); + } + // 1\x82\xB8\x82\xE9 + VariableCount--; + + continue; + } + } + v++; + } + Variables = realloc(Variables, sizeof(Variable_t) * VariableCount); +#endif } void CopyLabel(WORD ILabel, BINT far *Ptr, LPWORD Level) { +#if 0 *Ptr = LabVal[ILabel]; *Level = (WORD)LabLevel[ILabel]; +#else + Variable_t *v = &Variables[ILabel]; + *Ptr = v->Value.Lab.val; + *Level = v->Value.Lab.level; +#endif } /* @@ -1028,14 +1181,28 @@ } else if (CheckVar(Name, ValType, &VarId)) { switch (*ValType) { +#if 0 case TypInteger: *Val = IntVal[VarId]; break; +#else + case TypInteger: + *Val = Variables[VarId].Value.Int; + break; +#endif case TypString: *Val = VarId; break; case TypIntArray: if (GetIndex(&Index, Err)) { +#if 0 if (Index >= 0 && Index < IntAryVal[VarId].size) { *Val = IntAryVal[VarId].val[Index]; *ValType = TypInteger; } +#else + TIntAry *intAry = &Variables[VarId].Value.IntAry; + if (Index >= 0 && Index < intAry->size) { + *Val = intAry->val[Index]; + *ValType = TypInteger; + } +#endif else { *Err = ErrOutOfRange; } @@ -1664,6 +1831,7 @@ void SetIntVal(TVarId VarId, int Val) { +#if 0 if (VarId >> 16) { IntAryVal[(VarId>>16)-1].val[VarId & 0xffff] = Val; } @@ -1670,10 +1838,22 @@ else { IntVal[VarId] = Val; } +#else + if (VarId >> 16) { + Variable_t *v = &Variables[(VarId>>16)-1]; + int *int_val = &v->Value.IntAry.val[VarId & 0xffff]; + *int_val = Val; + } + else { + Variable_t *v = &Variables[VarId]; + v->Value.Int = Val; + } +#endif } int CopyIntVal(TVarId VarId) { +#if 0 if (VarId >> 16) { return IntAryVal[(VarId>>16)-1].val[VarId & 0xffff]; } @@ -1680,6 +1860,17 @@ else { return IntVal[VarId]; } +#else + Variable_t *v; + if (VarId >> 16) { + v = &Variables[(VarId>>16)-1]; + return v->Value.IntAry.val[VarId & 0xffff]; + } + else { + v = &Variables[VarId]; + return v->Value.Int; + } +#endif } void GetIntVar(PVarId VarId, LPWORD Err) @@ -1792,13 +1983,29 @@ void SetStrVal(TVarId VarId, const char *Str) { +#if 0 // StrBuf \x82̉^\x97p\x8F\xE3 MaxStrLen \x82\xAA\x90\xB3\x82\xB5\x82\xA2\x83T\x83C\x83Y\x82Ȃ̂ŃT\x83C\x83Y\x82\xF0\x8CŒ\xE8 // (2007.6.23 maya) strncpy_s(StrVarPtr(VarId), MaxStrLen, Str, _TRUNCATE); +#else + if (VarId >> 16) { + Variable_t *v = &Variables[(VarId>>16)-1]; + char **str = &v->Value.StrAry.val[VarId & 0xffff]; + free(*str); + *str = strdup(Str); + } + else { + Variable_t *v = &Variables[VarId]; + char **str = &v->Value.Str; + free(*str); + *str = strdup(Str); + } +#endif } PCHAR StrVarPtr(TVarId VarId) { +#if 0 if (VarId >> 16) { return StrAryVal[(VarId>>16)-1].val[VarId & 0xffff]; } @@ -1805,6 +2012,17 @@ else { return &StrBuff[VarId*MaxStrLen]; } +#else + Variable_t *v; + if (VarId >> 16) { + v = &Variables[(VarId>>16)-1]; + return v->Value.StrAry.val[VarId & 0xffff]; + } + else { + v = &Variables[VarId]; + return v->Value.Str; + } +#endif } // for ifdefined (2006.9.23 maya) @@ -1824,6 +2042,7 @@ switch (*ValType) { case TypIntArray: if (GetIndex(&Index, Err)) { +#if 0 if (Index >= 0 && Index < IntAryVal[VarId].size) { *ValType = TypInteger; } @@ -1830,6 +2049,15 @@ else { *ValType = TypUnknown; } +#else + TIntAry *intAry = &Variables[VarId].Value.IntAry; + if (Index >= 0 && Index < intAry->size) { + *ValType = TypInteger; + } + else { + *ValType = TypUnknown; + } +#endif } break; case TypStrArray: @@ -1876,6 +2104,7 @@ TVarId GetIntVarFromArray(TVarId VarId, int Index, LPWORD Err) { +#if 0 if (Index < 0 || Index >= IntAryVal[VarId].size) { *Err = ErrOutOfRange; return -1; @@ -1882,10 +2111,20 @@ } *Err = 0; return ((VarId+1) << 16) | Index; +#else + TIntAry *intAry = &Variables[VarId].Value.IntAry; + if (Index < 0 || Index >= intAry->size) { + *Err = ErrOutOfRange; + return -1; + } + *Err = 0; + return ((VarId+1) << 16) | Index; +#endif } TVarId GetStrVarFromArray(TVarId VarId, int Index, LPWORD Err) { +#if 0 if (Index < 0 || Index >= StrAryVal[VarId].size) { *Err = ErrOutOfRange; return -1; @@ -1892,6 +2131,15 @@ } *Err = 0; return ((VarId+1) << 16) | Index; +#else + TStrAry *strAry = &Variables[VarId].Value.StrAry; + if (Index < 0 || Index >= strAry->size) { + *Err = ErrOutOfRange; + return -1; + } + *Err = 0; + return ((VarId+1) << 16) | Index; +#endif } void GetAryVar(PVarId VarId, WORD VarType, LPWORD Err) @@ -1944,10 +2192,20 @@ int GetIntAryVarSize(TVarId VarId) { +#if 0 return IntAryVal[VarId].size; +#else + TIntAry *intAry = &Variables[VarId].Value.IntAry; + return intAry->size; +#endif } int GetStrAryVarSize(TVarId VarId) { +#if 0 return StrAryVal[VarId].size; +#else + TIntAry *strAry = &Variables[VarId].Value.IntAry; + return strAry->size; +#endif }