#include "common.h" // インデント関連 int IsIndentAdditionCommand_FromBuffer(char *buffer); int IsIndentDecreaseCommand_FromBuffer(char *buffer); char *CodeFormatter(char *lpszReadBuffer){ int WndNum; WndNum=GetNowWndNum(); if(MdiInfo[WndNum].DocType!=WNDTYPE_BASIC){ goto NonFormater; } char *lpszTempReadBuffer; lpszTempReadBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+1); lstrcpy(lpszTempReadBuffer,lpszReadBuffer); //CRLFをLFに変換 ChangeReturnCode(lpszTempReadBuffer); DeleteComment(lpszTempReadBuffer); //カッコの相互関係をチェック if(!CheckParenthesis(lpszTempReadBuffer)){ HeapDefaultFree(lpszTempReadBuffer); goto NonFormater; } //////////////////////////////////// // インデントの初期TAB文字数を取得 //////////////////////////////////// char *pBuf; pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer; //カーソルバッファ位置を取得 int i,i2; i=GetBufferIndexFromCaretPos(pBuf, MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x, MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y); int StartX=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x; //現在の行のインデントをコピー(iFirstIndent_Speciallyにタブ数を格納) int iFirstIndent_Specially=0; for(i2=i;i2>0;i2--){ if(pBuf[i2-1]=='\r'&&pBuf[i2]=='\n'){ i=i2-1; i2++; int x=0; while(pBuf[i2]=='\t'&&x0;i--){ if( pBuf[i-1]=='\r'&&pBuf[i]=='\n'&& (!(pBuf[i+1]=='\r'&&pBuf[i+2]=='\n')) ){ i++; break; } } int iIndent; for(iIndent=0;;iIndent++){ if(pBuf[i+iIndent]!='\t') break; } if(MdiInfo[WndNum].DocType==WNDTYPE_BASIC){ //インデント追加のコマンドかどうかを判断 if(IsIndentAdditionCommand_FromBuffer(pBuf+i+iIndent)) iIndent++; } ////////////////////////////// // 各行のTAB文字数を計算 ////////////////////////////// int *pTabs,LineCount=0; pTabs=(int *)HeapAlloc(hHeap,0,(lstrlen(lpszTempReadBuffer)+1)*sizeof(int)); char *pTemp; pTemp=(char *)HeapAlloc(hHeap,0,lstrlen(lpszTempReadBuffer)+1); i=0; BOOL bInterface=0; while(1){ while(lpszTempReadBuffer[i]=='\t'||lpszTempReadBuffer[i]==' ') i++; int PareNum,BracketNum; PareNum=0,BracketNum=0; pTabs[LineCount]=0; int MultiLine=0; for(i2=0;;i++,i2++){ if(lpszTempReadBuffer[i-1]=='('||lpszTempReadBuffer[i-1]=='[') PareNum++; else if(lpszTempReadBuffer[i-1]==')'||lpszTempReadBuffer[i-1]==']') PareNum--; if(lpszTempReadBuffer[i]=='\n'||lpszTempReadBuffer[i]=='\0'){ if((lpszTempReadBuffer[i-1]=='('||lpszTempReadBuffer[i-1]==',')&&lpszTempReadBuffer[i]){ //パラメータ改行 i++; MultiLine++; pTabs[LineCount+MultiLine]=PareNum; while(lpszTempReadBuffer[i]=='\n'){ i++; MultiLine++; pTabs[LineCount+MultiLine]=PareNum; } continue; } if(lpszTempReadBuffer[i-1]=='_'&&lpszTempReadBuffer[i]){ //任意改行 i++; i2--; MultiLine++; pTabs[LineCount+MultiLine]=1; continue; } pTemp[i2]=0; break; } pTemp[i2]=lpszTempReadBuffer[i]; } //インデント減少コマンドかどうかを判定 int f; if(f=IsIndentDecreaseCommand_FromBuffer(pTemp)){ if(iIndent>0) iIndent--; if(f==2){ if(iIndent>0) iIndent--; } if(f==3) bInterface=0; } if(iFirstIndent_Specially!=-1){ if(iIndent-iFirstIndent_Specially<0) iFirstIndent_Specially=iIndent; pTabs[LineCount]+=iIndent-iFirstIndent_Specially; iFirstIndent_Specially=-1; } else pTabs[LineCount]+=iIndent; LineCount++; while(MultiLine){ pTabs[LineCount]+=iIndent; LineCount++; MultiLine--; } //インデント増加コマンドかどうかを判定 if((f=IsIndentAdditionCommand_FromBuffer(pTemp))&&bInterface==0){ iIndent++; if(f==2) iIndent++; if(f==3) bInterface=1; } if(lpszTempReadBuffer[i]=='\0') break; i++; } ////////////////////////// // インデント整形 ////////////////////////// char *lpszNewBuffer,temp2[1024]; lpszNewBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+8192); lpszNewBuffer[0]=0; i=0; bInterface=0; LineCount=0; while(1){ while(lpszReadBuffer[i]=='\t'||lpszReadBuffer[i]==' ') i++; for(i2=0;;i++,i2++){ if(IS_RETURN(lpszReadBuffer,i)||lpszReadBuffer[i]=='\0'){ pTemp[i2]=0; break; } pTemp[i2]=lpszReadBuffer[i]; } memset(temp2,'\t',pTabs[LineCount]); temp2[pTabs[LineCount]]=0; LineCount++; lstrcat(lpszNewBuffer,temp2); lstrcat(lpszNewBuffer,pTemp); if(lpszReadBuffer[i]=='\0') break; i+=2; lstrcat(lpszNewBuffer,"\r\n"); } HeapDefaultFree(pTemp); HeapDefaultFree(lpszTempReadBuffer); HeapDefaultFree(pTabs); return lpszNewBuffer; NonFormater: //インデント整形は行わない lpszNewBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+1); lstrcpy(lpszNewBuffer,lpszReadBuffer); return lpszNewBuffer; }