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

Last change on this file since 475 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.