[Ttssh2-commit] [8696] マクロ内の識別子に関するいくつかの上限をなくした

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 4月 12日 (日) 00:55:03 JST


Revision: 8696
          https://osdn.net/projects/ttssh2/scm/svn/commits/8696
Author:   zmatsuo
Date:     2020-04-12 00:55:03 +0900 (Sun, 12 Apr 2020)
Log Message:
-----------
マクロ内の識別子に関するいくつかの上限をなくした

- 変数(ラベルも含む)の数の上限
  - 変更前の上限
    - 整数変数 256+4個
    - 文字列変数 256+20個
    - 整数配列変数 256個
    - 文字列配列変数 256個
    - ラベルの個数 512個
- 識別子長上限 (MaxNameLen)
  - 変更前の上限
    - 32バイト
- 文字列変数に格納できる文字長上限 (MaxStrLen)
  - 変更前の上限
    - 512バイト(文字列終端'\0'含む)

Modified Paths:
--------------
    trunk/teraterm/ttpmacro/ttmparse.c

-------------- next part --------------
Modified: trunk/teraterm/ttpmacro/ttmparse.c
===================================================================
--- trunk/teraterm/ttpmacro/ttmparse.c	2020-04-11 15:54:55 UTC (rev 8695)
+++ trunk/teraterm/ttpmacro/ttmparse.c	2020-04-11 15:55:03 UTC (rev 8696)
@@ -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
 }


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