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

Last change on this file since 829 was 829, checked in by イグトランス (egtra), 12 years ago

svn:eol-styleとsvn:mime-type(文字コード指定含む)の設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/plain; charset=Shift_JIS
File size: 4.8 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.