?? ckeywordsetmgr.cpp
字號(hào):
// $Id: CKeyWordSetMgr.cpp,v 1.9 2005/01/30 16:27:51 Administrator Exp $
/*! @file
@brief 強(qiáng)調(diào)キーワード管理
@author Norio Nakatani
$Revision: 1.9 $
@date 2000.12.01 MIK binary search
@date 2004.07.29-2005.01.27 Moca キーワードの可変長(zhǎng)記憶
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2000-2001, MIK
Copyright (C) 2004 Moca
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented;
you must not claim that you wrote the original software.
If you use this software in a product, an acknowledgment
in the product documentation would be appreciated but is
not required.
2. Altered source versions must be plainly marked as such,
and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/
#include "CKeyWordSetMgr.h"
#include <stdlib.h>
#include <malloc.h>
#include "my_icmp.h" // Nov. 29, 2002 genta/moca
//! 1ブロック當(dāng)たりのキーワード數(shù)
static const int nKeyWordSetBlockSize = 50;
//! ブロックサイズで整列
inline int GetAlignmentSize( int nSize )
{
return (nKeyWordSetBlockSize - 1 + nSize) / nKeyWordSetBlockSize * nKeyWordSetBlockSize;
}
/*!
@note CKeyWordSetMgrは共有メモリ構(gòu)造體に埋め込まれているため,
そのままではコンストラクタが動(dòng)かないことに注意.
*/
CKeyWordSetMgr::CKeyWordSetMgr( void )
{
m_nCurrentKeyWordSetIdx = 0;
m_nKeyWordSetNum = 0;
m_nStartIdx[0] = 0;
m_nStartIdx[1] = 0;
m_nStartIdx[MAX_SETNUM] = 0;
return;
}
CKeyWordSetMgr::~CKeyWordSetMgr( void)
{
m_nKeyWordSetNum = 0;
return;
}
/*!
@brief 全キーワードセットの削除と初期化
キーワードセットのインデックスを全て0とする.
@date 2004.07.29 Moca 可変長(zhǎng)記憶
*/
void CKeyWordSetMgr::ResetAllKeyWordSet( void )
{
m_nKeyWordSetNum = 0;
int i;
for( i = 0; i < MAX_SETNUM+1; i++ ){
m_nStartIdx[i] = 0;
}
for( i = 0; i < MAX_SETNUM; i++ ){
m_nKeyWordNumArr[MAX_SETNUM] = 0;
}
}
const CKeyWordSetMgr& CKeyWordSetMgr::operator=( CKeyWordSetMgr& cKeyWordSetMgr )
{
// int nDataLen;
// char* pData;
// int i;
if( this == &cKeyWordSetMgr ){
return *this;
}
m_nCurrentKeyWordSetIdx = cKeyWordSetMgr.m_nCurrentKeyWordSetIdx;
m_nKeyWordSetNum = cKeyWordSetMgr.m_nKeyWordSetNum;
memcpy( m_szSetNameArr, cKeyWordSetMgr.m_szSetNameArr, sizeof( m_szSetNameArr ) );
memcpy( m_nKEYWORDCASEArr, cKeyWordSetMgr.m_nKEYWORDCASEArr, sizeof( m_nKEYWORDCASEArr ) );
memcpy( m_nStartIdx, cKeyWordSetMgr.m_nStartIdx, sizeof( m_nStartIdx ) ); // 2004.07.29 Moca
memcpy( m_nKeyWordNumArr, cKeyWordSetMgr.m_nKeyWordNumArr, sizeof( m_nKeyWordNumArr ) );
memcpy( m_szKeyWordArr, cKeyWordSetMgr.m_szKeyWordArr, sizeof( m_szKeyWordArr ) );
memcpy( m_IsSorted, cKeyWordSetMgr.m_IsSorted, sizeof( m_IsSorted ) ); //MIK 2000.12.01 binary search
return *this;
}
/*! @brief キーワードセットの追加
@param pszSetName [in] セット名
@param nKEYWORDCASE [in] 大文字小文字の區(qū)別.true:あり, false:無し
@param nSize [in] 最初に領(lǐng)域を確保するサイズ.
@date 2005.01.26 Moca 新規(guī)作成
@date 2005.01.29 genta サイズ0で作成→reallocするように
*/
BOOL CKeyWordSetMgr::AddKeyWordSet( const char* pszSetName, BOOL nKEYWORDCASE, int nSize )
{
if( nSize < 0 ) nSize = nKeyWordSetBlockSize;
if( MAX_SETNUM <= m_nKeyWordSetNum ){
return FALSE;
}
int nIdx = m_nKeyWordSetNum; //追加位置
m_nStartIdx[ ++m_nKeyWordSetNum ] = m_nStartIdx[ nIdx ];// サイズ0でセット追加
if( !KeyWordReAlloc( nIdx, nSize ) ){
--m_nKeyWordSetNum; // キーワードセットの追加をキャンセルする
return FALSE;
}
strcpy( m_szSetNameArr[nIdx], pszSetName );
m_nKEYWORDCASEArr[nIdx] = nKEYWORDCASE;
m_nKeyWordNumArr[nIdx] = 0;
m_IsSorted[nIdx] = 0; //MIK 2000.12.01 binary search
return TRUE;
}
/* n番目のセットを削除 */
BOOL CKeyWordSetMgr::DelKeyWordSet( int nIdx )
{
int i;
if( m_nKeyWordSetNum <= nIdx ||
0 > nIdx
){
return FALSE;
}
// キーワード領(lǐng)域を開放
KeyWordReAlloc( nIdx, 0 );
for( i = nIdx; i < m_nKeyWordSetNum - 1; ++i ){
memcpy( m_szSetNameArr[i], m_szSetNameArr[i + 1], sizeof( m_szSetNameArr[0] ) );
m_nKEYWORDCASEArr[i] = m_nKEYWORDCASEArr[i + 1];
m_nKeyWordNumArr[i] = m_nKeyWordNumArr[i + 1];
m_nStartIdx[i] = m_nStartIdx[i + 1]; // 2004.07.29 Moca 可変長(zhǎng)記憶
m_IsSorted[i] = m_IsSorted[i+1]; //MIK 2000.12.01 binary search
}
m_nKeyWordSetNum--;
if( m_nKeyWordSetNum <= m_nCurrentKeyWordSetIdx ){
m_nCurrentKeyWordSetIdx = m_nKeyWordSetNum - 1;
//セットが無くなったとき、m_nCurrentKeyWordSetIdxをわざと-1にするため、コメント化
// if( 0 > m_nCurrentKeyWordSetIdx ){
// m_nCurrentKeyWordSetIdx = 0;
// }
}
return TRUE;
}
/*! n番目のセットのセット名を返す
@param nIdx [in] セット番號(hào) 0~キーワードセット數(shù)-1
*/
const char* CKeyWordSetMgr::GetTypeName( int nIdx )
{
if( nIdx < 0 || m_nKeyWordSetNum <= nIdx ){
return NULL;
}
return m_szSetNameArr[nIdx];
}
/*! n番目のセットのセット名を再設(shè)定
@date 2005.01.26 Moca 新規(guī)作成
*/
const char* CKeyWordSetMgr::SetTypeName( int nIdx, const char* name )
{
if( NULL == name || nIdx < 0 || m_nKeyWordSetNum <= nIdx ){
return NULL;
}
strncpy( m_szSetNameArr[nIdx], name, MAX_SETNAMELEN );
m_szSetNameArr[nIdx][MAX_SETNAMELEN] = '\0';
return m_szSetNameArr[nIdx];
}
/* n番目のセットのキーワードの數(shù)を返す */
int CKeyWordSetMgr::GetKeyWordNum( int nIdx )
{
if( nIdx < 0 || m_nKeyWordSetNum <= nIdx ){
return 0;
}
return m_nKeyWordNumArr[nIdx];
}
/*! n番目のセットのm番目のキーワードを返す
@param nIdx [in] キーワードセット番號(hào)
@param nIdx2 [in] キーワード番號(hào)
*/
const char* CKeyWordSetMgr::GetKeyWord( int nIdx, int nIdx2 )
{
if( nIdx < 0 || m_nKeyWordSetNum <= nIdx ){
return NULL;
}
if( nIdx2 < 0 || m_nKeyWordNumArr[nIdx] <= nIdx2 ){
return NULL;
}
return m_szKeyWordArr[m_nStartIdx[nIdx] + nIdx2];
}
/*! n番目のセットのm番目のキーワードを編集
@param nIdx [in] キーワードセット番號(hào)
@param nIdx2 [in] キーワード番號(hào)
@param pszKeyWord [in] 設(shè)定するキーワード
*/
const char* CKeyWordSetMgr::UpdateKeyWord( int nIdx, int nIdx2, const char* pszKeyWord )
{
int i;
if( nIdx < 0 || m_nKeyWordSetNum <= nIdx ){
return NULL;
}
if( nIdx2 < 0 || m_nKeyWordNumArr[nIdx] <= nIdx2 ){
return NULL;
}
/* 0バイトの長(zhǎng)さのキーワードは編集しない */
if( pszKeyWord[0] == '\0' ){
return NULL;
}
/* 重複したキーワードは編集しない */
for( i = m_nStartIdx[nIdx]; i < m_nStartIdx[nIdx] + m_nKeyWordNumArr[nIdx]; ++i ){
if( 0 == strcmp( m_szKeyWordArr[i], pszKeyWord ) ){
return NULL;
}
}
m_IsSorted[nIdx] = 0; //MIK 2000.12.01 binary search
return strcpy( m_szKeyWordArr[m_nStartIdx[nIdx] + nIdx2], pszKeyWord );
}
/*! n番目のセットにキーワードを追加
@param nIdx [in] セット番號(hào)
@param pszKeyWord [in] キーワード文字列
@return 0: 成功, 1: セット番號(hào)エラー,2: メモリ確保エラー
3: キーワード不正,4: キーワード重複
*/
int CKeyWordSetMgr::AddKeyWord( int nIdx, const char* pszKeyWord )
{
int i;
if( m_nKeyWordSetNum <= nIdx ){
return 1;
}
// 2004.07.29 Moca
if( !KeyWordReAlloc( nIdx, m_nKeyWordNumArr[nIdx] + 1 ) ){
return 2;
}
// if( MAX_KEYWORDNUM <= m_nKeyWordNumArr[nIdx] ){
// return FALSE;
// }
/* 0バイトの長(zhǎng)さのキーワードは登録しない */
if( pszKeyWord[0] == '\0' ){
return 3;
}
/* 重複したキーワードは登録しない */
for( i = m_nStartIdx[nIdx]; i < m_nStartIdx[nIdx] + m_nKeyWordNumArr[nIdx]; ++i ){
if( 0 == strcmp( m_szKeyWordArr[i], pszKeyWord ) ){
return 4;
}
}
/* MAX_KEYWORDLENより長(zhǎng)いキーワードは切り捨てる */
if( MAX_KEYWORDLEN < strlen( pszKeyWord ) ){
memcpy( m_szKeyWordArr[m_nStartIdx[nIdx] + m_nKeyWordNumArr[nIdx]], pszKeyWord, MAX_KEYWORDLEN );
m_szKeyWordArr[m_nStartIdx[nIdx] + m_nKeyWordNumArr[nIdx]][MAX_KEYWORDLEN] = '\0';
}else{
strcpy( m_szKeyWordArr[m_nStartIdx[nIdx] + m_nKeyWordNumArr[nIdx]], pszKeyWord );
}
m_nKeyWordNumArr[nIdx]++;
m_IsSorted[nIdx] = 0; //MIK 2000.12.01 binary search
return 0;
}
/*! n番目のセットのm番目のキーワードを削除
@param nIdx [in] キーワードセット番號(hào)
@param nIdx2 [in] キーワード番號(hào)
*/
int CKeyWordSetMgr::DelKeyWord( int nIdx, int nIdx2 )
{
if( nIdx < 0 || m_nKeyWordSetNum <= nIdx ){
return 1;
}
if( nIdx2 < 0 || m_nKeyWordNumArr[nIdx] <= nIdx2 ){
return 2;
}
if( 0 >= m_nKeyWordNumArr[nIdx] ){
return 3; // 登録數(shù)が0なら上の條件で引っかかるのでここには來ない?
}
int i;
int endPos = m_nStartIdx[nIdx] + m_nKeyWordNumArr[nIdx] - 1;
for( i = m_nStartIdx[nIdx] + nIdx2; i < endPos; ++i ){
strcpy( m_szKeyWordArr[i], m_szKeyWordArr[i + 1] );
}
m_nKeyWordNumArr[nIdx]--;
// 2005.01.26 Moca 1つずらすだけなので、ソートの狀態(tài)は保持される
// m_IsSorted[nIdx] = 0; //MIK 2000.12.01 binary search
KeyWordReAlloc( nIdx, m_nKeyWordNumArr[nIdx] ); // 2004.07.29 Moca
return 0;
}
#if 0
/* n番目のセットから指定キーワードをサーチ 無いときは-1を返す */
int CKeyWordSetMgr::SearchKeyWord( int nIdx, const char* pszKeyWord, int nKeyWordLen )
{
int i;
if( m_nKEYWORDCASEArr[nIdx] ){ /* キーワードの英大文字小文字區(qū)別 */
for( i = m_nStartIdx[nIdx]; i < m_nStartIdx[nIdx] + m_nKeyWordNumArr[nIdx]; ++i ){
if( (int)strlen( m_szKeyWordArr[i] ) == nKeyWordLen ){
if( 0 == memcmp( m_szKeyWordArr[i], pszKeyWord, nKeyWordLen ) ){
return i;
}
}
}
}else{
for( i = m_nStartIdx[nIdx]; i < m_nStartIdx[nIdx] + m_nKeyWordNumArr[nIdx]; ++i ){
if( (int)strlen( m_szKeyWordArr[i] ) == nKeyWordLen ){
if( 0 == memicmp( m_szKeyWordArr[i], pszKeyWord, nKeyWordLen ) ){
return i;
}
}
}
}
return -1;
}
#endif
#if 0
// 2005.01.29 genta 使われていないようだ
/* 変更狀況を調(diào)査 */
BOOL CKeyWordSetMgr::IsModify( CKeyWordSetMgr& cKeyWordSetMgrNew, BOOL* pnModifyFlagArr )
{
BOOL bModifyAll;
int i;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -