source: dev/trunk/ab5.0/abdev/abdev/EndPairCommandComplement.cpp@ 681

Last change on this file since 681 was 475, checked in by dai_9181, 16 years ago

構成管理を変更中・・・(いったんコミット)

File size: 12.2 KB
Line 
1#include "stdafx.h"
2
3#include "common.h"
4
5///////////////////////////////////////////////////////////////////
6// ここから、ペアステートメント補完を行うための関数郡
7///////////////////////////////////////////////////////////////////
8
9int GetStartCommandId_FromBuffer(char *buffer){
10 int i;
11 char temporary[VN_SIZE];
12
13 for(i=0;;i++){
14 if(!IsVariableChar(buffer[i])){
15 temporary[i]=0;
16 break;
17 }
18 temporary[i]=buffer[i];
19 }
20
21 if(lstrcmpi(temporary,"If")==0){
22 //If文の場合はブロック形式の有無を判定
23
24 int IsStr=0;
25 for(;;i++){
26 if(buffer[i]=='\"') IsStr^=1;
27 if((buffer[i]=='\''||IsCommandDelimitation(buffer,i))&&IsStr==0){
28 i--;
29 break;
30 }
31 }
32
33 while(buffer[i]==' '||buffer[i]=='\t') i--;
34
35 if(memicmp(buffer+i-3,"Then",4)==0){
36 //ブロック形式のIf
37 return COM_IF;
38 }
39 else{
40 //一行のみのIf
41 return 0;
42 }
43 }
44
45 if(lstrcmpi(temporary,"Virtual")==0||
46 lstrcmpi(temporary,"Override")==0||
47 lstrcmpi(temporary,"Static")==0){
48 if(temporary[0]=='s'||temporary[0]=='S')
49 i=7;
50 else if(temporary[0]=='v'||temporary[0]=='V')
51 i=8;
52 else i=9;
53
54 while(buffer[i]==' '||buffer[i]=='\t') i++;
55
56 int i2;
57 for(i2=0;;i++,i2++){
58 if(!IsVariableChar(buffer[i])){
59 temporary[i2]=0;
60 break;
61 }
62 temporary[i2]=buffer[i];
63 }
64
65 if(lstrcmpi(temporary,"Function")==0) return COM_FUNCTION;
66 if(lstrcmpi(temporary,"Sub")==0) return COM_SUB;
67 return 0;
68 }
69
70 if(lstrcmpi(temporary,"Class")==0) return COM_CLASS;
71 if(lstrcmpi(temporary,"Interface")==0) return COM_INTERFACE;
72 if(lstrcmpi(temporary,"Do")==0) return COM_DO;
73 if(lstrcmpi(temporary,"Enum")==0) return COM_ENUM;
74 if(lstrcmpi(temporary,"For")==0) return COM_FOR;
75 if(lstrcmpi(temporary,"Foreach")==0) return COM_FOR;
76 if(lstrcmpi(temporary,"Function")==0) return COM_FUNCTION;
77 if(lstrcmpi(temporary,"Namespace")==0) return COM_NAMESPACE;
78 if(lstrcmpi(temporary,"Select")==0) return COM_SELECT;
79 if(lstrcmpi(temporary,"Sub")==0) return COM_SUB;
80 if(lstrcmpi(temporary,"Try")==0) return COM_TRY;
81 if(lstrcmpi(temporary,"Type")==0) return COM_TYPE;
82 if(lstrcmpi(temporary,"While")==0) return COM_WHILE;
83 if(lstrcmpi(temporary,"With")==0) return COM_WITH;
84
85 return 0;
86}
87int GetEndCommandId_FromBuffer(char *buffer){
88 int i,i2;
89 char temporary[VN_SIZE];
90
91 for(i=0,i2=0;;i++,i2++){
92 if(!IsVariableChar(buffer[i])){
93 temporary[i2]=0;
94
95 if(lstrcmpi(temporary,"End")==0&&
96 (buffer[i]==' '||buffer[i]=='\t')){
97 while(buffer[i]==' '||buffer[i]=='\t') i++;
98 i--;
99 i2--;
100 continue;
101 }
102
103 break;
104 }
105 temporary[i2]=buffer[i];
106 }
107
108 if(lstrcmpi(temporary,"EndClass")==0) return COM_CLASS;
109 if(lstrcmpi(temporary,"EndInterface")==0) return COM_INTERFACE;
110 if(lstrcmpi(temporary,"Loop")==0) return COM_DO;
111 if(lstrcmpi(temporary,"EndEnum")==0) return COM_ENUM;
112 if(lstrcmpi(temporary,"Next")==0) return COM_FOR;
113 if(lstrcmpi(temporary,"EndFunction")==0) return COM_FUNCTION;
114 if(lstrcmpi(temporary,"EndIf")==0) return COM_IF;
115 if(lstrcmpi(temporary,"EndNamespace")==0) return COM_NAMESPACE;
116 if(lstrcmpi(temporary,"EndSelect")==0) return COM_SELECT;
117 if(lstrcmpi(temporary,"EndSub")==0) return COM_SUB;
118 if(lstrcmpi(temporary,"EndTry")==0) return COM_TRY;
119 if(lstrcmpi(temporary,"EndType")==0) return COM_TYPE;
120 if(lstrcmpi(temporary,"Wend")==0) return COM_WHILE;
121 if(lstrcmpi(temporary,"EndWith")==0) return COM_WITH;
122
123 return 0;
124}
125void GetNameOfEndCommand(int CmdId,char *buffer){
126 switch(CmdId){
127 case COM_CLASS:
128 lstrcpy(buffer,"End Class");
129 break;
130 case COM_INTERFACE:
131 lstrcpy(buffer,"End Interface");
132 break;
133 case COM_DO:
134 lstrcpy(buffer,"Loop");
135 break;
136 case COM_ENUM:
137 lstrcpy(buffer,"End Enum");
138 break;
139 case COM_FOR:
140 lstrcpy(buffer,"Next");
141 break;
142 case COM_FUNCTION:
143 lstrcpy(buffer,"End Function");
144 break;
145 case COM_IF:
146 lstrcpy(buffer,"End If");
147 break;
148 case COM_NAMESPACE:
149 lstrcpy(buffer,"End Namespace");
150 break;
151 case COM_SELECT:
152 lstrcpy(buffer,"End Select");
153 break;
154 case COM_SUB:
155 lstrcpy(buffer,"End Sub");
156 break;
157 case COM_TRY:
158 lstrcpy(buffer,"End Try");
159 break;
160 case COM_TYPE:
161 lstrcpy(buffer,"End Type");
162 break;
163 case COM_WHILE:
164 lstrcpy(buffer,"Wend");
165 break;
166 case COM_WITH:
167 lstrcpy(buffer,"End With");
168 break;
169 }
170}
171BOOL IsIntoStringQuotes(char *buffer,int i){
172 int i2;
173
174 i2=i;
175 while(i2&&buffer[i2]!='\n') i2--;
176 if(i2==-1) i2=0;
177 if(buffer[i2]=='\n') i2++;
178
179 int IsStr=0;
180 for(;i2<i;i2++){
181 if(buffer[i2]=='\"') IsStr^=1;
182 }
183 return IsStr;
184}
185BOOL GetEndPairCommandInfo(char *buffer,int p){
186 int i,i2,i3,CmdId;
187 char epcName[32];
188 char indent[255],LineNum;
189
190 int stack[255];
191 int sp;
192
193 CmdId=0;
194 LineNum=0;
195 sp=-1;
196
197 i=p;
198
199 //入力中の行を除く
200 for(i--;i>=0;i--){
201 i2=IsCommandDelimitation(buffer,i);
202 if(i2) break;
203 }
204
205 while(1){
206
207 //i2に一行前の先頭位置を格納
208 for(i--;i>=0;i--){
209 i2=IsCommandDelimitation(buffer,i);
210 if(i2){
211 if(IsIntoStringQuotes(buffer,i)){
212 //文字列中の場合
213 continue;
214 }
215
216 if(i2==1) i2=i+1;
217 else{
218 i2=i+2;
219 LineNum++;
220
221 if(LineNum>pobj_nv->BackNum_PairStatementComplement){
222 //設定された行数を超えた場合
223 return 0;
224 }
225 }
226
227 break;
228 }
229 }
230 if(i==-1) i2=i+1;
231
232 //インデント文字列をindentにコピー
233 for(i3=0;;i2++,i3++){
234 if(buffer[i2]!='\t'){
235 indent[i3]=0;
236 break;
237 }
238 indent[i3]=buffer[i2];
239 }
240
241 //空白文字を飛び越す
242 while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
243
244 //終了コマンドを取得(End Class、End Sub、Next、Wendなど…)
245 i3=GetEndCommandId_FromBuffer(buffer+i2);
246 if(i3){
247 sp++;
248 stack[sp]=i3;
249 }
250
251 //開始コマンドを取得(Class、Sub、For、Whileなど…)
252 i3=GetStartCommandId_FromBuffer(buffer+i2);
253 if(i3){
254 if(sp==-1){
255 CmdId=i3;
256 break;
257 }
258
259 if(stack[sp]!=i3) return 0;
260 sp--;
261 }
262
263 if(i<=0) break;
264 }
265
266 if(!CmdId) return 0;
267
268 extern HANDLE hHeap;
269 extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
270 if(CmdId==COM_IF){
271 //Else、ElseIf、End Ifをリストに追加
272
273 ///////////////////////
274 // 補完情報
275 ///////////////////////
276
277 ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*2);
278 ComplementWndInfo.MemberNum=2;
279
280 ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,5);
281 lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"Else");
282 ComplementWndInfo.pMemberInfo[0].dwProc=0;
283 ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
284
285 ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,7);
286 lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"End If");
287 ComplementWndInfo.pMemberInfo[1].dwProc=0;
288 ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
289 }
290 else if(CmdId==COM_CLASS){
291 ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
292 ComplementWndInfo.MemberNum=4;
293
294 ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
295 lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Class");
296 ComplementWndInfo.pMemberInfo[0].dwProc=0;
297 ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
298
299 ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,8);
300 lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Private");
301 ComplementWndInfo.pMemberInfo[1].dwProc=0;
302 ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
303
304 ComplementWndInfo.pMemberInfo[2].pName=(char *)HeapAlloc(hHeap,0,10);
305 lstrcpy(ComplementWndInfo.pMemberInfo[2].pName,"Protected");
306 ComplementWndInfo.pMemberInfo[2].dwProc=0;
307 ComplementWndInfo.pMemberInfo[2].dwAccess=ACCESS_PAIRCOMMAND;
308
309 ComplementWndInfo.pMemberInfo[3].pName=(char *)HeapAlloc(hHeap,0,7);
310 lstrcpy(ComplementWndInfo.pMemberInfo[3].pName,"Public");
311 ComplementWndInfo.pMemberInfo[3].dwProc=0;
312 ComplementWndInfo.pMemberInfo[3].dwAccess=ACCESS_PAIRCOMMAND;
313 }
314 else if(CmdId==COM_SELECT){
315 ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
316 ComplementWndInfo.MemberNum=2;
317
318 ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
319 lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Select");
320 ComplementWndInfo.pMemberInfo[0].dwProc=0;
321 ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
322
323 ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,8);
324 lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Case");
325 ComplementWndInfo.pMemberInfo[1].dwProc=0;
326 ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
327 }
328 else if(CmdId==COM_TRY){
329 ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
330 ComplementWndInfo.MemberNum=3;
331
332 ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
333 lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Try");
334 ComplementWndInfo.pMemberInfo[0].dwProc=0;
335 ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
336
337 ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,10);
338 lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Catch");
339 ComplementWndInfo.pMemberInfo[1].dwProc=0;
340 ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
341
342 ComplementWndInfo.pMemberInfo[2].pName=(char *)HeapAlloc(hHeap,0,8);
343 lstrcpy(ComplementWndInfo.pMemberInfo[2].pName,"Finally");
344 ComplementWndInfo.pMemberInfo[2].dwProc=0;
345 ComplementWndInfo.pMemberInfo[2].dwAccess=ACCESS_PAIRCOMMAND;
346 }
347 else{
348 //その他のコマンド
349
350 //エンドペアステートメントの名前を取得
351 GetNameOfEndCommand(CmdId,epcName);
352
353
354 ///////////////////////
355 // 補完情報
356 ///////////////////////
357
358 ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO));
359 ComplementWndInfo.MemberNum=1;
360
361 ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,lstrlen(epcName)+1);
362 lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,epcName);
363
364 ComplementWndInfo.pMemberInfo[0].dwProc=0;
365 ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
366 }
367 lstrcpy(ComplementWndInfo.szIndent,indent);
368
369
370 return 1;
371}
372BOOL IsNeedNewIndentCommand(char *name){
373 if(lstrcmpi(name,"Case")==0) return 1;
374 return 0;
375}
376
377
378
379///////////////////////////////////////////////
380// Withで構成されるオブジェクト識別子を取得
381///////////////////////////////////////////////
382
383void GetWithObjectVariable(char *buffer,int p,char *pObjectVar){
384 int i,i2,i3,i4,CmdId;
385 char LineNum;
386 char temporary[VN_SIZE];
387
388 int stack[255];
389 int sp;
390
391 CmdId=0;
392 LineNum=0;
393 sp=-1;
394 pObjectVar[0]=0;
395
396 i=p;
397
398 //入力中の行を除く
399 for(i--;i>=0;i--){
400 i2=IsCommandDelimitation(buffer,i);
401 if(i2) break;
402 }
403
404 while(1){
405
406 //i2に一行前の先頭位置を格納
407 for(i--;i>=0;i--){
408 i2=IsCommandDelimitation(buffer,i);
409 if(i2){
410 if(i2==1) i2=i+1;
411 else{
412 i2=i+2;
413 LineNum++;
414
415 if(LineNum>pobj_nv->BackNum_PairStatementComplement){
416 //設定された行数を超えた場合
417 return;
418 }
419 }
420
421 break;
422 }
423 }
424 if(i==-1) i2=i+1;
425
426 //インデントを飛び越す
427 while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
428
429 //終了コマンドを取得(End Class、End Sub、Next、Wendなど…)
430 CmdId=GetEndCommandId_FromBuffer(buffer+i2);
431 if(CmdId){
432 sp++;
433 stack[sp]=CmdId;
434 }
435
436 //開始コマンドを取得(Class、Sub、For、Whileなど…)
437 CmdId=GetStartCommandId_FromBuffer(buffer+i2);
438 if(CmdId){
439 if(sp==-1){
440 if(CmdId==COM_WITH){
441 //オブジェクト識別子を付加
442 i2+=5;
443 while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
444
445 for(i3=0;;i2++,i3++){
446 if(buffer[i2]=='-'&&buffer[i2+1]=='>'){
447 temporary[i3++]=buffer[i2++];
448 temporary[i3]=buffer[i2];
449 continue;
450 }
451 if(buffer[i2]=='['){
452 i4=GetStringInBracket(temporary+i3,buffer+i2);
453 i2+=i4-1;
454 i3+=i4-1;
455 continue;
456 }
457 if(buffer[i2]=='('){
458 i4=GetStringInPare(temporary+i3,buffer+i2);
459 i2+=i4-1;
460 i3+=i4-1;
461 continue;
462 }
463 if(!(IsVariableChar(buffer[i2])||buffer[i2]=='.')){
464 temporary[i3]=0;
465 break;
466 }
467 temporary[i3]=buffer[i2];
468 }
469 lstrcat(temporary,pObjectVar);
470 lstrcpy(pObjectVar,temporary);
471 }
472 }
473 else{
474 if(stack[sp]!=CmdId){
475 pObjectVar[0]=0;
476 break;
477 }
478 sp--;
479 }
480 }
481
482 if(i<=0) break;
483 }
484}
Note: See TracBrowser for help on using the repository browser.