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

📄 ckeywordsetmgr.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	for( i = 0; i < MAX_SETNUM; ++i ){
		pnModifyFlagArr[i] = FALSE;
	}
	if( this == &cKeyWordSetMgrNew ){
		return FALSE;
	}

	bModifyAll = FALSE;
	if( m_nCurrentKeyWordSetIdx != cKeyWordSetMgrNew.m_nCurrentKeyWordSetIdx
	 || m_nKeyWordSetNum != cKeyWordSetMgrNew.m_nKeyWordSetNum
	 || 0 != memcmp( &m_szSetNameArr, &cKeyWordSetMgrNew.m_szSetNameArr, sizeof( m_szSetNameArr ) )
	 || 0 != memcmp( &m_nKEYWORDCASEArr, &cKeyWordSetMgrNew.m_nKEYWORDCASEArr, sizeof( m_nKEYWORDCASEArr ) )
	 || 0 != memcmp( &m_nStartIdx, &cKeyWordSetMgrNew.m_nStartIdx, sizeof( m_nStartIdx ) ) // 2004.07.29 Moca
	 || 0 != memcmp( &m_nKeyWordNumArr, &cKeyWordSetMgrNew.m_nKeyWordNumArr, sizeof( m_nKeyWordNumArr ) )
	 || 0 != memcmp( &m_szKeyWordArr, &cKeyWordSetMgrNew.m_szKeyWordArr, sizeof( m_szKeyWordArr ) )
	 ){
		bModifyAll = TRUE;
		for( i = 0; i < MAX_SETNUM; ++i ){
			if( 0 != memcmp( &m_szSetNameArr[i], &cKeyWordSetMgrNew.m_szSetNameArr[i], sizeof( m_szSetNameArr[i] ) )
			 || m_nKEYWORDCASEArr[i] != cKeyWordSetMgrNew.m_nKEYWORDCASEArr[i]
			 || m_nStartIdx[i] != cKeyWordSetMgrNew.m_nStartIdx[i] // 2004.07.29 Moca
			 || m_nKeyWordNumArr[i] != cKeyWordSetMgrNew.m_nKeyWordNumArr[i]
			 || 0 != memcmp( &m_szKeyWordArr[i], &cKeyWordSetMgrNew.m_szKeyWordArr[i], sizeof( m_szKeyWordArr[i] ) )
			){
				pnModifyFlagArr[i] = TRUE;
			}
		}
	}
	return bModifyAll;

}
#endif

//MIK START 2000.12.01 binary search
/*!	キーワードのソートとキーワード長の最大値計算

	@param nIdx [in] キーワードセット番号

*/
void CKeyWordSetMgr::SortKeyWord( int nIdx )
{
	//nIdxのセットをソートする。
	if( m_nKEYWORDCASEArr[nIdx] ) {
		qsort( m_szKeyWordArr[m_nStartIdx[nIdx]],
				m_nKeyWordNumArr[nIdx],
				sizeof(m_szKeyWordArr[0]),
				(int (__cdecl *)(const void *, const void *))strcmp
			);
	} else {
		qsort( m_szKeyWordArr[m_nStartIdx[nIdx]],
				m_nKeyWordNumArr[nIdx],
				sizeof(m_szKeyWordArr[0]),
				(int (__cdecl *)(const void *, const void *))my_stricmp	//Dec. 24, 2002 Moca
			);
	}
	{
		int i;
		int len;
		m_nKeyWordMaxLenArr[nIdx] = 0;
		for( i = m_nStartIdx[nIdx]; i < m_nStartIdx[nIdx] + m_nKeyWordNumArr[nIdx]; i++ ){
			len = strlen( m_szKeyWordArr[i] );
			if( m_nKeyWordMaxLenArr[nIdx] < len ){
				m_nKeyWordMaxLenArr[nIdx] = len;
			}
		}
	}
	m_IsSorted[nIdx] = 1;
	return;
}
/* n番目のセットから指定キーワードをバイナリサーチ 無いときは-1を返す */
int CKeyWordSetMgr::SearchKeyWord2( int nIdx, const char* pszKeyWord, int nKeyWordLen )
{
	int pc, pr, pl, ret, wcase;

	//sort
	if(m_IsSorted[nIdx] == 0) SortKeyWord(nIdx);

	pl = m_nStartIdx[nIdx];
	pr = m_nStartIdx[nIdx] + m_nKeyWordNumArr[nIdx] - 1;
//	if( pr < 0 ) return -1;
	if( nKeyWordLen > m_nKeyWordMaxLenArr[nIdx] ) return -1;
	pc = (pr + 1 - pl) / 2 + pl;
	wcase = m_nKEYWORDCASEArr[nIdx];
	while(pl <= pr) {
		if( wcase ) {
			ret = strncmp( pszKeyWord, m_szKeyWordArr[pc], nKeyWordLen );
		} else {
			ret = strnicmp( pszKeyWord, m_szKeyWordArr[pc], nKeyWordLen );
		}
		if( ret == 0 ) {
			if( (int)strlen( m_szKeyWordArr[pc] ) > nKeyWordLen ) {
				ret = -1;
			} else {
				return pc - m_nStartIdx[nIdx];
			}
		}

		if( ret < 0 ) {
			pr = pc - 1;
		} else {
			pl = pc + 1;
		}

		pc = (pr + 1 - pl) / 2 + pl;
	}
	return -1;
}
//MIK END
//MIK START 2000.12.01 START
void CKeyWordSetMgr::SetKeyWordCase( int nIdx, int nCase )
{
	//大文字小文字判断は1ビットあれば実現できる。
	//今はint型(sizeof(int) * セット数 = 4 * 100 = 400)だが,
	//char型(sizeof(char) * セット数 = 1 * 100 = 100)で十分だし
	//ビット操作してもいい。
	if(nCase) {
		m_nKEYWORDCASEArr[nIdx] = TRUE;
	} else {
		m_nKEYWORDCASEArr[nIdx] = FALSE;
	}

	m_IsSorted[nIdx] = 0;
	return;
}

int CKeyWordSetMgr::GetKeyWordCase( int nIdx )
{
	return 	m_nKEYWORDCASEArr[nIdx];
}
//MIK END


// From Here 2004.07.29 Moca 可変長記憶
/*!	@brief \\0またはTABで区切られた文字列からキーワードを設定

	@param nIdx [in] キーワードセット番号
	@param nSize [in] キーワード数
	@param pszKeyWordArr [in]「key\\tword\\t\\0」又は「key\\0word\\0\\0」の形式
	
	@return 登録に成功したキーワード数
	
	@author Moca
	@date 2004.07.29 Moca CShareData::ShareData_IO_2内のコードを元に移築?作成
*/
int CKeyWordSetMgr::SetKeyWordArr( int nIdx, int nSize, const char* pszKeyWordArr )
{
	if( !KeyWordReAlloc( nIdx, nSize ) ){
		return 0;
	}
	int cnt, i;
	const char* ptr = pszKeyWordArr;
	for( cnt = 0, i = m_nStartIdx[nIdx];
		i < m_nStartIdx[nIdx] + nSize && *ptr != '\0'; cnt++, i++ ){
		//	May 25, 2003 キーワードの区切りとして\0以外にTABを受け付けるようにする
		const char* pTop = ptr;	// キーワードの先頭位置を保存
		while( *ptr != '\t' && *ptr != '\0' )
			++ptr;
		int kwlen = ptr - pTop;
		memcpy( m_szKeyWordArr[i], pTop, kwlen );
		m_szKeyWordArr[i][kwlen] = '\0';
		++ptr;
	}
	m_nKeyWordNumArr[nIdx] = cnt;
	return nSize;
}

/*!
	キーワードリストを設定

	@param [in] nSize ppszKeyWordArrの要素数
	@param [in] ppszKeyWordArr キーワードの配列(重複?長さ制限等、考慮済みであること)
	@param nIdx [in] キーワードセット番号

	@return 登録したキーワード数.0は失敗.
*/
int CKeyWordSetMgr::SetKeyWordArr( int nIdx, int nSize, const char * const *ppszKeyWordArr )
{
	if( !KeyWordReAlloc( nIdx, nSize ) ){
		return 0;
	}
	int cnt, i;
	for( cnt = 0, i = m_nStartIdx[nIdx]; i < m_nStartIdx[nIdx] + nSize; cnt++, i++ ){
		strcpy( m_szKeyWordArr[i], ppszKeyWordArr[cnt] );
	}
	m_nKeyWordNumArr[nIdx] = nSize;
	return nSize;
}

/*!	@brief キーワードの整理

	重複や使用不可のキーワードを取り除く

	@param nIdx [in] キーワードセット番号
	
	@return 削除したキーワード数
*/
int CKeyWordSetMgr::CleanKeyWords( int nIdx )
{
	// 先にソートしておかないと、後で順番が変わると都合が悪い
	if( m_IsSorted[nIdx] == 0 )	SortKeyWord( nIdx );

	int nDelCount = 0;	//!< 削除キーワード数
	int i = 0;
	while( i < GetKeyWordNum( nIdx ) - 1 ){
		const char* p = GetKeyWord( nIdx, i );
		bool bDelKey = false;	//!< trueなら削除対象
		// 表示できないキーワードか
		int k;
		for( k = 0;p[k] != '\0'; k++ ){
			if( IS_KEYWORD_CHAR( p[k] ) ){
			}else{
				bDelKey = true;
				break;
			}
		}
		if( !bDelKey ){
			// 重複するキーワードか
			const char* r = GetKeyWord( nIdx, i + 1 );
			unsigned int nKeyWordLen = strlen( p );
			if( nKeyWordLen == strlen( r ) ){
				if( m_nKEYWORDCASEArr[nIdx] ){
					if( 0 == memcmp( p, r, nKeyWordLen ) ){
						bDelKey = true;
					}
				}else{
					if( 0 == memicmp( p, r, nKeyWordLen ) ){
						bDelKey = true;
					}
				}
			}
		}
		if( bDelKey ){
			DelKeyWord( nIdx, i );
			nDelCount++;
			//後ろがずれるので、iを増やさない
		}else{
			i++;
		}
	}
	return nDelCount;
}

/*!	@brief キーワード追加余地の問い合わせ

	@param nIdx [in] キーワードセット番号
	@return true: もう1つ追加可能, false: 追加不可能

	@date 2005.01.26 Moca 新規作成
	@date 2005.01.29 genta 割り当て済みの領域に空きがあれば拡張不能でも追加可能
*/
bool CKeyWordSetMgr::CanAddKeyWord( int nIdx )
{
	//	割り当て済みの領域の空きをまず調べる
	int nSizeOld = GetAllocSize( nIdx );
	if( m_nKeyWordNumArr[nIdx] < nSizeOld ){
		return true;
	}

	//	割り当て済み領域がいっぱいならば,割り当て可能領域の有無を確認
	//	一応割り当て最小単位分残っていることを確認.
	if( GetFreeSize() >= nKeyWordSetBlockSize ){
		return true;
	}

	//	それでもだめか
	return false;
}

#if 0
/*!	新しいキーワードセットのキーワード領域を確保する
	m_nKeyWordSetNumは、呼び出し側が、呼び出した後に+1する
*/
bool CKeyWordSetMgr::KeyWordAlloc( int nSize )
{
	// assert( m_nKeyWordSetNum < MAX_SETNUM );
	// assert( 0 <= nSize );

	// ブロックのサイズで整列
	int nAllocSize = GetAlignmentSize( nSize );

	if( GetFreeSize() < nAllocSize ){
		// メモリ不足
		return false;
	}
	m_nStartIdx[m_nKeyWordSetNum + 1] = m_nStartIdx[m_nKeyWordSetNum] + nAllocSize;
	int i;
	for( i = m_nKeyWordSetNum + 1; i < MAX_SETNUM; i++ ){
		m_nStartIdx[i + 1] = m_nStartIdx[i];
	}
	return true;
}
#endif

/*!	初期化済みのキーワードセットのキーワード領域の再割り当て、解放を行う

	@param nIdx [in] キーワードセット番号
	@param nSize [in] 必要なキーワード数 (0~)
*/
bool CKeyWordSetMgr::KeyWordReAlloc( int nIdx, int nSize )
{
	// assert( 0 <= nIdx && nIdx < m_nKeyWordSetNum );

	// ブロックのサイズで整列
	int nAllocSize = GetAlignmentSize( nSize );
	int nSizeOld = GetAllocSize( nIdx );

	if( nSize < 0 ){
		return false;
	}
	if( nAllocSize == nSizeOld ){
		// サイズ変更なし
		return true;
	}

	int nDiffSize = nAllocSize - nSizeOld;
	if( GetFreeSize() < nDiffSize ){
		// メモリ不足
		return false;
	}
	// 後ろのキーワードセットのキーワードをすべて移動する
	int i;
	if( nIdx + 1 < m_nKeyWordSetNum ){
		int nKeyWordIdx = m_nStartIdx[nIdx + 1];
		int nKeyWordNum = m_nStartIdx[m_nKeyWordSetNum] - m_nStartIdx[nIdx + 1];
		memmove( m_szKeyWordArr[nKeyWordIdx + nDiffSize],
			m_szKeyWordArr[nKeyWordIdx],
			nKeyWordNum * sizeof( m_szKeyWordArr[0] ) );
	}
	for( i = nIdx + 1; i <= m_nKeyWordSetNum; i++ ){
		m_nStartIdx[ i ] += nDiffSize;
	}
	return true;
}

/*!	@brief 割り当て済みキーワード数 

	@param nIdx [in] キーワードセット番号
	@return キーワードセットに割り当て済みのキーワード数
*/
int CKeyWordSetMgr::GetAllocSize( int nIdx ) const
{
	return m_nStartIdx[nIdx + 1] - m_nStartIdx[nIdx];
}

/*! 共有空きスペース

	@date 2004.07.29 Moca 新規作成
	
	@return 共有空き領域(キーワード数)
 */
int CKeyWordSetMgr::GetFreeSize( void ) const 
{
	return MAX_KEYWORDNUM - m_nStartIdx[m_nKeyWordSetNum];
}
// To Here 2004.07.29 Moca


/*[EOF]*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -