source: dev/BasicCompiler_Common/Enum.cpp@ 88

Last change on this file since 88 was 88, checked in by dai_9181, 17 years ago

House→Smoothie
Sourceクラスを用意した。

File size: 7.1 KB
Line 
1#include "common.h"
2
3CEnumParent **ppobj_EnumParent;
4int iEnumParentNum;
5
6CEnumMember::CEnumMember(char *name,int value){
7 m_name=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1);
8 lstrcpy(m_name,name);
9
10 m_value=value;
11}
12CEnumMember::~CEnumMember(){
13 if(m_name) HeapDefaultFree(m_name);
14}
15
16
17CEnumParent::CEnumParent(const char *buffer,int nowLine){
18 ppobj_EnumMember=(CEnumMember **)HeapAlloc(hHeap,0,1);
19 iEnumMemberNum=0;
20
21 int i=0,i2;
22
23 if(!(buffer[i]==1&&buffer[i+1]==ESC_ENUM)) return;
24 i+=2;
25
26 //列挙体の名前を取得
27 char temporary[VN_SIZE];
28 for(i2=0;;i++,i2++){
29 if(IsCommandDelimitation(buffer[i])){
30 temporary[i2]=0;
31 break;
32 }
33 if(!IsVariableChar(buffer[i])){
34 SetError(1,NULL,i);
35 break;
36 }
37 temporary[i2]=buffer[i];
38 }
39
40 TypeName=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
41 lstrcpy(TypeName,temporary);
42
43 if(buffer[i]=='\0'){
44 SetError(22,"Enum",nowLine);
45 return;
46 }
47
48 int NextValue=0;
49 while(1){
50 i++;
51
52 if(buffer[i]==1&&buffer[i+1]==ESC_ENDENUM) break;
53
54 for(i2=0;;i2++,i++){
55 if(IsCommandDelimitation(buffer[i])){
56 temporary[i2]=0;
57 break;
58 }
59 if(buffer[i]=='='){
60 temporary[i2]=0;
61 break;
62 }
63 temporary[i2]=buffer[i];
64 }
65 if(temporary[0]=='\0'){
66 if(buffer[i]=='\0'){
67 SetError(22,"Enum",nowLine);
68 break;
69 }
70 continue;
71 }
72
73 if(buffer[i]!='='){
74 NextValue++;
75 }
76 else{
77 char temp2[VN_SIZE];
78 for(i++,i2=0;;i2++,i++){
79 if(IsCommandDelimitation(buffer[i])){
80 temp2[i2]=0;
81 break;
82 }
83 temp2[i2]=buffer[i];
84 }
85 NextValue=atoi(temp2);
86 }
87
88 //メンバを追加
89 ppobj_EnumMember=(CEnumMember **)HeapReAlloc(hHeap,0,ppobj_EnumMember,(iEnumMemberNum+1)*sizeof(CEnumMember *));
90 ppobj_EnumMember[iEnumMemberNum]=new CEnumMember(temporary,NextValue);
91 iEnumMemberNum++;
92 }
93}
94CEnumParent::~CEnumParent(){
95 HeapDefaultFree(TypeName);
96
97 int i;
98 for(i=0;i<iEnumMemberNum;i++){
99 delete ppobj_EnumMember[i];
100 }
101 HeapDefaultFree(ppobj_EnumMember);
102}
103
104
105
106void CEnumParent::InitEnum(void){
107 ppobj_EnumParent=(CEnumParent **)HeapAlloc(hHeap,0,1);
108 iEnumParentNum=0;
109
110 const char *source = Smoothie::Lexical::source.GetBuffer();
111
112 int i;
113 for(i=0;;i++){
114 if(source[i]=='\0') break;
115
116 if(source[i]==1&&source[i+1]==ESC_ENUM){
117 if(i>=2){
118 if(source[i-2]==1&&source[i-1]==ESC_CONST) continue;
119 }
120 ppobj_EnumParent=(CEnumParent **)HeapReAlloc(hHeap,0,ppobj_EnumParent,(iEnumParentNum+1)*sizeof(CEnumParent *));
121 ppobj_EnumParent[iEnumParentNum]=new CEnumParent(source+i,i);
122 iEnumParentNum++;
123 }
124 }
125}
126void CEnumParent::DestroyEnum(void){
127 int i;
128 for(i=0;i<iEnumParentNum;i++){
129 delete ppobj_EnumParent[i];
130 }
131 HeapDefaultFree(ppobj_EnumParent);
132}
133
134char *CEnumParent::GenerateCodes(void){
135 int i,i2;
136
137 char *buffer;
138 int MaxSize,length;
139 MaxSize=65535;
140 buffer=(char *)HeapAlloc(hHeap,0,MaxSize+65535);
141 length=0;
142
143 buffer[0]=0;
144
145 for(i=0;i<iEnumParentNum;i++){
146 CEnumParent *parent;
147 parent=ppobj_EnumParent[i];
148
149 sprintf(buffer+length,"Class %s\n",parent->TypeName);
150 length+=lstrlen(buffer+length);
151 lstrcpy(buffer+length,"\tInherits EnumBase\n");
152 length+=lstrlen(buffer+length);
153 lstrcpy(buffer+length,"Public\n");
154 length+=lstrlen(buffer+length);
155 sprintf(buffer+length,"\tSub %s()\n",parent->TypeName);
156 length+=lstrlen(buffer+length);
157 if(parent->iEnumMemberNum){
158 sprintf(buffer+length,"\t\tEnumBase(%d)\n",
159 parent->ppobj_EnumMember[0]->m_value);
160 length+=lstrlen(buffer+length);
161 }
162 lstrcpy(buffer+length,"\tEnd Sub\n");
163 length+=lstrlen(buffer+length);
164 sprintf(buffer+length,"\tSub %s(ByRef e As %s)\n",parent->TypeName,parent->TypeName);
165 length+=lstrlen(buffer+length);
166 lstrcpy(buffer+length,"\t\tEnumBase(e.m_Value)\n");
167 length+=lstrlen(buffer+length);
168 lstrcpy(buffer+length,"\tEnd Sub\n");
169 length+=lstrlen(buffer+length);
170 sprintf(buffer+length,"\tSub %s(value As Long)\n",parent->TypeName);
171 length+=lstrlen(buffer+length);
172 lstrcpy(buffer+length,"\t\tEnumBase(value)\n");
173 length+=lstrlen(buffer+length);
174 lstrcpy(buffer+length,"\tEnd Sub\n");
175 length+=lstrlen(buffer+length);
176 sprintf(buffer+length,"\tSub ~%s()\n",parent->TypeName);
177 length+=lstrlen(buffer+length);
178 lstrcpy(buffer+length,"\tEnd Sub\n");
179 length+=lstrlen(buffer+length);
180
181 for(i2=0;i2<parent->iEnumMemberNum;i2++){
182 CEnumMember *member;
183 member=parent->ppobj_EnumMember[i2];
184
185 sprintf(buffer+length,"\tStatic %s As %s(%d)\n",
186 member->m_name,
187 parent->TypeName,
188 member->m_value);
189 length+=lstrlen(buffer+length);
190 }
191
192 sprintf(buffer+length,"\tOverride Function ToString() As String\n",parent->TypeName);
193 length+=lstrlen(buffer+length);
194 lstrcpy(buffer+length,"\t\tSelect Case m_Value\n");
195 length+=lstrlen(buffer+length);
196 for(i2=0;i2<parent->iEnumMemberNum;i2++){
197 CEnumMember *member;
198 member=parent->ppobj_EnumMember[i2];
199
200 sprintf(buffer+length,"\t\t\tCase %d\n",member->m_value);
201 length+=lstrlen(buffer+length);
202 sprintf(buffer+length,"\t\t\t\tReturn \"%s\"\n",member->m_name);
203 length+=lstrlen(buffer+length);
204 }
205 lstrcpy(buffer+length,"\t\tEnd Select\n");
206 length+=lstrlen(buffer+length);
207 lstrcpy(buffer+length,"\tEnd Function\n");
208 length+=lstrlen(buffer+length);
209
210 sprintf(buffer+length,"\tSub Operator= (ByRef value As %s)\n",parent->TypeName);
211 length+=lstrlen(buffer+length);
212 lstrcpy(buffer+length,"\t\tThis.Copy(ByVal VarPtr(value))\n");
213 length+=lstrlen(buffer+length);
214 lstrcpy(buffer+length,"\tEnd Sub\n");
215 length+=lstrlen(buffer+length);
216
217 /*sprintf(buffer+length,"\tSub Operator= (ByRef value As String)\n",parent->TypeName);
218 length+=lstrlen(buffer+length);
219 lstrcpy(buffer+length,"\t\tSelect Case value\n");
220 length+=lstrlen(buffer+length);
221 for(i2=0;i2<parent->iEnumMemberNum;i2++){
222 CEnumMember *member;
223 member=parent->ppobj_EnumMember[i2];
224
225 sprintf(buffer+length,"\t\t\tCase \"%s\"\n",member->m_name);
226 length+=lstrlen(buffer+length);
227 sprintf(buffer+length,"\t\t\t\tThis=%s.%s\n",parent->TypeName,member->m_name);
228 length+=lstrlen(buffer+length);
229 }
230 lstrcpy(buffer+length,"\t\tEnd Select\n");
231 length+=lstrlen(buffer+length);
232 lstrcpy(buffer+length,"\tEnd Sub\n");
233 length+=lstrlen(buffer+length);*/
234
235 sprintf(buffer+length,"\tSub Operator= (value As Long)\n",parent->TypeName);
236 length+=lstrlen(buffer+length);
237 lstrcpy(buffer+length,"\t\tm_Value=value\n");
238 length+=lstrlen(buffer+length);
239 lstrcpy(buffer+length,"\tEnd Sub\n");
240 length+=lstrlen(buffer+length);
241
242 sprintf(buffer+length,"\tFunction Operator== (ByRef e As %s) As Boolean\n",parent->TypeName);
243 length+=lstrlen(buffer+length);
244 lstrcpy(buffer+length,"\t\tReturn ( e.m_Value = m_Value )\n");
245 length+=lstrlen(buffer+length);
246 lstrcpy(buffer+length,"\tEnd Function\n");
247 length+=lstrlen(buffer+length);
248
249 lstrcpy(buffer+length,"End Class\n");
250 length+=lstrlen(buffer+length);
251
252
253 //バッファ領域が足りなくなった場合はバッファを増量する
254 if(length>MaxSize){
255 MaxSize+=65535;
256 buffer=(char *)HeapReAlloc(hHeap,0,buffer,MaxSize+65535);
257 }
258 }
259
260 return buffer;
261}
Note: See TracBrowser for help on using the repository browser.