📄 cdoclinemgr.cpp
字号:
if( 0 < nPos - nBgn || 0 < cmemNextLine.GetLength() ){
cmemCurLine.SetData( &pInsData[nBgn], nPos - nBgn );
cmemCurLine += cmemNextLine;
if( NULL == pDocLine ){
pDocLineNew = new CDocLine;
pDocLineNew->m_pLine = new CMemory;
/* 挿入データを行終端で区切った行数カウンタ */
if( 0 == nCount ){
if( NULL == m_pDocLineTop ){
m_pDocLineTop = pDocLineNew;
}
pDocLineNew->m_pPrev = m_pDocLineBot;
if( NULL != m_pDocLineBot ){
m_pDocLineBot->m_pNext = pDocLineNew;
}
m_pDocLineBot = pDocLineNew;
pDocLineNew->m_pNext = NULL;
pDocLineNew->m_pLine->SetData( &cmemPrevLine );
*(pDocLineNew->m_pLine) += cmemCurLine;
pDocLineNew->m_cEol = cEOLTypeNext; /* 改行コードの種類 */
// pDocLineNew->m_nEOLLen = gm_pnEolLenArr[nEOLTypeNext]; /* 改行コードの長さ */
}else{
if( NULL != m_pDocLineBot ){
m_pDocLineBot->m_pNext = pDocLineNew;
}
pDocLineNew->m_pPrev = m_pDocLineBot;
m_pDocLineBot = pDocLineNew;
pDocLineNew->m_pNext = NULL;
pDocLineNew->m_pLine->SetData( &cmemCurLine );
pDocLineNew->m_cEol = cEOLTypeNext; /* 改行コードの種類 */
// pDocLineNew->m_nEOLLen = gm_pnEolLenArr[nEOLTypeNext]; /* 改行コードの長さ */
}
pDocLine = NULL;
++m_nLines;
*pnNewPos = nPos - nBgn; /* 挿入された部分の次の位置のデータ位置 */
}else{
/* 挿入データを行終端で区切った行数カウンタ */
if( 0 == nCount ){
pDocLine->m_pLine->SetData( &cmemPrevLine );
*(pDocLine->m_pLine) += cmemCurLine;
pDocLine->m_cEol = cEOLTypeNext; /* 改行コードの種類 */
// pDocLine->m_nEOLLen = gm_pnEolLenArr[nEOLTypeNext]; /* 改行コードの長さ */
pDocLine = pDocLine->m_pNext;
*pnNewPos = cmemPrevLine.GetLength() + nPos - nBgn; /* 挿入された部分の次の位置のデータ位置 */
}else{
pDocLineNew = new CDocLine;
pDocLineNew->m_pLine = new CMemory;
pDocLineNew->m_pPrev = pDocLine->m_pPrev;
pDocLineNew->m_pNext = pDocLine;
pDocLine->m_pPrev->m_pNext = pDocLineNew;
pDocLine->m_pPrev = pDocLineNew;
pDocLineNew->m_pLine->SetData( &cmemCurLine );
pDocLineNew->m_cEol = cEOLTypeNext; /* 改行コードの種類 */
// pDocLineNew->m_nEOLLen = gm_pnEolLenArr[nEOLTypeNext]; /* 改行コードの長さ */
pDocLineNew->SetBookMark(bBookMarkNext); // 2001.12.03 hor ブックマークを復元
++m_nLines;
*pnNewPos = nPos - nBgn; /* 挿入された部分の次の位置のデータ位置 */
}
}
}
*pnInsLineNum = m_nLines - nAllLinesOld;
return;
}
//nEOLType nEOLType nEOLTypeNext
/* 現在位置の単語の範囲を調べる */
// 2001/06/23 N.Nakatani WhereCurrentWord()変更 WhereCurrentWord_2をコールするようにした
int CDocLineMgr::WhereCurrentWord(
int nLineNum,
int nIdx,
int* pnIdxFrom,
int* pnIdxTo,
CMemory* pcmcmWord,
CMemory* pcmcmWordLeft
)
{
CDocLine* pDocLine;
char* pLine;
int nLineLen;
*pnIdxFrom = nIdx;
*pnIdxTo = nIdx;
pDocLine = GetLineInfo( nLineNum );
if( NULL == pDocLine ){
return FALSE;
}
pLine = pDocLine->m_pLine->GetPtr( &nLineLen );
/* 現在位置の単語の範囲を調べる */
return CDocLineMgr::WhereCurrentWord_2( pLine, nLineLen, nIdx, pnIdxFrom, pnIdxTo, pcmcmWord, pcmcmWordLeft );
}
//@@@ 2001.06.23 N.Nakatani
/*!
@brief 現在位置の単語の範囲を調べる staticメンバ
@author N.Nakatani
@param pLine [in] 調べるメモリ全体の先頭アドレス
@param nLineLen [in] 調べるメモリ全体の有効長
@param nIdx [out] 調査開始地点:pLineからの相対的な位置
@param pnIdxFrom [out] 単語が見つかった場合は、単語の先頭インデックスを返す。
@param pnIdxTo [out] 単語が見つかった場合は、単語の終端の次のバイトの先頭インデックスを返す。
@param pcmcmWord [out] 単語が見つかった場合は、現在単語を切り出して指定されたCMemoryオブジェクトに格納する。情報が不要な場合はNULLを指定する。
@param pcmcmWordLeft [out] 単語が見つかった場合は、現在単語の左に位置する単語を切り出して指定されたCMemoryオブジェクトに格納する。情報が不要な場合はNULLを指定する。
@retval true 成功 現在位置のデータは「単語」と認識する。
@retval false 失敗 現在位置のデータは「単語」とは言いきれない気がする。
*/
int CDocLineMgr::WhereCurrentWord_2(
const char* pLine,
int nLineLen,
int nIdx,
int* pnIdxFrom,
int* pnIdxTo,
CMemory* pcmcmWord,
CMemory* pcmcmWordLeft
)
{
int nCharKind;
int nCharKindNext;
int nIdxNext;
int nIdxNextPrev;
int nCharChars;
*pnIdxFrom = nIdx;
*pnIdxTo = nIdx;
// pDocLine = GetLineInfo( nLineNum );
// if( NULL == pDocLine ){
// return FALSE;
// }
// pLine = pDocLine->m_pLine->GetPtr( &nLineLen );
if( NULL == pLine ){
return FALSE;
}
if( nIdx >= nLineLen ){
return FALSE;
}
/* 現在位置の文字の種類によっては選択不能 */
if( pLine[nIdx] == CR || pLine[nIdx] == LF ){
return FALSE;
}
/* 現在位置の文字の種類を調べる */
nCharKind = WhatKindOfChar( (char*)pLine, nLineLen, nIdx );
/* 文字種類が変わるまで前方へサーチ */
nIdxNext = nIdx;
nCharChars = &pLine[nIdxNext] - CMemory::MemCharPrev( pLine, nLineLen, &pLine[nIdxNext] );
while( nCharChars > 0 ){
nIdxNextPrev = nIdxNext;
nIdxNext -= nCharChars;
nCharKindNext = WhatKindOfChar( (char*)pLine, nLineLen, nIdxNext );
if( nCharKind == CK_MBC_NOVASU ){
if( nCharKindNext == CK_MBC_HIRA ||
nCharKindNext == CK_MBC_KATA ){
nCharKind = nCharKindNext;
}
}else
if( nCharKind == CK_MBC_HIRA ||
nCharKind == CK_MBC_KATA ){
if( nCharKindNext == CK_MBC_NOVASU ){
nCharKindNext = nCharKind;
}
}
if( nCharKind != nCharKindNext ){
nIdxNext = nIdxNextPrev;
break;
}
nCharChars = &pLine[nIdxNext] - CMemory::MemCharPrev( pLine, nLineLen, &pLine[nIdxNext] );
}
*pnIdxFrom = nIdxNext;
if( NULL != pcmcmWordLeft ){
pcmcmWordLeft->SetData( &pLine[*pnIdxFrom], nIdx - *pnIdxFrom );
}
/* 文字種類が変わるまで後方へサーチ */
nIdxNext = nIdx;
nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[nIdxNext] ) - &pLine[nIdxNext];
while( nCharChars > 0 ){
nIdxNext += nCharChars;
nCharKindNext = WhatKindOfChar( (char*)pLine, nLineLen, nIdxNext );
if( nCharKind == CK_MBC_NOVASU ){
if( nCharKindNext == CK_MBC_HIRA ||
nCharKindNext == CK_MBC_KATA ){
nCharKind = nCharKindNext;
}
}else
if( nCharKind == CK_MBC_HIRA ||
nCharKind == CK_MBC_KATA ){
if( nCharKindNext == CK_MBC_NOVASU ){
nCharKindNext = nCharKind;
}
}
if( nCharKind != nCharKindNext ){
break;
}
nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[nIdxNext] ) - &pLine[nIdxNext];
}
*pnIdxTo = nIdxNext;
if( NULL != pcmcmWord ){
pcmcmWord->SetData( &pLine[*pnIdxFrom], *pnIdxTo - *pnIdxFrom );
}
return TRUE;
}
/*! 次の単語の先頭を探す
pLine(長さ:nLineLen)の文字列から単語を探す。
探し始める位置はnIdxで指定。方向は後方に限定。単語の両端で止まらない(関係ないから)
*/
int CDocLineMgr::SearchNextWordPosition(
const char* pLine,
int nLineLen,
int nIdx, // 桁数
int* pnColmNew, // 見つかった位置
BOOL bStopsBothEnds // 単語の両端で止まる
)
{
/* 文字種類が変わるまで後方へサーチ */
/* 空白とタブは無視する */
/* 現在位置の文字の種類を調べる */
int nCharKind = WhatKindOfChar( pLine, nLineLen, nIdx );
int nIdxNext = nIdx;
int nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[nIdxNext] ) - &pLine[nIdxNext];
while( nCharChars > 0 ){
nIdxNext += nCharChars;
int nCharKindNext = WhatKindOfChar( pLine, nLineLen, nIdxNext );
/* 空白とタブは無視する */
if( nCharKindNext == CK_TAB || nCharKindNext == CK_SPACE ){
if ( bStopsBothEnds && nCharKind != nCharKindNext ){
*pnColmNew = nIdxNext;
return TRUE;
}
nCharKind = nCharKindNext;
}
else {
if( nCharKind == CK_MBC_NOVASU ){
if( nCharKindNext == CK_MBC_HIRA ||
nCharKindNext == CK_MBC_KATA ){
nCharKind = nCharKindNext;
}
}else
if( nCharKind == CK_MBC_HIRA ||
nCharKind == CK_MBC_KATA ){
if( nCharKindNext == CK_MBC_NOVASU ){
nCharKindNext = nCharKind;
}
}
if( nCharKind != nCharKindNext ){
*pnColmNew = nIdxNext;
return TRUE;
}
}
nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[nIdxNext] ) - &pLine[nIdxNext];
}
return FALSE;
}
/* 現在位置の左右の単語の先頭位置を調べる */
int CDocLineMgr::PrevOrNextWord(
int nLineNum, // 行数
int nIdx, // 桁数
int* pnColmNew, // 見つかった位置
BOOL bLEFT, // TRUE:前方(左)へ向かう。FALSE:後方(右)へ向かう。
BOOL bStopsBothEnds // 単語の両端で止まる
)
{
CDocLine* pDocLine;
char* pLine;
int nLineLen;
int nCharKind;
int nCharKindNext;
int nIdxNext;
int nIdxNextPrev;
int nCharChars;
int nCount;
pDocLine = GetLineInfo( nLineNum );
if( NULL == pDocLine ){
return FALSE;
}
pLine = pDocLine->m_pLine->GetPtr( &nLineLen );
// ABC D[EOF]となっていたときに、Dの後ろにカーソルを合わせ、単語の左端に移動すると、Aにカーソルがあうバグ修正。YAZAKI
if( nIdx >= nLineLen ){
if (bLEFT && nIdx == nLineLen){
}
else {
nIdx = nLineLen - 1;
}
}
/* 現在位置の文字の種類によっては選択不能 */
if( FALSE == bLEFT && ( pLine[nIdx] == CR || pLine[nIdx] == LF ) ){
return FALSE;
}
/* 前の単語か?後ろの単語か? */
if( bLEFT ){
/* 現在位置の文字の種類を調べる */
nCharKind = WhatKindOfChar( pLine, nLineLen, nIdx );
if( nIdx == 0 ){
return FALSE;
}
/* 文字種類が変わるまで前方へサーチ */
/* 空白とタブは無視する */
nCount = 0;
nIdxNext = nIdx;
nCharChars = &pLine[nIdxNext] - CMemory::MemCharPrev( pLine, nLineLen, &pLine[nIdxNext] );
while( nCharChars > 0 ){
nIdxNextPrev = nIdxNext;
nIdxNext -= nCharChars;
nCharKindNext = WhatKindOfChar( pLine, nLineLen, nIdxNext );
/* 空白とタブは無視する */
if( nCharKind == CK_MBC_NOVASU ){
if( nCharKindNext == CK_MBC_HIRA ||
nCharKindNext == CK_MBC_KATA ){
nCharKind = nCharKindNext;
}
}else
if( nCharKind == CK_MBC_HIRA ||
nCharKind == CK_MBC_KATA ){
if( nCharKindNext == CK_MBC_NOVASU ){
nCharKindNext = nCharKind;
}
}
if( nCharKind != nCharKindNext ){
/* サーチ開始位置の文字が空白またはタブの場合 */
if( nCharKind == CK_TAB || nCharKind == CK_SPACE ){
if ( bStopsBothEnds && nCount ){
nIdxNext = nIdxNextPrev;
break;
}
nCharKind = nCharKindNext;
}else{
if( nCount == 0){
nCharKind = nCharKindNext;
}else{
nIdxNext = nIdxNextPrev;
break;
}
}
}
nCharChars = &pLine[nIdxNext] - CMemory::MemCharPrev( pLine, nLineLen, &pLine[nIdxNext] );
++nCount;
}
*pnColmNew = nIdxNext;
}else{
CDocLineMgr::SearchNextWordPosition(pLine, nLineLen, nIdx, pnColmNew, bStopsBothEnds);
}
return TRUE;
}
/*! 単語検索
@date 2003.05.22 かろと 行頭処理など見直し
*/
/* 見つからない場合は0を返す */
int CDocLineMgr::SearchWord(
int nLineNum, /* 検索開始行 */
int nIdx, /* 検索開始位置 */
const char* pszPattern, /* 検索条件 */
int bPrevOrNext, /* 0==前方検索 1==後方検索 */
int bRegularExp, /* 1==正規表現 */
int bLoHiCase, /* 1==英大文字小文字の区別 */
int bWordOnly, /* 1==単語のみ検索 */
int* pnLineNum, /* マッチ行 */
int* pnIdxFrom, /* マッチ位置from */
int* pnIdxTo, /* マッチ位置to */
// Jun. 26, 2001 genta 正規表現ライブラリの差し替え
CBregexp* pRegexp /*!< [in] 正規表現コンパイルデータ。既にコンパイルされている必要がある */
)
{
//#ifdef _DEBUG
// CRunningTimer cRunningTimer( (const char*)"CDocLineMgr::SearchWord" );
//#endif
CDocLine* pDocLine;
int nLinePos;
int nIdxPos;
const char* pLine;
int nLineLen;
char* pszRes;
int nHitTo;
int nHitPos;
int nHitPosOld;
int nHitLenOld;
int nRetVal;
int* pnKey_CharCharsArr;
// Jun. 10, 2003 Moca
// lstrlenを毎回呼ばずにnPatternLenを使うようにする
const int nPatternLen = lstrlen( pszPattern ); //2001/06/23 N.Nakatani
pnKey_CharCharsArr = NULL;
// int* pnKey_CharUsedArr;
// pnKey_CharUsedArr = NULL;
/* 検索条件の情報 */
CDocLineMgr::CreateCharCharsArr(
(const unsigned char *)pszPattern,
nPatternLen,
&pnKey_CharCharsArr
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -