⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdoclinemgr.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//	/* 検索条件の情報(キー文字列の使用文字表)作成 */
//	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 + -