Skip to content

Commit df2b805

Browse files
authored
Merge pull request sakura-editor#2403 from berryzplus/feature/omit_binary_sequence
BinarySequenceを削除する
2 parents 914f452 + 0fefffc commit df2b805

10 files changed

Lines changed: 45 additions & 146 deletions

File tree

sakura_core/charset/CCodeBase.cpp

Lines changed: 20 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -94,92 +94,34 @@ bool CCodeBase::MIMEHeaderDecode( const char* pSrc, const int nSrcLen, CMemory*
9494
}
9595

9696
/*!
97-
BOMデータ取得
98-
99-
ByteOrderMarkに対する特定コードによるバイナリ表現を取得する。
100-
マルチバイトなUnicode文字セットのバイト順を識別するのに使う。
97+
* BOMデータ取得
98+
*
99+
* ByteOrderMarkに対する特定コードによるバイナリ表現を取得する。
100+
* マルチバイトなUnicode文字セットのバイト順を識別するのに使う。
101101
*/
102-
[[nodiscard]] BinarySequence CCodeBase::GetBomDefinition()
102+
void CCodeBase::GetBom(CMemory* pcmemBom)
103103
{
104-
const CNativeW cBom( L"\xFEFF" );
105-
106-
bool bComplete = false;
107-
auto converted = UnicodeToCode( cBom, &bComplete );
108-
if( !bComplete ){
109-
converted.clear();
104+
// ByteOrderMarkを特定コードに変換
105+
if (pcmemBom && RESULT_COMPLETE != UnicodeToCode(CNativeW{ &WCODE::BOM, 1 }, pcmemBom)) {
106+
// 変換できなかったらリセットする
107+
pcmemBom->Reset();
110108
}
111-
112-
return converted;
113109
}
114110

115111
/*!
116-
BOMデータ取得
117-
118-
ByteOrderMarkに対する特定コードによるバイナリ表現を取得する。
119-
マルチバイトなUnicode文字セットのバイト順を識別するのに使う。
120-
*/
121-
void CCodeBase::GetBom( CMemory* pcmemBom )
122-
{
123-
if( pcmemBom != nullptr ){
124-
if( const auto bom = GetBomDefinition(); 0 < bom.length() ){
125-
pcmemBom->SetRawData( bom.data(), bom.length() );
126-
}else{
127-
pcmemBom->Reset();
128-
}
129-
}
130-
}
131-
132-
133-
/*!
134-
改行データ取得
135-
136-
各種行終端子に対する特定コードによるバイナリ表現のセットを取得する。
137-
特定コードで利用できない行終端子については空のバイナリ表現が返る。
112+
* 改行データ取得
113+
*
114+
* 指定した行終端子に対する特定コードによるバイナリ表現を取得する。
115+
* コードポイントとバイナリシーケンスが1対1に対応付けられる文字コードの改行を検出するのに使う。
138116
*/
139-
[[nodiscard]] std::map<EEolType, BinarySequence> CCodeBase::GetEolDefinitions()
117+
void CCodeBase::GetEol(CMemory* pcmemEol, EEolType eEolType)
140118
{
141-
constexpr struct {
142-
EEolType type;
143-
std::wstring_view str;
144-
}
145-
aEolTable[] = {
146-
{ EEolType::cr_and_lf, L"\x0d\x0a", },
147-
{ EEolType::line_feed, L"\x0a", },
148-
{ EEolType::carriage_return, L"\x0d", },
149-
{ EEolType::next_line, L"\x85", },
150-
{ EEolType::line_separator, L"\u2028", },
151-
{ EEolType::paragraph_separator, L"\u2029", },
152-
};
153-
154-
std::map<EEolType, BinarySequence> map;
155-
for( auto& eolData : aEolTable ){
156-
bool bComplete = false;
157-
const auto& str = eolData.str;
158-
auto converted = UnicodeToCode( CNativeW( str.data(), str.length() ), &bComplete );
159-
if( !bComplete ){
160-
converted.clear();
161-
}
162-
map.try_emplace( eolData.type, std::move(converted) );
163-
}
164-
165-
return map;
166-
}
119+
// 指定された行終端子を取得
120+
const CEol cEol{ eEolType };
167121

168-
/*!
169-
改行データ取得
170-
171-
指定した行終端子に対する特定コードによるバイナリ表現を取得する。
172-
コードポイントとバイナリシーケンスが1対1に対応付けられる文字コードの改行を検出するのに使う。
173-
*/
174-
void CCodeBase::GetEol( CMemory* pcmemEol, EEolType eEolType )
175-
{
176-
if( pcmemEol != nullptr ){
177-
const auto map = GetEolDefinitions();
178-
if( auto it = map.find( eEolType ); it != map.end() ){
179-
const auto& bin = it->second;
180-
pcmemEol->SetRawData( bin.data(), bin.length() );
181-
}else{
182-
pcmemEol->Reset();
183-
}
122+
// 行終端子(UNICODE文字列)を特定コードに変換
123+
if (pcmemEol && 0 < cEol.GetLen() && RESULT_COMPLETE != UnicodeToCode(CNativeW{ cEol.GetValue2(), size_t(cEol.GetLen()) }, pcmemEol)) {
124+
// 変換できなかったらリセットする
125+
pcmemEol->Reset();
184126
}
185127
}

sakura_core/charset/CCodeBase.h

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,6 @@ enum EConvertResult{
2727

2828
struct CommonSetting_Statusbar;
2929

30-
//! 変換元バイナリシーケンスを表す型。
31-
using BinarySequenceView = std::basic_string_view<std::byte>;
32-
33-
//! 復元後バイナリシーケンスを表す型。
34-
using BinarySequence = std::basic_string<std::byte>;
35-
3630
//! A→W変換結果
3731
struct SLoadFromCodeResult {
3832
//! 読み込み結果
@@ -79,41 +73,6 @@ class CCodeBase{
7973
public:
8074
virtual ~CCodeBase() noexcept = default;
8175

82-
/*!
83-
特定コードをUnicodeにエンコードする
84-
85-
@param [in] cSrc 変換対象のバイナリシーケンス
86-
@param [out,opt] pResult 変換結果を受け取る変数
87-
@returns サクラエディタ仕様のUnicode文字列
88-
*/
89-
virtual CNativeW CodeToUnicode( BinarySequenceView cSrc, bool* pResult = nullptr )
90-
{
91-
CMemory cmemSrc( cSrc.data(), cSrc.size() );
92-
CNativeW cDest;
93-
auto result = CodeToUnicode( cmemSrc, &cDest );
94-
if( pResult ){
95-
*pResult = result == RESULT_COMPLETE;
96-
}
97-
return cDest;
98-
}
99-
100-
/*!
101-
Unicodeを特定コードにデコードする
102-
103-
@param [in] cSrc 変換対象のUnicodeシーケンス
104-
@param [out,opt] pResult 変換結果を受け取る変数
105-
@returns バイナリシーケンス
106-
*/
107-
virtual BinarySequence UnicodeToCode( const CNativeW& cSrc, bool* pResult = nullptr )
108-
{
109-
CMemory cDest;
110-
auto result = UnicodeToCode( cSrc, &cDest );
111-
if( pResult ){
112-
*pResult = result == RESULT_COMPLETE;
113-
}
114-
return BinarySequence( static_cast<std::byte*>(cDest.GetRawPtr()), cDest.GetRawLength() );
115-
}
116-
11776
//文字コード変換
11877
virtual EConvertResult CodeToUnicode(const CMemory& cSrc, CNativeW* pDst)=0; //!< 特定コード → UNICODE 変換
11978
virtual EConvertResult UnicodeToCode(const CNativeW& cSrc, CMemory* pDst)=0; //!< UNICODE → 特定コード 変換
@@ -124,10 +83,8 @@ class CCodeBase{
12483
}
12584

12685
//ファイル形式
127-
[[nodiscard]] virtual BinarySequence GetBomDefinition();
128-
void GetBom( CMemory* pcmemBom );
129-
[[nodiscard]] virtual std::map<EEolType, BinarySequence> GetEolDefinitions();
130-
void GetEol( CMemory* pcmemEol, EEolType eEolType );
86+
void GetBom(CMemory* pcmemBom);
87+
void GetEol(CMemory* pcmemEol, EEolType eEolType);
13188

13289
// 文字コードの16進表示
13390
// 文字コード表示用 2008/6/9 Uchi

sakura_core/charset/CEuc.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ class CEuc : public CCodeBase{
1919
//CCodeBaseインターフェース
2020
EConvertResult CodeToUnicode(const CMemory& cSrc, CNativeW* pDst) override{ return EUCToUnicode(cSrc, pDst); } //!< 特定コード → UNICODE 変換
2121
EConvertResult UnicodeToCode(const CNativeW& cSrc, CMemory* pDst) override{ return UnicodeToEUC(cSrc, pDst); } //!< UNICODE → 特定コード 変換
22-
// GetEolはCCodeBaseに移動 2010/6/13 Uchi
2322
EConvertResult UnicodeToHex(const wchar_t* cSrc, const int iSLen, WCHAR* pDst, const CommonSetting_Statusbar* psStatusbar) override; //!< UNICODE → Hex 変換
2423

2524
public:

sakura_core/charset/CJis.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ class CJis : public CCodeBase{
1919
//CCodeBaseインターフェース
2020
EConvertResult CodeToUnicode(const CMemory& cSrc, CNativeW* pDst) override{ return JISToUnicode(cSrc, pDst, m_base64decode); } //!< 特定コード → UNICODE 変換
2121
EConvertResult UnicodeToCode(const CNativeW& cSrc, CMemory* pDst) override{ return UnicodeToJIS(cSrc, pDst); } //!< UNICODE → 特定コード 変換
22-
// GetEolはCCodeBaseに移動 2010/6/13 Uchi
2322
EConvertResult UnicodeToHex(const wchar_t* cSrc, const int iSLen, WCHAR* pDst, const CommonSetting_Statusbar* psStatusbar) override; //!< UNICODE → Hex 変換
2423

2524
public:

sakura_core/charset/CShiftJis.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,12 @@ class CShiftJis : public CCodeBase{
2121
//CCodeBaseインターフェース
2222
EConvertResult CodeToUnicode(const CMemory& cSrc, CNativeW* pDst) override{ return SJISToUnicode(cSrc, pDst); } //!< 特定コード → UNICODE 変換
2323
EConvertResult UnicodeToCode(const CNativeW& cSrc, CMemory* pDst) override{ return UnicodeToSJIS(cSrc, pDst); } //!< UNICODE → 特定コード 変換
24-
// GetEolはCCodeBaseに移動 2010/6/13 Uchi
2524
EConvertResult UnicodeToHex(const wchar_t* cSrc, const int iSLen, WCHAR* pDst, const CommonSetting_Statusbar* psStatusbar) override; //!< UNICODE → Hex 変換
2625

2726
public:
2827
//実装
2928
static EConvertResult SJISToUnicode(const CMemory& cSrc, CNativeW* pDstMem); // SJIS → Unicodeコード変換
3029
static EConvertResult UnicodeToSJIS(const CNativeW& cSrc, CMemory* pDstMem); // Unicode → SJISコード変換
31-
// S_GetEolはCCodeBaseに移動 2010/6/13 Uchi
3230
// 2005-09-02 D.S.Koba
3331
// 2007.08.14 kobake CMemoryからCShiftJisへ移動
3432
static int GetSizeOfChar( const char* pData, int nDataLen, int nIdx ); //!< 指定した位置の文字が何バイト文字かを返す

sakura_core/charset/charcode.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ constexpr int CP_SJIS = 932;
2424
//UNICODE定数
2525
namespace WCODE{
2626
//文字
27+
constexpr wchar_t BOM = L'\ufeff';
2728
constexpr wchar_t TAB = L'\t';
2829
constexpr wchar_t SPACE = L' ';
2930
constexpr wchar_t CR = L'\r';

sakura_core/convert/CConvert_CodeAutoToSjis.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@ CConvert_CodeAutoToSjis::CConvert_CodeAutoToSjis(const SEncodingConfig& sEncodin
2626
bool CConvert_CodeAutoToSjis::DoConvert(CNativeW* pcData)
2727
{
2828
// Shift-JISに変換する(変換エラーは無視する)
29-
const auto bin = CCodeFactory::CreateCodeBase(CODE_SJIS)->UnicodeToCode(*pcData);
29+
CMemory cmemSjis;
30+
CCodeFactory::CreateCodeBase(CODE_SJIS)->UnicodeToCode(*pcData, &cmemSjis);
3031

3132
// バイナリシーケンスの文字コードを自動検出する
3233
CCodeMediator m(m_sEncodingConfig);
33-
ECodeType eCodeType = m.CheckKanjiCode(reinterpret_cast<const char*>(bin.data()), bin.length());
34+
ECodeType eCodeType = m.CheckKanjiCode(LPCSTR(cmemSjis.GetRawPtr()), size_t(cmemSjis.GetRawLength()));
3435

3536
// 検出された文字コードに基づいて変換に使うCCodeBaseを生成する
3637
std::unique_ptr<CCodeBase> pcCodeBase;
@@ -56,7 +57,7 @@ bool CConvert_CodeAutoToSjis::DoConvert(CNativeW* pcData)
5657
}
5758

5859
// 検出された文字コードに基づいてUnicode変換する(変換エラーは無視する)
59-
*pcData = pcCodeBase->CodeToUnicode(bin);
60+
pcCodeBase->CodeToUnicode(cmemSjis, pcData);
6061

6162
return true;
6263
}

sakura_core/convert/CConvert_CodeFromSjis.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ bool CConvert_CodeFromSjis::DoConvert(CNativeW* pcData)
2626
{
2727
// バッファ内容をANSI版相当に変換(Unicode→SJIS)後に SJIS→xxx 変換するのと等価な結果を得るために
2828
// Unicode→xxx 変換する
29-
const auto bin = CCodeFactory::CreateCodeBase(m_eCodeType)->UnicodeToCode(*pcData);
29+
CMemory m;
30+
CCodeFactory::CreateCodeBase(m_eCodeType)->UnicodeToCode(*pcData, &m);
3031

3132
// バッファ内容をUNICODE版相当に戻すために SJIS→Unicode 変換する
32-
*pcData = CCodeFactory::CreateCodeBase(CODE_SJIS)->CodeToUnicode(bin);
33+
CCodeFactory::CreateCodeBase(CODE_SJIS)->CodeToUnicode(m, pcData);
3334

3435
return true;
3536
}

sakura_core/convert/CConvert_CodeToSjis.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ CConvert_CodeToSjis::CConvert_CodeToSjis(ECodeType eCodeType) noexcept
2525
bool CConvert_CodeToSjis::DoConvert(CNativeW* pcData)
2626
{
2727
// バッファの内容がANSI版相当になるよう Unicode→SJIS 変換する
28-
const auto bin = CCodeFactory::CreateCodeBase(CODE_SJIS)->UnicodeToCode(*pcData);
28+
CMemory cmemSjis;
29+
CCodeFactory::CreateCodeBase(CODE_SJIS)->UnicodeToCode(*pcData, &cmemSjis);
2930

3031
// xxx→SJIS 変換後にバッファ内容をUNICODE版相当に戻す(SJIS→Unicode)のと等価な結果を得るために
3132
// xxx→Unicode 変換する
@@ -40,7 +41,7 @@ bool CConvert_CodeToSjis::DoConvert(CNativeW* pcData)
4041
}
4142

4243
// 指定された文字コードに基づいてUnicode変換する(変換エラーは無視する)
43-
*pcData = pcCodeBase->CodeToUnicode(bin);
44+
pcCodeBase->CodeToUnicode(cmemSjis, pcData);
4445

4546
return true;
4647
}

src/test/cpp/tests1/test-ccodebase.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -718,33 +718,33 @@ INSTANTIATE_TEST_SUITE_P(GetEolCases
718718
GetEolTestParam{ CODE_SJIS, EEolType::cr_and_lf, "\r\n" },
719719
GetEolTestParam{ CODE_SJIS, EEolType::line_feed, "\n" },
720720
GetEolTestParam{ CODE_SJIS, EEolType::carriage_return, "\r" },
721-
GetEolTestParam{ CODE_SJIS, EEolType::next_line, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
722-
GetEolTestParam{ CODE_SJIS, EEolType::line_separator, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
723-
GetEolTestParam{ CODE_SJIS, EEolType::paragraph_separator, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
721+
GetEolTestParam{ CODE_SJIS, EEolType::next_line, {} },
722+
GetEolTestParam{ CODE_SJIS, EEolType::line_separator, {} },
723+
GetEolTestParam{ CODE_SJIS, EEolType::paragraph_separator, {} },
724724

725725
GetEolTestParam{ CODE_JIS, EEolType::none, {} },
726726
GetEolTestParam{ CODE_JIS, EEolType::cr_and_lf, "\r\n" },
727727
GetEolTestParam{ CODE_JIS, EEolType::line_feed, "\n" },
728728
GetEolTestParam{ CODE_JIS, EEolType::carriage_return, "\r" },
729-
GetEolTestParam{ CODE_JIS, EEolType::next_line, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
730-
GetEolTestParam{ CODE_JIS, EEolType::line_separator, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
731-
GetEolTestParam{ CODE_JIS, EEolType::paragraph_separator, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
729+
GetEolTestParam{ CODE_JIS, EEolType::next_line, {} },
730+
GetEolTestParam{ CODE_JIS, EEolType::line_separator, {} },
731+
GetEolTestParam{ CODE_JIS, EEolType::paragraph_separator, {} },
732732

733733
GetEolTestParam{ CODE_EUC, EEolType::none, {} },
734734
GetEolTestParam{ CODE_EUC, EEolType::cr_and_lf, "\r\n" },
735735
GetEolTestParam{ CODE_EUC, EEolType::line_feed, "\n" },
736736
GetEolTestParam{ CODE_EUC, EEolType::carriage_return, "\r" },
737-
GetEolTestParam{ CODE_EUC, EEolType::next_line, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
738-
GetEolTestParam{ CODE_EUC, EEolType::line_separator, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
739-
GetEolTestParam{ CODE_EUC, EEolType::paragraph_separator, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
737+
GetEolTestParam{ CODE_EUC, EEolType::next_line, {} },
738+
GetEolTestParam{ CODE_EUC, EEolType::line_separator, {} },
739+
GetEolTestParam{ CODE_EUC, EEolType::paragraph_separator, {} },
740740

741741
GetEolTestParam{ CODE_LATIN1, EEolType::none, {} },
742742
GetEolTestParam{ CODE_LATIN1, EEolType::cr_and_lf, "\r\n" },
743743
GetEolTestParam{ CODE_LATIN1, EEolType::line_feed, "\n" },
744744
GetEolTestParam{ CODE_LATIN1, EEolType::carriage_return, "\r" },
745-
GetEolTestParam{ CODE_LATIN1, EEolType::next_line, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
746-
GetEolTestParam{ CODE_LATIN1, EEolType::line_separator, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
747-
GetEolTestParam{ CODE_LATIN1, EEolType::paragraph_separator, "" }, // 👈バグ。存在しないのでstd::nulloptを返すべき
745+
GetEolTestParam{ CODE_LATIN1, EEolType::next_line, {} },
746+
GetEolTestParam{ CODE_LATIN1, EEolType::line_separator, {} },
747+
GetEolTestParam{ CODE_LATIN1, EEolType::paragraph_separator, {} },
748748

749749
GetEolTestParam{ CODE_UTF7, EEolType::none, {} },
750750
GetEolTestParam{ CODE_UTF7, EEolType::cr_and_lf, "\r\n" },

0 commit comments

Comments
 (0)