マクロ内の識別子に関するいくつかの上限をなくした
- 変数(ラベルも含む)の数の上限
- 識別子長上限 (MaxNameLen)
- 文字列変数に格納できる文字長上限 (MaxStrLen)
@@ -1,6 +1,6 @@ | ||
1 | 1 | /* |
2 | 2 | * Copyright (C) 1994-1998 T. Teranishi |
3 | - * (C) 2005-2019 TeraTerm Project | |
3 | + * (C) 2005-2020 TeraTerm Project | |
4 | 4 | * All rights reserved. |
5 | 5 | * |
6 | 6 | * Redistribution and use in source and binary forms, with or without |
@@ -59,9 +59,16 @@ | ||
59 | 59 | |
60 | 60 | typedef struct { |
61 | 61 | int size; |
62 | - PStrVal val; | |
62 | +// PStrVal val; | |
63 | + char **val; | |
63 | 64 | } TStrAry, *PStrAry; |
64 | 65 | |
66 | +typedef struct { | |
67 | + BINT val; | |
68 | + WORD level; | |
69 | +} TLab; | |
70 | + | |
71 | +#if 0 | |
65 | 72 | // 変数の個数を128->256、ラベルの個数を256->512へ拡張した。(2006.2.1 yutaka) |
66 | 73 | // 変数の個数を、InitTTL で作っているシステム変数の分だけ追加した。(2006.7.26 maya) |
67 | 74 | #define MaxNumOfIntVar (LONG)(256+4) |
@@ -90,8 +97,33 @@ | ||
90 | 97 | static HANDLE HStrBuff; |
91 | 98 | static PCHAR StrBuff; |
92 | 99 | static WORD IntVarCount, StrVarCount, LabVarCount, IntAryVarCount, StrAryVarCount; |
100 | +#endif | |
93 | 101 | |
102 | +typedef enum { | |
103 | + TypeUnknown = TypUnknown, | |
104 | + TypeInteger = TypInteger, | |
105 | + //TypeLogical = TypLogical, | |
106 | + TypeString = TypString, | |
107 | + TypeLabel = TypLabel, | |
108 | + TypeIntArray = TypIntArray, | |
109 | + TypeStrArray = TypStrArray, | |
110 | +} VariableType_t; | |
94 | 111 | |
112 | +typedef struct { | |
113 | + char *Name; | |
114 | + VariableType_t Type; | |
115 | + union { | |
116 | + char *Str; | |
117 | + int Int; | |
118 | + TLab Lab; | |
119 | + TIntAry IntAry; | |
120 | + TStrAry StrAry; | |
121 | + } Value; | |
122 | +} Variable_t; | |
123 | + | |
124 | +static Variable_t *Variables; | |
125 | +static int VariableCount; | |
126 | + | |
95 | 127 | // トークンの解析開始位置を更新する。 |
96 | 128 | static void UpdateLineParsePtr(void) |
97 | 129 | { |
@@ -101,6 +133,7 @@ | ||
101 | 133 | |
102 | 134 | BOOL InitVar() |
103 | 135 | { |
136 | +#if 0 | |
104 | 137 | HNameBuff = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,NameBuffLen); |
105 | 138 | if (HNameBuff==NULL) return FALSE; |
106 | 139 | NameBuff = NULL; |
@@ -113,13 +146,21 @@ | ||
113 | 146 | LabVarCount = 0; |
114 | 147 | StrVarCount = 0; |
115 | 148 | return TRUE; |
149 | +#else | |
150 | + Variables = NULL; | |
151 | + VariableCount = 0; | |
152 | + return TRUE; | |
153 | +#endif | |
116 | 154 | } |
117 | 155 | |
118 | 156 | void EndVar() |
119 | 157 | { |
158 | +#if 0 | |
120 | 159 | UnlockVar(); |
121 | 160 | GlobalFree(HNameBuff); |
122 | 161 | GlobalFree(HStrBuff); |
162 | +#endif | |
163 | + // TODO Variables をすべて free する | |
123 | 164 | } |
124 | 165 | |
125 | 166 | void DispErr(WORD Err) |
@@ -168,6 +209,7 @@ | ||
168 | 209 | |
169 | 210 | void LockVar() |
170 | 211 | { |
212 | +#if 0 | |
171 | 213 | if (NameBuff==NULL) |
172 | 214 | NameBuff = GlobalLock(HNameBuff); |
173 | 215 | if (NameBuff==NULL) |
@@ -177,10 +219,12 @@ | ||
177 | 219 | StrBuff = GlobalLock(HStrBuff); |
178 | 220 | if (StrBuff==NULL) |
179 | 221 | PostQuitMessage(0); |
222 | +#endif | |
180 | 223 | } |
181 | 224 | |
182 | 225 | void UnlockVar() |
183 | 226 | { |
227 | +#if 0 | |
184 | 228 | if (NameBuff!=NULL) |
185 | 229 | GlobalUnlock(HNameBuff); |
186 | 230 | NameBuff = NULL; |
@@ -188,6 +232,7 @@ | ||
188 | 232 | if (StrBuff!=NULL) |
189 | 233 | GlobalUnlock(HStrBuff); |
190 | 234 | StrBuff = NULL; |
235 | +#endif | |
191 | 236 | } |
192 | 237 | |
193 | 238 | BOOL CheckReservedWord(PCHAR Str, LPWORD WordId) |
@@ -858,6 +903,7 @@ | ||
858 | 903 | |
859 | 904 | BOOL CheckVar(PCHAR Name, LPWORD VarType, PVarId VarId) |
860 | 905 | { |
906 | +#if 0 | |
861 | 907 | int i; |
862 | 908 | long P; |
863 | 909 |
@@ -909,10 +955,40 @@ | ||
909 | 955 | } |
910 | 956 | |
911 | 957 | return FALSE; |
958 | +#else | |
959 | + int i; | |
960 | + const Variable_t *v = Variables; | |
961 | + for (i = 0; i < VariableCount; v++,i++) { | |
962 | + if (_stricmp(v->Name, Name) == 0) { | |
963 | + *VarType = v->Type; | |
964 | + *VarId = (TVarId)i; | |
965 | + return TRUE; | |
966 | + } | |
967 | + } | |
968 | + *VarType = TypUnknown; | |
969 | + *VarId = 0; | |
970 | + return FALSE; | |
971 | +#endif | |
912 | 972 | } |
913 | 973 | |
974 | +static Variable_t *NewVar(const char *name, VariableType_t type) | |
975 | +{ | |
976 | + Variable_t *new_v = realloc(Variables, sizeof(Variable_t) * (VariableCount + 1)); | |
977 | + if (new_v == NULL) { | |
978 | + // TODO メモリがない | |
979 | + return NULL; | |
980 | + }; | |
981 | + Variables = new_v; | |
982 | + Variable_t *v = &Variables[VariableCount]; | |
983 | + VariableCount++; | |
984 | + v->Name = strdup(name); | |
985 | + v->Type = type; | |
986 | + return v; | |
987 | +} | |
988 | + | |
914 | 989 | BOOL NewIntVar(PCHAR Name, int InitVal) |
915 | 990 | { |
991 | +#if 0 | |
916 | 992 | long P; |
917 | 993 | |
918 | 994 | if (IntVarCount>=MaxNumOfIntVar) return FALSE; |
@@ -921,10 +997,16 @@ | ||
921 | 997 | IntVal[IntVarCount] = InitVal; |
922 | 998 | IntVarCount++; |
923 | 999 | return TRUE; |
1000 | +#else | |
1001 | + Variable_t *v = NewVar(Name, TypeInteger); | |
1002 | + v->Value.Int = InitVal; | |
1003 | + return TRUE; | |
1004 | +#endif | |
924 | 1005 | } |
925 | 1006 | |
926 | 1007 | BOOL NewStrVar(PCHAR Name, PCHAR InitVal) |
927 | 1008 | { |
1009 | +#if 0 | |
928 | 1010 | long P; |
929 | 1011 | |
930 | 1012 | if (StrVarCount>=MaxNumOfStrVar) return FALSE; |
@@ -934,10 +1016,16 @@ | ||
934 | 1016 | strncpy_s(&StrBuff[P],MaxStrLen,InitVal,_TRUNCATE); |
935 | 1017 | StrVarCount++; |
936 | 1018 | return TRUE; |
1019 | +#else | |
1020 | + Variable_t *v = NewVar(Name, TypeString); | |
1021 | + v->Value.Str = strdup(InitVal); | |
1022 | + return TRUE; | |
1023 | +#endif | |
937 | 1024 | } |
938 | 1025 | |
939 | 1026 | int NewIntAryVar(PCHAR Name, int size) |
940 | 1027 | { |
1028 | +#if 0 | |
941 | 1029 | long P; |
942 | 1030 | if (IntAryVarCount >= MaxNumOfIntAryVar) return ErrTooManyVar; |
943 | 1031 | if (size <= 0 || size > 65536) return ErrOutOfRange; |
@@ -950,10 +1038,22 @@ | ||
950 | 1038 | |
951 | 1039 | IntAryVarCount++; |
952 | 1040 | return 0; |
1041 | +#else | |
1042 | + Variable_t *v = NewVar(Name, TypeIntArray); | |
1043 | + TIntAry *intAry = &v->Value.IntAry; | |
1044 | + int *array = calloc(size, sizeof(int)); | |
1045 | + if (array == NULL) { | |
1046 | + return ErrFewMemory; | |
1047 | + } | |
1048 | + intAry->val = array; | |
1049 | + intAry->size = size; | |
1050 | + return 0; | |
1051 | +#endif | |
953 | 1052 | } |
954 | 1053 | |
955 | 1054 | int NewStrAryVar(PCHAR Name, int size) |
956 | 1055 | { |
1056 | +#if 0 | |
957 | 1057 | long P; |
958 | 1058 | if (StrAryVarCount >= MaxNumOfStrAryVar) return ErrTooManyVar; |
959 | 1059 | if (size <= 0 || size > 65536) return ErrOutOfRange; |
@@ -966,10 +1066,22 @@ | ||
966 | 1066 | |
967 | 1067 | StrAryVarCount++; |
968 | 1068 | return 0; |
1069 | +#else | |
1070 | + Variable_t *v = NewVar(Name, TypeStrArray); | |
1071 | + TStrAry *strAry = &v->Value.StrAry; | |
1072 | + char **array = calloc(size, sizeof(char *)); | |
1073 | + if (array == NULL) { | |
1074 | + return ErrFewMemory; | |
1075 | + } | |
1076 | + strAry->val = array; | |
1077 | + strAry->size = size; | |
1078 | + return 0; | |
1079 | +#endif | |
969 | 1080 | } |
970 | 1081 | |
971 | 1082 | BOOL NewLabVar(PCHAR Name, BINT InitVal, WORD ILevel) |
972 | 1083 | { |
1084 | +#if 0 | |
973 | 1085 | long P; |
974 | 1086 | |
975 | 1087 | if (LabVarCount>=MaxNumOfLabVar) return FALSE; |
@@ -980,18 +1092,59 @@ | ||
980 | 1092 | LabLevel[LabVarCount] = LOBYTE(ILevel); |
981 | 1093 | LabVarCount++; |
982 | 1094 | return TRUE; |
1095 | +#else | |
1096 | + Variable_t *v = NewVar(Name, TypeLabel); | |
1097 | + TLab *lab = &v->Value.Lab; | |
1098 | + lab->val = InitVal; | |
1099 | + lab->level = ILevel; | |
1100 | + return TRUE; | |
1101 | +#endif | |
983 | 1102 | } |
984 | 1103 | |
985 | 1104 | void DelLabVar(WORD ILevel) |
986 | 1105 | { |
1106 | +#if 0 | |
987 | 1107 | while ((LabVarCount>0) && (LabLevel[LabVarCount-1]>=ILevel)) |
988 | 1108 | LabVarCount--; |
1109 | +#else | |
1110 | + Variable_t *v = Variables; | |
1111 | + for (;;) { | |
1112 | + if (v == &Variables[VariableCount]) { | |
1113 | + // 最後まで来た | |
1114 | + break; | |
1115 | + } | |
1116 | + if (v->Type == TypeLabel) { | |
1117 | + if (v->Value.Lab.level >= ILevel) { | |
1118 | + size_t left; | |
1119 | + // 削除する | |
1120 | + free(v->Name); | |
1121 | + // 後ろを前につめる | |
1122 | + left = &Variables[VariableCount - 1] - v; | |
1123 | + if (left > 0) { | |
1124 | + memmove(v, v+1, sizeof(Variable_t) * left); | |
1125 | + } | |
1126 | + // 1つ減る | |
1127 | + VariableCount--; | |
1128 | + | |
1129 | + continue; | |
1130 | + } | |
1131 | + } | |
1132 | + v++; | |
1133 | + } | |
1134 | + Variables = realloc(Variables, sizeof(Variable_t) * VariableCount); | |
1135 | +#endif | |
989 | 1136 | } |
990 | 1137 | |
991 | 1138 | void CopyLabel(WORD ILabel, BINT far *Ptr, LPWORD Level) |
992 | 1139 | { |
1140 | +#if 0 | |
993 | 1141 | *Ptr = LabVal[ILabel]; |
994 | 1142 | *Level = (WORD)LabLevel[ILabel]; |
1143 | +#else | |
1144 | + Variable_t *v = &Variables[ILabel]; | |
1145 | + *Ptr = v->Value.Lab.val; | |
1146 | + *Level = v->Value.Lab.level; | |
1147 | +#endif | |
995 | 1148 | } |
996 | 1149 | |
997 | 1150 | /* |
@@ -1028,14 +1181,28 @@ | ||
1028 | 1181 | } |
1029 | 1182 | else if (CheckVar(Name, ValType, &VarId)) { |
1030 | 1183 | switch (*ValType) { |
1184 | +#if 0 | |
1031 | 1185 | case TypInteger: *Val = IntVal[VarId]; break; |
1186 | +#else | |
1187 | + case TypInteger: | |
1188 | + *Val = Variables[VarId].Value.Int; | |
1189 | + break; | |
1190 | +#endif | |
1032 | 1191 | case TypString: *Val = VarId; break; |
1033 | 1192 | case TypIntArray: |
1034 | 1193 | if (GetIndex(&Index, Err)) { |
1194 | +#if 0 | |
1035 | 1195 | if (Index >= 0 && Index < IntAryVal[VarId].size) { |
1036 | 1196 | *Val = IntAryVal[VarId].val[Index]; |
1037 | 1197 | *ValType = TypInteger; |
1038 | 1198 | } |
1199 | +#else | |
1200 | + TIntAry *intAry = &Variables[VarId].Value.IntAry; | |
1201 | + if (Index >= 0 && Index < intAry->size) { | |
1202 | + *Val = intAry->val[Index]; | |
1203 | + *ValType = TypInteger; | |
1204 | + } | |
1205 | +#endif | |
1039 | 1206 | else { |
1040 | 1207 | *Err = ErrOutOfRange; |
1041 | 1208 | } |
@@ -1664,6 +1831,7 @@ | ||
1664 | 1831 | |
1665 | 1832 | void SetIntVal(TVarId VarId, int Val) |
1666 | 1833 | { |
1834 | +#if 0 | |
1667 | 1835 | if (VarId >> 16) { |
1668 | 1836 | IntAryVal[(VarId>>16)-1].val[VarId & 0xffff] = Val; |
1669 | 1837 | } |
@@ -1670,10 +1838,22 @@ | ||
1670 | 1838 | else { |
1671 | 1839 | IntVal[VarId] = Val; |
1672 | 1840 | } |
1841 | +#else | |
1842 | + if (VarId >> 16) { | |
1843 | + Variable_t *v = &Variables[(VarId>>16)-1]; | |
1844 | + int *int_val = &v->Value.IntAry.val[VarId & 0xffff]; | |
1845 | + *int_val = Val; | |
1846 | + } | |
1847 | + else { | |
1848 | + Variable_t *v = &Variables[VarId]; | |
1849 | + v->Value.Int = Val; | |
1850 | + } | |
1851 | +#endif | |
1673 | 1852 | } |
1674 | 1853 | |
1675 | 1854 | int CopyIntVal(TVarId VarId) |
1676 | 1855 | { |
1856 | +#if 0 | |
1677 | 1857 | if (VarId >> 16) { |
1678 | 1858 | return IntAryVal[(VarId>>16)-1].val[VarId & 0xffff]; |
1679 | 1859 | } |
@@ -1680,6 +1860,17 @@ | ||
1680 | 1860 | else { |
1681 | 1861 | return IntVal[VarId]; |
1682 | 1862 | } |
1863 | +#else | |
1864 | + Variable_t *v; | |
1865 | + if (VarId >> 16) { | |
1866 | + v = &Variables[(VarId>>16)-1]; | |
1867 | + return v->Value.IntAry.val[VarId & 0xffff]; | |
1868 | + } | |
1869 | + else { | |
1870 | + v = &Variables[VarId]; | |
1871 | + return v->Value.Int; | |
1872 | + } | |
1873 | +#endif | |
1683 | 1874 | } |
1684 | 1875 | |
1685 | 1876 | void GetIntVar(PVarId VarId, LPWORD Err) |
@@ -1792,13 +1983,29 @@ | ||
1792 | 1983 | |
1793 | 1984 | void SetStrVal(TVarId VarId, const char *Str) |
1794 | 1985 | { |
1986 | +#if 0 | |
1795 | 1987 | // StrBuf の運用上 MaxStrLen が正しいサイズなのでサイズを固定 |
1796 | 1988 | // (2007.6.23 maya) |
1797 | 1989 | strncpy_s(StrVarPtr(VarId), MaxStrLen, Str, _TRUNCATE); |
1990 | +#else | |
1991 | + if (VarId >> 16) { | |
1992 | + Variable_t *v = &Variables[(VarId>>16)-1]; | |
1993 | + char **str = &v->Value.StrAry.val[VarId & 0xffff]; | |
1994 | + free(*str); | |
1995 | + *str = strdup(Str); | |
1996 | + } | |
1997 | + else { | |
1998 | + Variable_t *v = &Variables[VarId]; | |
1999 | + char **str = &v->Value.Str; | |
2000 | + free(*str); | |
2001 | + *str = strdup(Str); | |
2002 | + } | |
2003 | +#endif | |
1798 | 2004 | } |
1799 | 2005 | |
1800 | 2006 | PCHAR StrVarPtr(TVarId VarId) |
1801 | 2007 | { |
2008 | +#if 0 | |
1802 | 2009 | if (VarId >> 16) { |
1803 | 2010 | return StrAryVal[(VarId>>16)-1].val[VarId & 0xffff]; |
1804 | 2011 | } |
@@ -1805,6 +2012,17 @@ | ||
1805 | 2012 | else { |
1806 | 2013 | return &StrBuff[VarId*MaxStrLen]; |
1807 | 2014 | } |
2015 | +#else | |
2016 | + Variable_t *v; | |
2017 | + if (VarId >> 16) { | |
2018 | + v = &Variables[(VarId>>16)-1]; | |
2019 | + return v->Value.StrAry.val[VarId & 0xffff]; | |
2020 | + } | |
2021 | + else { | |
2022 | + v = &Variables[VarId]; | |
2023 | + return v->Value.Str; | |
2024 | + } | |
2025 | +#endif | |
1808 | 2026 | } |
1809 | 2027 | |
1810 | 2028 | // for ifdefined (2006.9.23 maya) |
@@ -1824,6 +2042,7 @@ | ||
1824 | 2042 | switch (*ValType) { |
1825 | 2043 | case TypIntArray: |
1826 | 2044 | if (GetIndex(&Index, Err)) { |
2045 | +#if 0 | |
1827 | 2046 | if (Index >= 0 && Index < IntAryVal[VarId].size) { |
1828 | 2047 | *ValType = TypInteger; |
1829 | 2048 | } |
@@ -1830,6 +2049,15 @@ | ||
1830 | 2049 | else { |
1831 | 2050 | *ValType = TypUnknown; |
1832 | 2051 | } |
2052 | +#else | |
2053 | + TIntAry *intAry = &Variables[VarId].Value.IntAry; | |
2054 | + if (Index >= 0 && Index < intAry->size) { | |
2055 | + *ValType = TypInteger; | |
2056 | + } | |
2057 | + else { | |
2058 | + *ValType = TypUnknown; | |
2059 | + } | |
2060 | +#endif | |
1833 | 2061 | } |
1834 | 2062 | break; |
1835 | 2063 | case TypStrArray: |
@@ -1876,6 +2104,7 @@ | ||
1876 | 2104 | |
1877 | 2105 | TVarId GetIntVarFromArray(TVarId VarId, int Index, LPWORD Err) |
1878 | 2106 | { |
2107 | +#if 0 | |
1879 | 2108 | if (Index < 0 || Index >= IntAryVal[VarId].size) { |
1880 | 2109 | *Err = ErrOutOfRange; |
1881 | 2110 | return -1; |
@@ -1882,10 +2111,20 @@ | ||
1882 | 2111 | } |
1883 | 2112 | *Err = 0; |
1884 | 2113 | return ((VarId+1) << 16) | Index; |
2114 | +#else | |
2115 | + TIntAry *intAry = &Variables[VarId].Value.IntAry; | |
2116 | + if (Index < 0 || Index >= intAry->size) { | |
2117 | + *Err = ErrOutOfRange; | |
2118 | + return -1; | |
2119 | + } | |
2120 | + *Err = 0; | |
2121 | + return ((VarId+1) << 16) | Index; | |
2122 | +#endif | |
1885 | 2123 | } |
1886 | 2124 | |
1887 | 2125 | TVarId GetStrVarFromArray(TVarId VarId, int Index, LPWORD Err) |
1888 | 2126 | { |
2127 | +#if 0 | |
1889 | 2128 | if (Index < 0 || Index >= StrAryVal[VarId].size) { |
1890 | 2129 | *Err = ErrOutOfRange; |
1891 | 2130 | return -1; |
@@ -1892,6 +2131,15 @@ | ||
1892 | 2131 | } |
1893 | 2132 | *Err = 0; |
1894 | 2133 | return ((VarId+1) << 16) | Index; |
2134 | +#else | |
2135 | + TStrAry *strAry = &Variables[VarId].Value.StrAry; | |
2136 | + if (Index < 0 || Index >= strAry->size) { | |
2137 | + *Err = ErrOutOfRange; | |
2138 | + return -1; | |
2139 | + } | |
2140 | + *Err = 0; | |
2141 | + return ((VarId+1) << 16) | Index; | |
2142 | +#endif | |
1895 | 2143 | } |
1896 | 2144 | |
1897 | 2145 | void GetAryVar(PVarId VarId, WORD VarType, LPWORD Err) |
@@ -1944,10 +2192,20 @@ | ||
1944 | 2192 | |
1945 | 2193 | int GetIntAryVarSize(TVarId VarId) |
1946 | 2194 | { |
2195 | +#if 0 | |
1947 | 2196 | return IntAryVal[VarId].size; |
2197 | +#else | |
2198 | + TIntAry *intAry = &Variables[VarId].Value.IntAry; | |
2199 | + return intAry->size; | |
2200 | +#endif | |
1948 | 2201 | } |
1949 | 2202 | |
1950 | 2203 | int GetStrAryVarSize(TVarId VarId) |
1951 | 2204 | { |
2205 | +#if 0 | |
1952 | 2206 | return StrAryVal[VarId].size; |
2207 | +#else | |
2208 | + TIntAry *strAry = &Variables[VarId].Value.IntAry; | |
2209 | + return strAry->size; | |
2210 | +#endif | |
1953 | 2211 | } |