「変換リストによる置換」の仕様No.09931
山紫水明 さん 19/07/06 13:57
 

秀まるおさん,
 「変換リストによる置換]で置換するとき(マクロではない),ある文字全部
を削除しようとして変換先文字列を空欄にした時に「変換元または変換先文字列
が空かまたは区切り文字が入っていない行があります」というエラーメッセージ
が出ます。
 これは仕様でしょうか?

              山紫水明

[ ]
RE:09931 「変換リストによる置換」の仕様No.09934
秀まるお さん 19/07/08 08:23
 
 ソースコードを見た限りはそういう仕様のようで、メッセージを回避する用のオプ
ション類は無いようです。

 変換先文字列は別に空でもダメなことは無いので、変換先についてはメッセージ表
示しないように直してもいいですが、どうでしょうか。直すのは簡単ですけども。

[ ]
RE:09934 「変換リストによる置換」の仕様No.09935
山紫水明 さん 19/07/08 09:31
 
 秀まるおさん,

> 変換先文字列は別に空でもダメなことは無いので、変換先についてはメッ
>セージ表示しないように直してもいいですが、どうでしょうか。直すのは簡単
>ですけども。

https://www.maruo.co.jp/turukame/4/#00559
の投稿で気づいたのですが,拙作マクロでは,正規表現などのオプションが無い
場合,HmfListReplace.hmf がインストールしてあればスピードアップのために
自動的にそちらを使うことになっています。
 マクロでリストをチェックするよりも,変換モジュールの方を直していただい
た方がよさそうなので,修正お願いします。

                    山紫水明

[ ]
RE:09935 「変換リストによる置換」の仕様No.09937
秀まるお さん 19/07/08 11:36
 
 今アップロードしました。

https://hide.maruo.co.jp/lib/hmconv/hmflistreplace140.html

 テストもしたので大丈夫だと思います。

 区切り文字が無い場合はエラーになります。

[ ]
RE:09937 「変換リストによる置換」の仕様No.09940
山紫水明 さん 19/07/08 21:32
 
 秀まるおさん,

> 今アップロードしました。

 確認しました。ありがとうございました。

                    山紫水明

[ ]
RE:09937 「変換リストによる置換」の仕様No.09941
colder さん 19/07/09 03:31
 
細かいバグが3点ほど見つかりました。

1.置換方向が「右 ⇒ 左」のとき、変換元文字列が空でもエラーにならず、
変換先文字列が空のとき、エラーになる。

2.変換元または変換先の文字列が長すぎるときのエラーメッセージが
「ユニコード文字で256文字以下でないとダメです。」とあるが、256文字のときにも
出る。

3.特定のパターンで、秀丸が異常終了する可能性がある。

変換元の文字列が200文字で、変換先の文字列が201文字で、
変換対象に変換元の文字列が大量にある場合、異常終了します。
意図的じゃない限り、まず起こらないと思うけど。

[ ]
RE:09941 「変換リストによる置換」の仕様No.09943
秀まるお さん 19/07/09 09:20
 
 colderさんの鋭いご指摘毎度ありがとうございます。3点とも状況理解して修正さ
せていただきます。

 ソースコードレビューだけで見つけられたんだと思いますけども。

 3番目の件は

int     nEnlargeBy100Temp = (cchConv2 * 100 + 99) / cchConv1;     //切り上げ

 となってた切り上げの式がバグで、

int     nEnlargeBy100Temp = (cchConv2 * 100 + cchConv1 - 1) / cchConv1;    
//切り上げ

 で正解ということで、一応そういう修正をしつつ、変換先のバッファオーバーして
ないか確認する処理も念のため追加させていただきます。

[ ]
RE:09943 「変換リストによる置換」の仕様No.09944
秀まるお さん 19/07/09 11:22
 
 今アップロードしました。

 切り上げの計算ミスは他のソースコードにもあるかもしれないので、

   \+ .+ \) /

 でgrepして他のソースコードも探してみたんですが、一応大丈夫そうでした。とい
うか、切り上げは他ではやって無くて、四捨五入の計算が多々ありましたが、一応大
丈夫そうでした。

int cPoint = ( ( ( pTextMetrics->tmHeight - pTextMetrics->tmInternalLeading
 ) * 72 * 10 ) + sy / 2 ) / sy;

[ ]