📄 ceditdoc_new.cpp
字号:
// $Id: CEditDoc_new.cpp,v 1.31 2005/01/30 16:27:50 Administrator Exp $
/*! @file
文書関連情報の管理
@author Norio Nakatani
$Revision: 1.31 $
@date aroka 警告対策で変数除去
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2001, Stonee, Miasaka, hor
Copyright (C) 2002, hor, genta, aroka
Copyright (C) 2003, MIK
This source code is designed for sakura editor.
Please contact the copyright holder to use this code for other purpose.
*/
#include "CEditDoc.h"
#include "charcode.h"
#include "CFuncInfoArr.h"// 2002/2/10 aroka
#include "CDocLine.h"// 2002/2/10 aroka
#include "CEditWnd.h"
#include "Debug.h"
#include "etc_uty.h"
#include "my_icmp.h" // Nov. 29, 2002 genta/moca
#include "mymessage.h" // Oct. 9, 2004 genta
#include "CEditApp.h" // Oct. 9, 2004 genta
/* Java関数リスト作成 */
void CEditDoc::MakeFuncList_Java( CFuncInfoArr* pcFuncInfoArr )
{
const char* pLine;
int nLineLen;
int nLineCount;
int i;
int nNestLevel;
int nCharChars;
char szWordPrev[100];
char szWord[100];
int nWordIdx = 0;
int nMaxWordLeng = 70;
int nMode;
char szFuncName[80];
int nFuncLine = 0;
int nFuncId;
int nFuncNum;
char szClass[1024];
int nClassNestArr[16];
int nClassNestArrNum;
int nNestLevel2Arr[16];
nNestLevel = 0;
szWordPrev[0] = '\0';
szWord[nWordIdx] = '\0';
nMode = 0;
nNestLevel2Arr[0] = 0;
nFuncNum = 0;
szClass[0] = '\0';
nClassNestArrNum = 0;
for( nLineCount = 0; nLineCount < m_cDocLineMgr.GetLineCount(); ++nLineCount ){
pLine = m_cDocLineMgr.GetLineStr( nLineCount, &nLineLen );
for( i = 0; i < nLineLen; ++i ){
/* 1バイト文字だけを処理する */
nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[i] ) - &pLine[i];
if( 1 < nCharChars ){
i += (nCharChars - 1);
continue;
}
/* エスケープシーケンスは常に取り除く */
if( '\\' == pLine[i] ){
++i;
}else
/* シングルクォーテーション文字列読み込み中 */
if( 20 == nMode ){
if( '\'' == pLine[i] ){
nMode = 0;
continue;
}else{
}
}else
/* ダブルクォーテーション文字列読み込み中 */
if( 21 == nMode ){
if( '"' == pLine[i] ){
nMode = 0;
continue;
}else{
}
}else
/* コメント読み込み中 */
if( 8 == nMode ){
if( i < nLineLen - 1 && '*' == pLine[i] && '/' == pLine[i + 1] ){
++i;
nMode = 0;
continue;
}else{
}
}else
/* 単語読み込み中 */
if( 1 == nMode ){
if( '_' == pLine[i] ||
':' == pLine[i] ||
'~' == pLine[i] ||
('a' <= pLine[i] && pLine[i] <= 'z' )||
('A' <= pLine[i] && pLine[i] <= 'Z' )||
('0' <= pLine[i] && pLine[i] <= '9' )||
'.' == pLine[i]
){
++nWordIdx;
if( nWordIdx >= nMaxWordLeng ){
nMode = 999;
continue;
}else{
szWord[nWordIdx] = pLine[i];
szWord[nWordIdx + 1] = '\0';
}
}else{
/* クラス宣言部分を見つけた */
// Oct. 10, 2002 genta interfaceも対象に
if( 0 == strcmp( "class", szWordPrev ) ||
0 == strcmp( "interface", szWordPrev )
){
nClassNestArr[nClassNestArrNum] = nNestLevel;
++nClassNestArrNum;
if( 0 < nNestLevel ){
strcat( szClass, "\\" );
}
strcat( szClass, szWord );
nFuncId = 0;
++nFuncNum;
/*
カーソル位置変換
物理位置(行頭からのバイト数、折り返し無し行位置)
→
レイアウト位置(行頭からの表示桁位置、折り返しあり行位置)
*/
int nPosX;
int nPosY;
m_cLayoutMgr.CaretPos_Phys2Log(
0,
nLineCount/*nFuncLine - 1*/,
&nPosX,
&nPosY
);
char szWork[256];
wsprintf( szWork, "%s::%s", szClass, "定義位置" );
pcFuncInfoArr->AppendData( nPosY + 1/*nFuncLine*/, nPosY + 1, szWork, nFuncId );
}
// strcpy( szWordPrev, szWord );
// nWordIdx = 0;
// szWord[0] = '\0';
nMode = 0;
i--;
continue;
}
}else
/* 記号列読み込み中 */
if( 2 == nMode ){
if( '_' == pLine[i] ||
':' == pLine[i] ||
'~' == pLine[i] ||
('a' <= pLine[i] && pLine[i] <= 'z' )||
('A' <= pLine[i] && pLine[i] <= 'Z' )||
('0' <= pLine[i] && pLine[i] <= '9' )||
'\t' == pLine[i] ||
' ' == pLine[i] ||
CR == pLine[i] ||
LF == pLine[i] ||
'{' == pLine[i] ||
'}' == pLine[i] ||
'(' == pLine[i] ||
')' == pLine[i] ||
';' == pLine[i] ||
'\'' == pLine[i] ||
'"' == pLine[i] ||
'/' == pLine[i] ||
'.' == pLine[i]
){
nMode = 0;
i--;
continue;
}else{
}
}else
/* 長過ぎる単語無視中 */
if( 999 == nMode ){
/* 空白やタブ記号等を飛ばす */
if( '\t' == pLine[i] ||
' ' == pLine[i] ||
CR == pLine[i] ||
LF == pLine[i]
){
nMode = 0;
continue;
}
}else
/* ノーマルモード */
if( 0 == nMode ){
/* 空白やタブ記号等を飛ばす */
if( '\t' == pLine[i] ||
' ' == pLine[i] ||
CR == pLine[i] ||
LF == pLine[i]
){
continue;
}else
if( i < nLineLen - 1 && '/' == pLine[i] && '/' == pLine[i + 1] ){
break;
}else
if( i < nLineLen - 1 && '/' == pLine[i] && '*' == pLine[i + 1] ){
++i;
nMode = 8;
continue;
}else
if( '\'' == pLine[i] ){
nMode = 20;
continue;
}else
if( '"' == pLine[i] ){
nMode = 21;
continue;
}else
if( '{' == pLine[i] ){
if( 0 < nClassNestArrNum && 2 == nNestLevel2Arr[nClassNestArrNum - 1] ){
// Oct. 10, 2002 genta
// メソッド中でさらにメソッドを定義することはないので
// ネストレベル判定追加 class/interfaceの直下の場合のみ判定する
if( nClassNestArr[nClassNestArrNum - 1] == nNestLevel - 1
&& 0 != strcmp( "sizeof", szFuncName )
&& 0 != strcmp( "if", szFuncName )
&& 0 != strcmp( "for", szFuncName )
&& 0 != strcmp( "do", szFuncName )
&& 0 != strcmp( "while", szFuncName )
&& 0 != strcmp( "catch", szFuncName )
&& 0 != strcmp( "switch", szFuncName )
&& 0 != strcmp( "return", szFuncName )
){
nFuncId = 2;
++nFuncNum;
/*
カーソル位置変換
物理位置(行頭からのバイト数、折り返し無し行位置)
→
レイアウト位置(行頭からの表示桁位置、折り返しあり行位置)
*/
int nPosX;
int nPosY;
m_cLayoutMgr.CaretPos_Phys2Log(
0,
nFuncLine - 1,
&nPosX,
&nPosY
);
char szWork[256];
wsprintf( szWork, "%s::%s", szClass, szFuncName );
pcFuncInfoArr->AppendData( nFuncLine, nPosY + 1, szWork, nFuncId );
}
}
if( 0 < nClassNestArrNum ){
nNestLevel2Arr[nClassNestArrNum - 1] = 0;
}
++nNestLevel;
nMode = 0;
continue;
}else
if( '}' == pLine[i] ){
if( 0 < nClassNestArrNum ){
nNestLevel2Arr[nClassNestArrNum - 1] = 0;
}
nNestLevel--;
if( 0 < nClassNestArrNum &&
nClassNestArr[nClassNestArrNum - 1] == nNestLevel
){
nClassNestArrNum--;
int k;
for( k = lstrlen( szClass ) - 1; k >= 0; k-- ){
if( '\\' == szClass[k] ){
break;
}
}
if( 0 > k ){
k = 0;
}
szClass[k] = '\0';
}
nMode = 0;
continue;
}else
if( '(' == pLine[i] ){
if( 0 < nClassNestArrNum /*nNestLevel == 1*/ &&
0 != strcmp( "new", szWordPrev )
){
strcpy( szFuncName, szWord );
nFuncLine = nLineCount + 1;
if( 0 < nClassNestArrNum ){
nNestLevel2Arr[nClassNestArrNum - 1] = 1;
}
}
nMode = 0;
continue;
}else
if( ')' == pLine[i] ){
int k;
const char* pLine2;
int nLineLen2;
int nLineCount2;
nLineCount2 = nLineCount;
pLine2 = pLine;
nLineLen2 = nLineLen;
k = i + 1;
BOOL bCommentLoop;
bCommentLoop = FALSE;
loop_is_func:;
for( ; k < nLineLen2; ++k ){
if( !bCommentLoop ){
if( pLine2[k] != ' ' && pLine2[k] != TAB && pLine2[k] != CR && pLine2[k] != LF ){
if( k + 1 < nLineLen2 && pLine2[k] == '/' && pLine2[k + 1] == '*' ){
bCommentLoop = TRUE;
++k;
}else
if( k + 1 < nLineLen2 && pLine2[k] == '/' && pLine2[k + 1] == '/' ){
k = nLineLen2 + 1;
break;
}else{
break;
}
}
}else{
if( k + 1 < nLineLen2 && pLine2[k] == '*' && pLine2[k + 1] == '/' ){
bCommentLoop = FALSE;
++k;
}
}
}
if( k >= nLineLen2 ){
k = 0;
++nLineCount2;
pLine2 = m_cDocLineMgr.GetLineStr( nLineCount2, &nLineLen2 );
if( NULL != pLine2 ){
goto loop_is_func;
}
if( 0 < nClassNestArrNum ){
nNestLevel2Arr[nClassNestArrNum - 1] = 0;
}
}else{
// Oct. 10, 2002 genta
// abscract にも対応
if( pLine2[k] == '{' || pLine2[k] == ';' ||
__iscsym( pLine2[k] ) ){
if( 0 < nClassNestArrNum ){
if( 1 == nNestLevel2Arr[nClassNestArrNum - 1] ){
nNestLevel2Arr[nClassNestArrNum - 1] = 2;
}
}
}else{
if( 0 < nClassNestArrNum ){
nNestLevel2Arr[nClassNestArrNum - 1] = 0;
}
}
}
nMode = 0;
continue;
}else
if( ';' == pLine[i] ){
if( 0 < nClassNestArrNum && 2 == nNestLevel2Arr[nClassNestArrNum - 1] ){
// Oct. 10, 2002 genta
// 関数の中で別の関数の宣言部を使うことって,Javaであるの?
if( nClassNestArr[nClassNestArrNum - 1] == nNestLevel - 1
&& 0 != strcmp( "sizeof", szFuncName )
&& 0 != strcmp( "if", szFuncName )
&& 0 != strcmp( "for", szFuncName )
&& 0 != strcmp( "do", szFuncName )
&& 0 != strcmp( "while", szFuncName )
&& 0 != strcmp( "catch", szFuncName )
&& 0 != strcmp( "switch", szFuncName )
&& 0 != strcmp( "return", szFuncName )
){
nFuncId = 1;
++nFuncNum;
/*
カーソル位置変換
物理位置(行頭からのバイト数、折り返し無し行位置)
→
レイアウト位置(行頭からの表示桁位置、折り返しあり行位置)
*/
int nPosX;
int nPosY;
m_cLayoutMgr.CaretPos_Phys2Log(
0,
nFuncLine - 1,
&nPosX,
&nPosY
);
char szWork[256];
wsprintf( szWork, "%s::%s", szClass, szFuncName );
pcFuncInfoArr->AppendData( nFuncLine, nPosY + 1, szWork, nFuncId );
}
}
if( 0 < nClassNestArrNum ){
nNestLevel2Arr[nClassNestArrNum - 1] = 0;
}
nMode = 0;
continue;
}else{
if( '_' == pLine[i] ||
':' == pLine[i] ||
'~' == pLine[i] ||
('a' <= pLine[i] && pLine[i] <= 'z' )||
('A' <= pLine[i] && pLine[i] <= 'Z' )||
('0' <= pLine[i] && pLine[i] <= '9' )||
'.' == pLine[i]
){
strcpy( szWordPrev, szWord );
nWordIdx = 0;
szWord[nWordIdx] = pLine[i];
szWord[nWordIdx + 1] = '\0';
nMode = 1;
}else{
nMode = 0;
}
}
}
}
}
#ifdef _DEBUG
pcFuncInfoArr->DUMP();
#endif
return;
}
// From Here Aug. 14, 2000 genta
//
// 書き換えが禁止されているかどうか
// 戻り値: true: 禁止 / false: 許可
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -