📄 ceditdoc_funclist1.cpp
字号:
szWord[nWordIdx] = '\0';
szNamespace[0] = '\0'; // 2002/10/27 frozen
nNamespaceLen[0] = 0; // 2002/10/27 frozen
nMode = 0;
// Aug. 10, 2004 genta プリプロセス処理クラス
CCppPreprocessMng cCppPMng;
// FuncNum = 0;
// bCppInitSkip = false;
// for( nLineCount = 0; nLineCount < m_cLayoutMgr.GetLineCount(); ++nLineCount ){
for( nLineCount = 0; nLineCount < m_cDocLineMgr.GetLineCount(); ++nLineCount ){
// pLine = m_cLayoutMgr.GetLineStr( nLineCount, &nLineLen );
pLine = m_cDocLineMgr.GetLineStr( nLineCount, &nLineLen );
// From Here Aug. 10, 2004 genta
// プリプロセス処理
// コメント中でなければプリプロセッサ指令を先に判定させる
if( 8 != nMode ){
i = cCppPMng.ScanLine( pLine, nLineLen );
}
else {
i = 0;
}
// C/C++としての処理が不要なケースでは i == nLineLenとなっているので
// 以下の解析処理はSKIPされる.
// To Here Aug. 10, 2004 genta
for( ; 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
/* ラインコメント読み込み中 */
// 2003/06/24 zenryaku
if( 10 == nMode)
{
if(!C_IsLineEsc(pLine, nLineLen)){
nMode = 0;
}
i = nLineLen;
continue;
}else
/* 単語読み込み中 */
if( 1 == nMode ){
if( C_IsWordChar( pLine[i] ) ){
++nWordIdx;
if( nWordIdx >= nMaxWordLeng ){
nMode = 999;
continue;
}else{
if( pLine[i] == ':')
{
if(nMode2 == M2_NAMESPACE_SAVE)
{
if(szWord[0]!='\0')
strcpy( szItemName, szWord );
nMode2 = M2_NAMESPACE_END;
}
else if( nMode2 == M2_TEMPLATE_SAVE)
{
strncat( szItemName, szWord, nItemNameLenMax - strlen(szItemName) );
szItemName[ nItemNameLenMax - 1 ] = '\0';
nMode2 = M2_NAMESPACE_END;
}
}
szWord[nWordIdx] = pLine[i];
szWord[nWordIdx + 1] = '\0';
}
}else{
// From Here Mar. 31, 2001 genta
// operatorキーワード(演算子overload)の対応
// ただし、operatorキーワードの後ろにスペースが入っているとうまく動かない。
if( C_IsOperator( szWord, nWordIdx + 1 ) ){
// operatorだ!
/* overloadする演算子一覧
& && &=
| || |=
+ ++ +=
- -- -= -> ->*
* *=
/ /=
% %=
^ ^=
! !=
= ==
< <= << <<=
> >= >> >>=
()
[]
~
,
*/
int oplen = 0; // 演算子本体部の文字列長
switch( pLine[i] ){
case '&': // no break
case '|': // no break
case '+':
oplen = 1;
if( i + 1 < nLineLen ){
if( pLine[ i + 1 ] == pLine[ i ] ||
pLine[ i + 1 ] == '=' )
oplen = 2;
}
break;
case '-':
oplen = 1;
if( i + 1 < nLineLen ){
if( pLine[ i + 1 ] == '-' ||
pLine[ i + 1 ] == '=' )
oplen = 2;
else if( pLine[ i + 1 ] == '>' ){
oplen = 2;
if( i + 2 < nLineLen ){
if( pLine[ i + 2 ] == '*' )
oplen = 3;
}
}
}
break;
case '*': // no break
case '/': // no break
case '%': // no break
case '^': // no break
case '!': // no break
case '=':
oplen = 1;
if( i + 1 < nLineLen ){
if( pLine[ i + 1 ] == '=' )
oplen = 2;
}
break;
case '<': // no break
case '>':
oplen = 1;
if( i + 1 < nLineLen ){
if( pLine[ i + 1 ] == pLine[ i ] ){
oplen = 2;
if( i + 2 < nLineLen ){
if( pLine[ i + 2 ] == '=' )
oplen = 3;
}
}
else if( pLine[ i + 1 ] == '=' )
oplen = 2;
}
break;
case '(':
if( i + 1 < nLineLen )
if( pLine[ i + 1 ] == /* 括弧対応対策 ( */ ')' )
oplen = 2;
break;
case '[':
if( i + 1 < nLineLen )
if( pLine[ i + 1 ] == /* 括弧対応対策 [ */ ']' )
oplen = 2;
break;
case '~': // no break
case ',':
oplen = 2;
break;
}
// oplen の長さだけキーワードに追加
for( ; oplen > 0 ; oplen--, i++ ){
++nWordIdx;
szWord[nWordIdx] = pLine[i];
}
szWord[nWordIdx + 1] = '\0';
// 記号列の処理を行う前は記号列のiは記号列の先頭を指していた。
// この時点でiは記号列の1つ後を指している
// operatorの後ろに不正な文字がある場合の動作
// ( で始まる場合はoperatorという関数と認識される
// それ以外の記号だと従来通り記号列がglobalのしたに現れる。
// 演算子が抜けている場合の動作
// 引数部が()の場合はそれが演算子と見なされるため、その行は関数定義と認識されない
// それ以外の場合はoperatorという関数と認識される
}
// 2002/10/27 frozen ここから
if( nMode2 == M2_NAMESPACE_SAVE )
strcpy( szItemName, szWord );
else if( nMode2 == M2_TEMPLATE_SAVE)
{
strncat( szItemName, szWord, nItemNameLenMax - strlen(szItemName) );
szItemName[ nItemNameLenMax - 1 ] = '\0';
}
else if( nNestLevel_func == 0 && nMode2 == M2_NORMAL )
{
nItemFuncId = 0;
if( strcmp(szWord,"class")==0 )
nItemFuncId = 3;
if( strcmp(szWord,"struct")==0 )
nItemFuncId = 4;
else if( strcmp(szWord,"namespace")==0 )
nItemFuncId = 7;
else if( strcmp(szWord,"enum")==0 )
nItemFuncId = 5;
else if( strcmp(szWord,"union")==0 )
nItemFuncId = 6;
if( nItemFuncId != 0 )
{
nMode2 = M2_NAMESPACE_SAVE;
nItemLine = nLineCount + 1;
strcpy(szItemName,"無名");
}
}
else if( nMode2 == M2_FUNC_NAME_END )
{
nMode2 = M2_KR_FUNC;
}
// 2002/10/27 frozen ここまで
// To Here Mar. 31, 2001 genta
// 2004/03/12 zenryaku キーワードに _ と PARAMS を使わせない (GNUのコードが見にくくなるから)
if( !( strcmp("PARAMS",szWord) == 0 || strcmp("_",szWord) == 0 ) )
strcpy( szWordPrev, szWord );
nWordIdx = 0;
szWord[0] = '\0';
nMode = 0;
i--;
continue;
}
}else
/* 記号列読み込み中 */
if( 2 == nMode ){
if( C_IsWordChar( pLine[i] ) ||
C_IsSpace( pLine[i] ) ||
'{' == pLine[i] ||
'}' == pLine[i] ||
'(' == pLine[i] ||
')' == pLine[i] ||
';' == pLine[i] ||
'\'' == pLine[i] ||
'"' == pLine[i] ||
'/' == pLine[i]
){
strcpy( szWordPrev, szWord );
nWordIdx = 0;
szWord[0] = '\0';
nMode = 0;
i--;
continue;
}else{
++nWordIdx;
if( nWordIdx >= nMaxWordLeng ){
nMode = 999;
continue;
}else{
szWord[nWordIdx] = pLine[i];
szWord[nWordIdx + 1] = '\0';
}
}
}else
/* 長過ぎる単語無視中 */
if( 999 == nMode ){
/* 空白やタブ記号等を飛ばす */
if( C_IsSpace( pLine[i] ) ){
nMode = 0;
continue;
}
}else
/* ノーマルモード */
if( 0 == nMode ){
/* 空白やタブ記号等を飛ばす */
if( C_IsSpace( pLine[i] ) )
continue;
if( i < nLineLen - 1 && '/' == pLine[i] && '/' == pLine[i + 1] ){
++i;
nMode = 10;
continue;
}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
// 2002/10/27 frozen ここから
if( '{' == pLine[i] )
{
int nItemNameLen;
if( nNestLevel_func !=0)
++nNestLevel_func;
else if(
(nMode2 & M2_AFTER_ITEM) != 0 &&
nNestLevel_global < nNamespaceNestMax &&
(nNamespaceLen[nNestLevel_global] + (nItemNameLen = strlen(szItemName)) + 10 + 1) < nNamespaceLenMax)
// 3番目の(&&の後の)条件
// バッファが足りない場合は項目の追加を行わない。
// +10は追加する文字列の最大長(追加する文字列は"::定義位置"が最長)
// +1は終端NUL文字
{
strcpy( &szNamespace[nNamespaceLen[nNestLevel_global]] , szItemName);
// Jan. 30, 2005 genta M2_KR_FUNC 追加
// 関数の後ろにconst, throw または初期化子があると
// M2_KR_FUNCに遷移して,';'が見つからないとその状態のまま
// 中括弧に遭遇する.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -