一括表示

− 野ざらし言 −

[2732] Vzマクロ:出力の仕様?

としき 2008/07/23(Wed) 00:39
http://www.hinocatv.ne.jp/~toshiki/
質問です。
quoted-printable なテキストの変換に、以下のマクロを使っています。

http://www.hinocatv.ne.jp/~toshiki/computer/vz/qp.txt

この中では以下のようなコードを使っています。

        #W &?("%c",c) #W

これが変換した文字の出力に該当する部分だと思います。
かなり長い事このマクロを使ってきたのですが、つい先日、うまく変換して
くれない文字列があることに気がつきました。具体的には =0D=0A という文
字列です。このマクロでは、あたかもその文字列がなかったかのごとく後続
の文字列が継続してしまいます。
だけど、例えばエスカルゴの窓に &?("%c",$0d) とか &?("%c",$0a) なんて
コードを放り込むとそれなりに出力してくれるので、これが機能していない
わけではなさそうです。マクロのかなり最初の部分で ct==1 なんて条件式も
使っていますから、仮にこのコードが機能しないのであるならばどのように
パッチを当てればよいかはわかるのですが、そもそも機能しないという事が
釈然としません。それとも、どれかのコードでヌルに変換されてしまってい
るのでしょうか。

とりあえず、私にはどこが悪いのかわかりません。
どなたか、第三者の目で、問題点を指摘していただけると幸いです。
 

[2733] Re: Vzマクロ:出力の仕様?

めざら 2008/07/23(Wed) 06:18
[2732]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/index.html
 同様のコードで実験してみたところ,$dの後に$aを出力すると改行が出力されましたが,トレース中に面白い現象が見られました。

1 空行を1個だけ作ってその改行上で実行
2 $dを出力すると制御コードの ^M が出力される
3 次に$aを出力すると一瞬で ^M だけが消えたように見える
4 &d #] で再表示すると空行が2行に増えている
5 空行が「挿入」されたのでカーソル位置は後方(上)の空行になる
6 次の文字は挿入された改行位置に出力される

 改行コードを出力すると,出力後の改行位置が所期の位置にならない…次行頭に移動しない…ため,次の出力が改行上に出力されてしまう,という現象ですね。仕様なのでしょうね。

 これは改行を出力した直後に #d を実行するか,あるいは代替文字を出力して最後に改行に変換ということになるでしょうか。

 $a を出力せず,最後に \r → \n 変換するというのが,一番簡単で確実なように錯覚したのですが,これをやると全部の改行が二重になってしまうので,上村さんの $d$a.def のようにすべての \r と \n を \l にしておいてから \n に変換する必要がありますね。ちょっと面倒でしょうか。

[2735] Re^2: Vzマクロ:出力の仕様?

としき 2008/07/23(Wed) 13:53
[2733]へのコメント http://www.hinocatv.ne.jp/~toshiki/
いやぁ、&?() にこんな落とし穴があるとは思ってもみませんでした。
個人的には、仕様に明記されていない以上、バグと表現したいところですが、
ほとんどの人に迷惑が掛っていないのだから、どうでもいいか。

>  これは改行を出力した直後に #d を実行する

これが素直かなぁ。
ちょっとこの方向でトライしてみます。
どうもありがとうございました。
 

[2742] Re^3: Vzマクロ:出力の仕様?

めざら 2008/07/24(Thu) 00:26
[2735]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
> >  これは改行を出力した直後に #d を実行する
>
> これが素直かなぁ。

 もっと素直にやるには,$D が出現したら何も出力せずに改行し,次が $A だったらそれこそ何もしないというのが出力回数も少なくコードも最短だと思います。

 でも,どうかな。$A だけの LF や $D だけの CR が単独で出現したり混在していたりすると,必要な改行が出力されなかったり余計に出力されたりする可能性も高くなりますね。それでもやっぱり改行してしまうのがよいと思いますけど。

[2746] Re^4: Vzマクロ:出力の仕様?

としき 2008/07/24(Thu) 10:13
[2742]へのコメント http://www.hinocatv.ne.jp/~toshiki/
> $D が出現したら何も出力せずに改行し,次が $A だったらそれこそ何もしない

やっぱりこっちですか。
う〜ん、1文字分余分に読むだけだから、このくらいなら大丈夫かな。

> $A だけの LF や $D だけの CR が単独で出現したり混在していたりすると,必要な改行が出力されなかったり余計に出力されたりする

混在はほとんどありえないと考えております。
ただ、エンコードされる前の元の文字コードによっては、確かに LF だけや
CR だけというのはありえますから、う〜ん、どうしようかな。
 

↑ このページの先頭