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

Last change on this file since 681 was 629, checked in by dai_9181, 15 years ago

MDIINFO構造体をリファクタリング。

File size: 5.1 KB
Line 
1#include "stdafx.h"
2
3#include "common.h"
4
5// インデント関連
6
7int IsIndentAdditionCommand_FromBuffer(char *buffer);
8int IsIndentDecreaseCommand_FromBuffer(char *buffer);
9
10char *CodeFormatter(char *lpszReadBuffer){
11    int WndNum;
12    WndNum=GetNowWndNum();
13
14    if(MdiInfo[WndNum]->DocType!=WNDTYPE_BASIC){
15        goto NonFormater;
16    }
17
18    char *lpszTempReadBuffer;
19    lpszTempReadBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+1);
20    lstrcpy(lpszTempReadBuffer,lpszReadBuffer);
21
22    //CRLFをLFに変換
23    ChangeReturnCode(lpszTempReadBuffer);
24
25    DeleteComment(lpszTempReadBuffer);
26
27    //カッコの相互関係をチェック
28    if(!CheckParenthesis(lpszTempReadBuffer)){
29        HeapDefaultFree(lpszTempReadBuffer);
30        goto NonFormater;
31    }
32
33
34
35    ////////////////////////////////////
36    // インデントの初期TAB文字数を取得
37    ////////////////////////////////////
38
39    char *pBuf;
40    pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
41
42    //カーソルバッファ位置を取得
43    int i,i2;
44    i=GetBufferIndexFromCaretPos(pBuf,
45        MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
46        MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
47    int StartX=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x;
48
49    //現在の行のインデントをコピー(iFirstIndent_Speciallyにタブ数を格納)
50    int iFirstIndent_Specially=0;
51    for(i2=i;i2>0;i2--){
52        if(pBuf[i2-1]=='\r'&&pBuf[i2]=='\n'){
53
54            i=i2-1;
55
56            i2++;
57
58            int x=0;
59            while(pBuf[i2]=='\t'&&x<StartX){
60                i2++;
61                x++;
62                iFirstIndent_Specially++;
63            }
64
65            break;
66        }
67    }
68
69    //前の行のインデントをコピー(iIndentにタブ数を格納)
70    for(;i>0;i--){
71        if(
72            pBuf[i-1]=='\r'&&pBuf[i]=='\n'&&
73            (!(pBuf[i+1]=='\r'&&pBuf[i+2]=='\n'))
74            ){
75            i++;
76            break;
77        }
78    }
79
80    int iIndent;
81    for(iIndent=0;;iIndent++){
82        if(pBuf[i+iIndent]!='\t') break;
83    }
84
85    if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC){
86        //インデント追加のコマンドかどうかを判断
87        if(IsIndentAdditionCommand_FromBuffer(pBuf+i+iIndent)) iIndent++;
88    }
89
90
91
92    //////////////////////////////
93    // 各行のTAB文字数を計算
94    //////////////////////////////
95
96    int *pTabs,LineCount=0;
97    pTabs=(int *)HeapAlloc(hHeap,0,(lstrlen(lpszTempReadBuffer)+1)*sizeof(int));
98
99    char *pTemp;
100    pTemp=(char *)HeapAlloc(hHeap,0,lstrlen(lpszTempReadBuffer)+1);
101
102    i=0;
103    BOOL bInterface=0;
104    while(1){
105        while(lpszTempReadBuffer[i]=='\t'||lpszTempReadBuffer[i]==' ') i++;
106
107        int PareNum,BracketNum;
108        PareNum=0,BracketNum=0;
109
110        pTabs[LineCount]=0;
111
112        int MultiLine=0;
113        for(i2=0;;i++,i2++){
114
115            if(lpszTempReadBuffer[i-1]=='('||lpszTempReadBuffer[i-1]=='[') PareNum++;
116            else if(lpszTempReadBuffer[i-1]==')'||lpszTempReadBuffer[i-1]==']') PareNum--;
117
118            if(lpszTempReadBuffer[i]=='\n'||lpszTempReadBuffer[i]=='\0'){
119                if((lpszTempReadBuffer[i-1]=='('||lpszTempReadBuffer[i-1]==',')&&lpszTempReadBuffer[i]){
120                    //パラメータ改行
121
122                    i++;
123                    MultiLine++;
124
125                    pTabs[LineCount+MultiLine]=PareNum;
126
127                    while(lpszTempReadBuffer[i]=='\n'){
128                        i++;
129                        MultiLine++;
130
131                        pTabs[LineCount+MultiLine]=PareNum;
132                    }
133                    continue;
134                }
135                if(lpszTempReadBuffer[i-1]=='_'&&lpszTempReadBuffer[i]){
136                    //任意改行
137                    i++;
138                    i2--;
139
140                    MultiLine++;
141
142                    pTabs[LineCount+MultiLine]=1;
143                    continue;
144                }
145
146                pTemp[i2]=0;
147                break;
148            }
149            pTemp[i2]=lpszTempReadBuffer[i];
150        }
151
152
153        //インデント減少コマンドかどうかを判定
154        int f;
155        if(f=IsIndentDecreaseCommand_FromBuffer(pTemp)){
156            if(iIndent>0) iIndent--;
157            if(f==2){
158                if(iIndent>0) iIndent--;
159            }
160
161            if(f==3) bInterface=0;
162        }
163
164        if(iFirstIndent_Specially!=-1){
165            if(iIndent-iFirstIndent_Specially<0) iFirstIndent_Specially=iIndent;
166
167            pTabs[LineCount]+=iIndent-iFirstIndent_Specially;
168
169            iFirstIndent_Specially=-1;
170        }
171        else pTabs[LineCount]+=iIndent;
172        LineCount++;
173
174        while(MultiLine){
175            pTabs[LineCount]+=iIndent;
176            LineCount++;
177
178            MultiLine--;
179        }
180
181
182
183        //インデント増加コマンドかどうかを判定
184        if((f=IsIndentAdditionCommand_FromBuffer(pTemp))&&bInterface==0){
185            iIndent++;
186            if(f==2) iIndent++;
187
188            if(f==3) bInterface=1;
189        }
190
191
192        if(lpszTempReadBuffer[i]=='\0') break;
193        i++;
194    }
195
196
197
198    //////////////////////////
199    // インデント整形
200    //////////////////////////
201
202    char *lpszNewBuffer,temp2[1024];
203    lpszNewBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+8192);
204    lpszNewBuffer[0]=0;
205
206    i=0;
207    bInterface=0;
208    LineCount=0;
209    while(1){
210        while(lpszReadBuffer[i]=='\t'||lpszReadBuffer[i]==' ') i++;
211
212        for(i2=0;;i++,i2++){
213
214            if(IS_RETURN(lpszReadBuffer,i)||lpszReadBuffer[i]=='\0'){
215                pTemp[i2]=0;
216                break;
217            }
218            pTemp[i2]=lpszReadBuffer[i];
219        }
220
221
222        memset(temp2,'\t',pTabs[LineCount]);
223        temp2[pTabs[LineCount]]=0;
224        LineCount++;
225
226        lstrcat(lpszNewBuffer,temp2);
227        lstrcat(lpszNewBuffer,pTemp);
228
229
230
231        if(lpszReadBuffer[i]=='\0') break;
232        i+=2;
233
234        lstrcat(lpszNewBuffer,"\r\n");
235    }
236
237    HeapDefaultFree(pTemp);
238    HeapDefaultFree(lpszTempReadBuffer);
239
240    HeapDefaultFree(pTabs);
241
242    return lpszNewBuffer;
243
244
245
246NonFormater:
247    //インデント整形は行わない
248    lpszNewBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+1);
249    lstrcpy(lpszNewBuffer,lpszReadBuffer);
250    return lpszNewBuffer;
251}
Note: See TracBrowser for help on using the repository browser.