From 354033d02cff4533b2daf49e13b704adacd6946f Mon Sep 17 00:00:00 2001 From: Katsuhisa Yuasa Date: Thu, 15 Aug 2019 01:36:53 +0900 Subject: [PATCH 1/2] =?UTF-8?q?CViewSelect::PrintSelectionInfoMsg=20?= =?UTF-8?q?=E3=81=AE=E9=AB=98=E9=80=9F=E5=8C=96=20=E7=8F=BE=E5=9C=A8?= =?UTF-8?q?=E3=81=AEEOL=E9=95=B7=E3=82=92=E5=8F=96=E5=BE=97=E3=81=99?= =?UTF-8?q?=E3=82=8B=E5=87=A6=E7=90=86=E3=81=AE=E9=AB=98=E9=80=9F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/CEol.cpp | 8 ++------ sakura_core/CEol.h | 14 +++++++++++++- sakura_core/view/CViewSelect.cpp | 29 +++++++++++++---------------- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/sakura_core/CEol.cpp b/sakura_core/CEol.cpp index 01029a0823..c7053f0d65 100644 --- a/sakura_core/CEol.cpp +++ b/sakura_core/CEol.cpp @@ -55,6 +55,8 @@ struct SEolDefinition{ bool StartsWith(const WCHAR* pData, int nLen) const{ return m_nLen<=nLen && 0==auto_memcmp(pData,m_szDataW,m_nLen); } bool StartsWith(const ACHAR* pData, int nLen) const{ return m_nLen<=nLen && m_szDataA[0] != '\0' && 0==auto_memcmp(pData,m_szDataA,m_nLen); } }; + +/* g_aEolLengths といっしょに保守する事 */ static const SEolDefinition g_aEolTable[] = { { _T("改行無"), L"", "", 0 }, { _T("CRLF"), L"\x0d\x0a", "\x0d\x0a", 2 }, @@ -129,12 +131,6 @@ EEolType _GetEOLType_unibe( const char* pszData, int nDataLen ) // 実装部 //----------------------------------------------- -//! 現在のEOL長を取得。文字単位。 -CLogicInt CEol::GetLen() const -{ - return CLogicInt(g_aEolTable[ m_eEolType ].m_nLen); -} - //! 現在のEOLの名称取得 const TCHAR* CEol::GetName() const { diff --git a/sakura_core/CEol.h b/sakura_core/CEol.h index 63c458dd7a..7aa7be091e 100644 --- a/sakura_core/CEol.h +++ b/sakura_core/CEol.h @@ -48,6 +48,18 @@ enum EEolType { EOL_UNKNOWN = -1 // }; +/* 行終端子の長さ */ +/* g_aEolTable といっしょに保守する事 */ +static const uint8_t g_aEolLengths[] = { + 0, + 2, + 1, + 1, + 1, + 1, + 1, +}; + #define EOL_TYPE_NUM EOL_CODEMAX // 8 /* 行終端子の配列 */ @@ -90,7 +102,7 @@ class CEol{ //取得 EEolType GetType() const{ return m_eEolType; } //!< 現在のTypeを取得 - CLogicInt GetLen() const; //!< 現在のEOL長を取得。文字単位。 + CLogicInt GetLen() const { return CLogicInt(g_aEolLengths[ m_eEolType ]); } //!< 現在のEOL長を取得。文字単位。 const TCHAR* GetName() const; //!< 現在のEOLの名称取得 const wchar_t* GetValue2() const; //!< 現在のEOL文字列先頭へのポインタを取得 //##### diff --git a/sakura_core/view/CViewSelect.cpp b/sakura_core/view/CViewSelect.cpp index cad7ad845b..c4dd3c526b 100644 --- a/sakura_core/view/CViewSelect.cpp +++ b/sakura_core/view/CViewSelect.cpp @@ -673,9 +673,7 @@ void CViewSelect::PrintSelectionInfoMsg() const else { // 通常の選択では選択範囲の中身を数える int select_sum = 0; // バイト数合計 - const wchar_t *pLine; // データを受け取る - CLogicInt nLineLen; // 行の長さ - const CLayout* pcLayout; + const CLayout* __restrict pcLayout; CViewSelect* thiz = const_cast( this ); // const外しthis // 共通設定・選択文字数を文字単位ではなくバイト単位で表示する @@ -685,8 +683,8 @@ void CViewSelect::PrintSelectionInfoMsg() const pView->m_pcEditWnd->m_nSelectCountMode == SELECT_COUNT_BY_BYTE ); // 1行目 - pLine = pView->m_pcEditDoc->m_cLayoutMgr.GetLineStr( m_sSelect.GetFrom().GetY2(), &nLineLen, &pcLayout ); - if( pLine ){ + pcLayout = pView->m_pcEditDoc->m_cLayoutMgr.SearchLineByLayoutY(m_sSelect.GetFrom().GetY2()); + if( pcLayout ){ if( bCountByByte ){ // バイト数でカウント // 内部文字コードから現在の文字コードに変換し、バイト数を取得する。 @@ -701,8 +699,8 @@ void CViewSelect::PrintSelectionInfoMsg() const bool bSelExtend; // 選択領域拡大フラグ // 最終行の処理 - pLine = pView->m_pcEditDoc->m_cLayoutMgr.GetLineStr( m_sSelect.GetTo().y, &nLineLen, &pcLayout ); - if( pLine ){ + pcLayout = pView->m_pcEditDoc->m_cLayoutMgr.SearchLineByLayoutY( m_sSelect.GetTo().y ); + if( pcLayout ){ if( pView->LineColumnToIndex( pcLayout, m_sSelect.GetTo().GetX2() ) == 0 ){ // 最終行の先頭にキャレットがある場合は // その行を行数に含めない @@ -781,19 +779,18 @@ void CViewSelect::PrintSelectionInfoMsg() const // GetSelectedDataと似ているが,先頭行と最終行は排除している // Aug. 16, 2005 aroka nLineNumはfor以降でも使われるのでforの前で宣言する // VC .NET以降でもMicrosoft拡張を有効にした標準動作はVC6と同じことに注意 - CLayoutInt nLineNum; - for( nLineNum = m_sSelect.GetFrom().GetY2() + CLayoutInt(1); - nLineNum < m_sSelect.GetTo().GetY2(); ++nLineNum ){ - pLine = pView->m_pcEditDoc->m_cLayoutMgr.GetLineStr( nLineNum, &nLineLen, &pcLayout ); + CLayoutInt nLineNum = m_sSelect.GetFrom().GetY2() + CLayoutInt(1); + CLayoutInt nLineTo = m_sSelect.GetTo().GetY2(); + pcLayout = pView->m_pcEditDoc->m_cLayoutMgr.SearchLineByLayoutY( nLineNum ); + for( ; nLineNum < nLineTo && pcLayout; ++nLineNum ){ // 2006.06.06 ryoji 指定行のデータが存在しない場合の対策 - if( NULL == pLine ) - break; - select_sum += pcLayout->GetLengthWithoutEOL() + pcLayout->GetLayoutEol().GetLen(); + select_sum += pcLayout->GetLengthWithEOL() - 1 + pcLayout->GetLayoutEol().GetLen(); + pcLayout = pcLayout->GetNextLayout(); } // 最終行の処理 - pLine = pView->m_pcEditDoc->m_cLayoutMgr.GetLineStr( nLineNum, &nLineLen, &pcLayout ); - if( pLine ){ + pcLayout = pView->m_pcEditDoc->m_cLayoutMgr.SearchLineByLayoutY( nLineNum ); + if( pcLayout ){ int last_line_chars = pView->LineColumnToIndex( pcLayout, m_sSelect.GetTo().GetX2() ); select_sum += last_line_chars; if( last_line_chars == 0 ){ From 3dd0ccafc394aee1af2f7b88658bd08b6cd06c73 Mon Sep 17 00:00:00 2001 From: Katsuhisa Yuasa Date: Thu, 15 Aug 2019 12:25:31 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/CEol.cpp | 13 +------------ sakura_core/CEol.h | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/sakura_core/CEol.cpp b/sakura_core/CEol.cpp index c7053f0d65..b2aae22492 100644 --- a/sakura_core/CEol.cpp +++ b/sakura_core/CEol.cpp @@ -46,18 +46,7 @@ const EEolType gm_pnEolTypeArr[EOL_TYPE_NUM] = { // 固定データ //----------------------------------------------- -struct SEolDefinition{ - const TCHAR* m_szName; - const WCHAR* m_szDataW; - const ACHAR* m_szDataA; - int m_nLen; - - bool StartsWith(const WCHAR* pData, int nLen) const{ return m_nLen<=nLen && 0==auto_memcmp(pData,m_szDataW,m_nLen); } - bool StartsWith(const ACHAR* pData, int nLen) const{ return m_nLen<=nLen && m_szDataA[0] != '\0' && 0==auto_memcmp(pData,m_szDataA,m_nLen); } -}; - -/* g_aEolLengths といっしょに保守する事 */ -static const SEolDefinition g_aEolTable[] = { +const SEolDefinition g_aEolTable[] = { { _T("改行無"), L"", "", 0 }, { _T("CRLF"), L"\x0d\x0a", "\x0d\x0a", 2 }, { _T("LF"), L"\x0a", "\x0a", 1 }, diff --git a/sakura_core/CEol.h b/sakura_core/CEol.h index 7aa7be091e..08d6d22aba 100644 --- a/sakura_core/CEol.h +++ b/sakura_core/CEol.h @@ -48,17 +48,16 @@ enum EEolType { EOL_UNKNOWN = -1 // }; -/* 行終端子の長さ */ -/* g_aEolTable といっしょに保守する事 */ -static const uint8_t g_aEolLengths[] = { - 0, - 2, - 1, - 1, - 1, - 1, - 1, +struct SEolDefinition{ + const TCHAR* m_szName; + const WCHAR* m_szDataW; + const ACHAR* m_szDataA; + int m_nLen; + + bool StartsWith(const WCHAR* pData, int nLen) const{ return m_nLen<=nLen && 0==auto_memcmp(pData,m_szDataW,m_nLen); } + bool StartsWith(const ACHAR* pData, int nLen) const{ return m_nLen<=nLen && m_szDataA[0] != '\0' && 0==auto_memcmp(pData,m_szDataA,m_nLen); } }; +extern const SEolDefinition g_aEolTable[]; #define EOL_TYPE_NUM EOL_CODEMAX // 8 @@ -102,7 +101,7 @@ class CEol{ //取得 EEolType GetType() const{ return m_eEolType; } //!< 現在のTypeを取得 - CLogicInt GetLen() const { return CLogicInt(g_aEolLengths[ m_eEolType ]); } //!< 現在のEOL長を取得。文字単位。 + CLogicInt GetLen() const { return CLogicInt(g_aEolTable[ m_eEolType ].m_nLen); } //!< 現在のEOL長を取得。文字単位。 const TCHAR* GetName() const; //!< 現在のEOLの名称取得 const wchar_t* GetValue2() const; //!< 現在のEOL文字列先頭へのポインタを取得 //#####