📄 cdoclinemgr.cpp
字号:
// /* 検索条件の情報(キー文字列の使用文字表)作成 */
// CDocLineMgr::CreateCharUsedArr(
// (const unsigned char *)pszPattern,
// lstrlen( pszPattern ),
// pnKey_CharCharsArr,
// &pnKey_CharUsedArr
// );
/* 1==正規表現 */
if( bRegularExp ){
/* 0==前方検索 1==後方検索 */
if( 0 == bPrevOrNext ){
//
// 前方(↑)検索(正規表現)
//
nLinePos = nLineNum; // 検索行
nHitTo = nIdx; // 検索開始位置
nIdxPos = 0;
pDocLine = GetLineInfo( nLinePos );
while( NULL != pDocLine ){
pLine = pDocLine->m_pLine->GetPtr( &nLineLen );
nHitPos = -1;
// Jun. 27, 2001 genta 正規表現ライブラリの違いを吸収するため変数追加
int nCurLen = 0; // マッチした長さ
while( 1 ){
nHitPosOld = nHitPos;
// From Here Jun. 27, 2001 genta 正規表現ライブラリの差し替え
nHitLenOld = nCurLen;
// From Here 2005.03.19 かろと もはやBREGEXP構造体に直接アクセスしない
if( nIdxPos <= pDocLine->GetLengthWithoutEOL()
&& pRegexp->Match( pLine, nLineLen, nIdxPos ) ){
// 検索にマッチした!
nHitPos = pRegexp->GetIndex();
nIdxPos = pRegexp->GetLastIndex();
nCurLen = nIdxPos - nHitPos;
// To Here 2005.03.19 かろと もはやBREGEXP構造体に直接アクセスしない
// 長さ0でマッチしたので、この位置で再度マッチしないように、1文字進める
if (nCurLen == 0) {
nIdxPos += (CMemory::MemCharNext( pLine, nLineLen, &pLine[nIdxPos] ) - &pLine[nIdxPos] == 2 ? 2 : 1);
}
// From Here Jun. 27, 2001 genta 正規表現ライブラリの差し替え
if( nHitPos >= nHitTo ){
// マッチしたのは、カーソル位置以降だった
// すなわち、この行で1つ前にマッチした位置が、検索したかった位置
if( -1 != nHitPosOld ){
// この行で1つ前にマッチした位置が存在するので、それを返す
*pnLineNum = nLinePos; /* マッチ行 */
*pnIdxFrom = nHitPosOld; /* マッチ位置from */
*pnIdxTo = *pnIdxFrom + nHitLenOld; /* マッチ位置to */
nRetVal = 1;
goto end_of_func;
}else{
// この行で1つ前にマッチした位置が存在しないので、前の行を検索へ
break; // 前の行を検索へ
}
}
// From Here 2001.12.03 hor /^/ or /$/ で無限ループするのを回避
if( -1 != nHitPosOld && nHitPosOld==nHitPos ){
*pnLineNum = nLinePos; /* マッチ行 */
*pnIdxFrom = nHitPosOld; /* マッチ位置from */
*pnIdxTo = *pnIdxFrom + nHitLenOld; /* マッチ位置to */
nRetVal = 1;
goto end_of_func;
}
// To Here 2001.12.03 hor
}else{
if( -1 != nHitPosOld ){
*pnLineNum = nLinePos; /* マッチ行 */
*pnIdxFrom = nHitPosOld; /* マッチ位置from */
*pnIdxTo = *pnIdxFrom + nHitLenOld; /* マッチ位置to */
nRetVal = 1;
goto end_of_func;
}else{
break;
}
}
}
nLinePos--;
pDocLine = pDocLine->m_pPrev;
nIdxPos = 0;
if( NULL != pDocLine ){
// nHitTo = lstrlen( pDocLine->m_pLine->GetPtr() );
// nHitTo = pDocLine->m_pLine->GetLength();
nHitTo = pDocLine->m_pLine->GetLength() + 1; // 前の行のNULL文字(\0)にもマッチさせるために+1 2003.05.16 かろと
}
}
nRetVal = 0;
goto end_of_func;
}else{
//
// 後方検索(正規表現)
//
nIdxPos = nIdx;
nLinePos = nLineNum;
pDocLine = GetLineInfo( nLinePos );
while( NULL != pDocLine ){
pLine = pDocLine->m_pLine->GetPtr( &nLineLen );
// From Here Jun. 27, 2001 genta 正規表現ライブラリの差し替え
// From Here 2005.03.19 かろと もはやBREGEXP構造体に直接アクセスしない
if( nIdxPos <= pDocLine->GetLengthWithoutEOL() && // 2002.02.08 hor $の次検索で次の行に移動できない問題を回避
pRegexp->Match( pLine, nLineLen, nIdxPos ) ){
// 行頭文字を検索すると endp[0]-pLineは0になるので、この条件では行頭文字の検索ができない不具合となる
// if(nIdxPos<(pRegexpData->endp[0]-pLine)){ // 2002.02.08 hor EOF直前の文字が何度もマッチしてしまう問題を回避
// EOF行の直前にマッチする問題は、GetMatchInfo側で対応 2003.05.03 by かろと
*pnLineNum = nLinePos; /* マッチ行 */
*pnIdxFrom = pRegexp->GetIndex(); /* マッチ位置from */
*pnIdxTo = pRegexp->GetLastIndex(); /* マッチ位置to */
// To Here 2005.03.19 かろと もはやBREGEXP構造体に直接アクセスしない
// To Here Jun. 27, 2001 genta 正規表現ライブラリの差し替え
nRetVal = 1;
goto end_of_func;
}
// 同上 2003.05.03
// }
++nLinePos;
pDocLine = pDocLine->m_pNext;
nIdxPos = 0;
}
nRetVal = 0;
goto end_of_func;
}
}else
/* 1==単語のみ検索 */
if( bWordOnly ){
/*
2001/06/23 Norio Nakatani
単語単位の検索を試験的に実装。単語はWhereCurrentWord()で判別してますので、
英単語やC/C++識別子などの検索条件ならヒットします。
*/
/* 0==前方検索 1==後方検索 */
if( 0 == bPrevOrNext ){
nLinePos = nLineNum;
pDocLine = GetLineInfo( nLinePos );
int nNextWordFrom;
int nNextWordFrom2;
int nNextWordTo2;
// int bState;
int nWork;
// CMemory cmemTest;
nNextWordFrom = nIdx;
while( NULL != pDocLine ){
if( TRUE == PrevOrNextWord( nLinePos, nNextWordFrom, &nWork, TRUE, FALSE ) ){
nNextWordFrom = nWork;
if( WhereCurrentWord( nLinePos, nNextWordFrom, &nNextWordFrom2, &nNextWordTo2 , NULL, NULL ) ){
if( nPatternLen == nNextWordTo2 - nNextWordFrom2 ){
const char* pData = pDocLine->m_pLine->GetPtr(); // 2002/2/10 aroka CMemory変更
/* 1==大文字小文字の区別 */
if( (FALSE == bLoHiCase && 0 == _memicmp( &(pData[nNextWordFrom2]) , pszPattern, nPatternLen ) ) ||
(TRUE == bLoHiCase && 0 == memcmp( &(pData[nNextWordFrom2]) , pszPattern, nPatternLen ) )
){
*pnLineNum = nLinePos; /* マッチ行 */
*pnIdxFrom = nNextWordFrom2; /* マッチ位置from */
*pnIdxTo = *pnIdxFrom + nPatternLen; /* マッチ位置to */
nRetVal = 1;
goto end_of_func;
}
}
continue;
}
}
/* 前の行を見に行く */
nLinePos--;
pDocLine = pDocLine->m_pPrev;
if( NULL != pDocLine ){
nNextWordFrom = pDocLine->m_pLine->GetLength() - pDocLine->m_cEol.GetLen();
if( 0 > nNextWordFrom ){
nNextWordFrom = 0;
}
}
}
}else{
nLinePos = nLineNum;
pDocLine = GetLineInfo( nLinePos );
int nNextWordFrom;
int nNextWordFrom2;
int nNextWordTo2;
// int bState;
nNextWordFrom = nIdx;
while( NULL != pDocLine ){
if( TRUE ==
WhereCurrentWord( nLinePos, nNextWordFrom, &nNextWordFrom2, &nNextWordTo2 , NULL, NULL )
){
if( nPatternLen == nNextWordTo2 - nNextWordFrom2 ){
const char* pData = pDocLine->m_pLine->GetPtr(); // 2002/2/10 aroka CMemory変更
/* 1==大文字小文字の区別 */
if( (FALSE == bLoHiCase && 0 == _memicmp( &(pData[nNextWordFrom2]) , pszPattern, nPatternLen ) ) ||
(TRUE == bLoHiCase && 0 == memcmp( &(pData[nNextWordFrom2]) , pszPattern, nPatternLen ) )
){
*pnLineNum = nLinePos; /* マッチ行 */
*pnIdxFrom = nNextWordFrom2; /* マッチ位置from */
*pnIdxTo = *pnIdxFrom + nPatternLen; /* マッチ位置to */
nRetVal = 1;
goto end_of_func;
}
}
/* 現在位置の左右の単語の先頭位置を調べる */
if( PrevOrNextWord( nLinePos, nNextWordFrom, &nNextWordFrom, FALSE, FALSE ) ){
continue;
}
}
/* 次の行を見に行く */
nLinePos++;
pDocLine = pDocLine->m_pNext;
nNextWordFrom = 0;
}
}
nRetVal = 0;
goto end_of_func;
}else{
/* 0==前方検索 1==後方検索 */
if( 0 == bPrevOrNext ){
nLinePos = nLineNum;
nHitTo = nIdx;
nIdxPos = 0;
pDocLine = GetLineInfo( nLinePos );
while( NULL != pDocLine ){
pLine = pDocLine->m_pLine->GetPtr( &nLineLen );
nHitPos = -1;
while( 1 ){
nHitPosOld = nHitPos;
pszRes = SearchString(
(const unsigned char *)pLine,
nLineLen,
nIdxPos,
(const unsigned char *)pszPattern,
nPatternLen,
pnKey_CharCharsArr,
// pnKey_CharUsedArr,
bLoHiCase
);
if( NULL != pszRes ){
nHitPos = pszRes - pLine;
nIdxPos = CMemory::MemCharNext(pLine, nLineLen, pszRes) - pLine; // Azumaiya前方検索で選択範囲がおかしくなることがあるバグ修正
if( nHitPos >= nHitTo ){
if( -1 != nHitPosOld ){
*pnLineNum = nLinePos; /* マッチ行 */
*pnIdxFrom = nHitPosOld; /* マッチ位置from */
*pnIdxTo = *pnIdxFrom + nPatternLen; /* マッチ位置to */
nRetVal = 1;
goto end_of_func;
}else{
break;
}
}
}else{
if( -1 != nHitPosOld ){
*pnLineNum = nLinePos; /* マッチ行 */
*pnIdxFrom = nHitPosOld; /* マッチ位置from */
*pnIdxTo = *pnIdxFrom + nPatternLen; /* マッチ位置to */
nRetVal = 1;
goto end_of_func;
}else{
break;
}
}
}
nLinePos--;
pDocLine = pDocLine->m_pPrev;
nIdxPos = 0;
if( NULL != pDocLine ){
// nHitTo = lstrlen( pDocLine->m_pLine->GetPtr() );
nHitTo = pDocLine->m_pLine->GetLength();
}
}
nRetVal = 0;
goto end_of_func;
}else{
nIdxPos = nIdx;
nLinePos = nLineNum;
pDocLine = GetLineInfo( nLinePos );
while( NULL != pDocLine ){
pLine = pDocLine->m_pLine->GetPtr( &nLineLen );
pszRes = SearchString(
(const unsigned char *)pLine,
nLineLen,
nIdxPos,
(const unsigned char *)pszPattern,
nPatternLen,
pnKey_CharCharsArr,
// pnKey_CharUsedArr,
bLoHiCase
);
if( NULL != pszRes ){
*pnLineNum = nLinePos; /* マッチ行 */
*pnIdxFrom = pszRes - pLine; /* マッチ位置from */
*pnIdxTo = *pnIdxFrom + nPatternLen; /* マッチ位置to */
nRetVal = 1;
goto end_of_func;
}
++nLinePos;
pDocLine = pDocLine->m_pNext;
nIdxPos = 0;
}
nRetVal = 0;
goto end_of_func;
}
}
end_of_func:;
if( NULL != pnKey_CharCharsArr ){
delete [] pnKey_CharCharsArr;
pnKey_CharCharsArr = NULL;
}
// if( NULL != pnKey_CharUsedArr ){
// delete [] pnKey_CharUsedArr;
// pnKey_CharUsedArr = NULL;
// }
return nRetVal;
}
/* 検索条件の情報(キー文字列の全角か半角かの配列)作成 */
void CDocLineMgr::CreateCharCharsArr(
const unsigned char* pszPattern,
int nSrcLen,
int** ppnCharCharsArr
)
{
int i;
int* pnCharCharsArr;
pnCharCharsArr = new int[nSrcLen];
for( i = 0; i < nSrcLen; /*i++*/ ){
pnCharCharsArr[i] = CMemory::MemCharNext( (const char *)pszPattern, nSrcLen, (const char *)&pszPattern[i] ) - (const char *)&pszPattern[i];
if( 0 == pnCharCharsArr[i] ){
pnCharCharsArr[i] = 1;
}
if( 2 == pnCharCharsArr[i] ){
pnCharCharsArr[i + 1] = pnCharCharsArr[i];
}
i+= pnCharCharsArr[i];
}
*ppnCharCharsArr = pnCharCharsArr;
return;
}
// /* 検索条件の情報(キー文字列の使用文字表)作成 */
// void CDocLineMgr::CreateCharUsedArr(
// const unsigned char* pszPattern,
// int nSrcLen,
// const int* pnCharCharsArr,
// int** ppnCharUsedArr
// )
// {
// int i;
// int* pnCharUsedArr;
// int nCharCode;
// pnCharUsedArr = new int[0x0000ffff];
//
// i = 0xffff;//TEST
//
// for( i = 0; i < 0x0000ffff; ++i ){
// pnCharUsedArr[i] = nSrcLen;
// }
// for( i = 0; i < nSrcLen; /*i++*/ ){
// if( 2 == pnCharCharsArr[i] ){
// // nCharCode = *((WORD*)(&pszPattern[i]));
// nCharCode = MAKEWORD( pszPattern[i + 1], pszPattern[i] );
// }else{
// nCharCode = (int)pszPattern[i];
// }
// if( nSrcLen == pnCharUsedArr[nCharCode] ){
// pnCharUsedArr[nCharCode] = i;
// }
// i+= pnCharCharsArr[i];
// }
// *ppnCharUsedArr = pnCharUsedArr;
// return;
// }
/* 文字列検索 */
char* CDocLineMgr::SearchString(
const unsigned char* pLine,
int nDesLen,
int nIdxPos,
const unsigned char* pszPattern,
int nSrcLen,
int* pnCharCharsArr,
// int* pnCharUsedArr,
int bLoHiCase
)
{
//#ifdef _DEBUG
// CRunningTimer cRunningTimer( (const char*)"CDocLineMgr::SearchString" );
//#endif
if( nDesLen < nSrcLen ){
return NULL;
}
if( 0 >= nSrcLen || 0 >= nDesLen){
return NULL;
}
int nPos;
int i;
int j;
int nWork;
int nCharChars;
int nCharChars1;
int nCharChars2;
int nCompareTo;
// Mar. 4, 2001 genta
#if 0
if( !bLoHiCase ){
nCompareTo = nDesLen - nSrcLen;
for( nPos = nIdxPos; nPos <= nCompareTo; /*nPos++*/ ){
nCharChars = CMemory::MemCharNext( (const char *)pLine, nDesLen, (const char *)&pLine[nPos] ) - (const char *)&pLine[nPos];
nCharChars1 = nCharChars;
for( i = 0; i < nSrcLen; /*i++*/ ){
if( NULL != pnCharCharsArr ){
nCharChars2 = pnCharCharsArr[i];
}else{
nCharC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -