📄 ckeywordsetmgr.cpp
字号:
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 + -