Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

XML宣言を用いた文字コード判別処理を強化する #1422

Merged
merged 15 commits into from Oct 11, 2020
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
文字数のチェックにループを使わないようにする
  • Loading branch information
Kohki Akikaze committed Oct 6, 2020
commit e821b7cb70bbce4c69a540dacbbea662220cbeb9
5 changes: 2 additions & 3 deletions sakura_core/charset/CESI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -981,9 +981,8 @@ ECodeType CESI::AutoDetectByXML( const char* pBuf, int nSize )
}
quoteChar = pBuf[i];
i++;
int k;
for(k = i; pBuf[k] != quoteChar && k < nSize - 1; ++k){}
return MatchEncoding(pBuf + i, k - i);
std::string sBuf = pBuf;
return MatchEncoding( pBuf + i, sBuf.find_first_of( quoteChar, i ) - i );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このまま進めるみたいなので、スマホから失礼します。
ケチ臭い指摘で大変恐縮ですが、string_viewのほうが例外安全でスケールもしやすいと思います。
string_viewはC++17からでVC2017も対応済みです。
sBufのコンストラクタ引数のpBufは見た感じNUL終端文字列ではないかもしれません。長さも指定するのがおすすめです。
std::string::find_first_ofはstd::find_first_ofと違って、見つからないときに、npos(-1)を返します。npos-iが少し健康的ではない気がします。
(実際の動作上は問題ないですけど、MatchEncodingの長さの引数がマイナス値になります)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます。

確かにNULL終端がないように見えますね。呼び出し元から渡された長さ情報(nSize)を使って、std::string_viewで構築するようにしておきます。
また、MatchEncodingの第2引数が負数だと判定は成功しないはずなので、これを呼ぶ必要はたぶんないです。
encoding指定が引用符で括られていないときは判定を省略しているようなので、find_first_ofnposが返ってきたら指定が閉じられていないものと判断し、同様に取り扱うようにします。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NUL終端は、付けたらいいと思います。
文字列として扱うバイト配列をNUL終端せずに使うことが不自然です。

この辺で確保量を +1 してやればよいはず。

// データ確保
buff = std::make_unique<char[]>(size);

呼出元は他にもあるので、対応するなら網羅する必要ありです。

ここの関数はC++で普通に書いたほうが(≒正規表現で書いたほうが)分かりやすいと思います。
もちろん書換は別件で構わないです。

}else{
if( pBuf[i] == '<' || pBuf[i] == '>' ){
break;
Expand Down