一括表示

− 野ざらし言 −

[1268] 大小同一言語用stkhelpの改造

めざら 2006/11/03(Fri) 06:22
<mezala@nifty.com> http://homepage3.nifty.com/mezala/
 html.shd の時にきちんと要望しておくべきものだったのですが,
htmlや通常のプログラミング言語のように,
キーワードを大文字・小文字どちらでも書くものはいくらもあります。
しかし,現状では stkhelp.def では大小文字を区別して厳密に検索します。

 そこで汎用的に使用できる改造方法を考えてみました。

 結果は,かなり泥臭い手法になってしまうのですが,
.shd 毎の切り出しルーチンで ec を有効とし,
検索時のオプションに \c を加えるというものです。

 ec をそのまま変更しても,実際には検索時に無効になってしまうので,
どうしても stkhelp のメインルーチンの一部を弄らざるを得ません。

 メインルーチンの中に,次のローカルマクロがあります。
04:     ; --- キーワードの検索 ---
 この中のラベル B に次のコードがあります。
:B      &Sh(f,g)
        &10
        #F "\i" (fb)?{'c' fb-,} &?(" @%s ",f) #m        ; set mp=2

 この \i が↑他の検索オプションを無効にしてしまう効果があるようで,
ここに明示的に \c を加える必要があります。

        #F "\i" (ec)?'c' (fb)?{'c' fb-,} &?(" @%s ",f) #m        ; set mp=2
                ~~~~~~~~

 こうすると,ecがオンであれば,検索文字列の前に「\ic」が挿入され
@ キーワードを大小同一視で.shd を走査できるようになります。

 このうえで,独自の切り出しルーチンで ec+, としておけばよいことになります。

 なお,編集スイッチは Je[, で元々保護してありますから心配ありません。

 perl.shd 用の切り出しルーチンはまだ完成していませんが,
最小で次のようになります。

65 "CGI PERL" >>
66 "PL  PERL"
        ?.
        &29
        >78
20:     ;大小同一,末尾';'
        ec+,
        &f(';',g) (r>0)?g.r-,

 さて,もう少し何とかしなければですが,使い込んでから拡張でよいでしょう。

[1269] Re: 大小同一言語用stkhelpの改造

文太 2006/11/03(Fri) 15:49
[1268]へのコメント
めざらさん、おめでとうございます、一歩前進ですね。

 うーん、なのですが、

> しかし,現状では stkhelp.def では大小文字を区別して厳密に検索します。(0)

 ここで躓いてしまいました。確かに大文字・小文字同一視が、後述の問題点を
除くと、perl.shd では可能になりました。

 問題点とは、
(1) &f(';',g) (r>0)?g.r-,では、どうもperlでの「式の終わり」を意味す
る';'をはじいてくれないようである
(2) より本質的に、perl.shdでこの同一視が有効であるべきなのか
 という点です。

 (1)は、test.pl  上で、-s, -S(-s; -S;)で確認しました。ファイルテス
ト演算子をとるか、コマンドラインオプションをとるか、という選択はあるので
すが(僕は前者に傾いています、前と違って)、perl.shd  に関していえば、同
一視がないほうがよいのではないかと考えています。perl  で大小両方あり、と
いうキーワードがありましたっけ?


 そして、同系統の問題として、

(1)f_call.shdでは同一視ができている(ようだ)

---test.asm---
        dx=pr, ax=$3C00, cx-,&i($21)            ;ハンドルで作成
        dx=pr, ax=$3c00, cx-,&i($21)            ;ハンドルで作成
--------------
 で確認。(但し、f_call.shd には @3c のキーワードはなく、対象ファイル上
の 3c と 3C を後者に丸めてしまえばよい。そうしているのかは分かりませんけ
れど。)

(2)sed.shdでは、
---test.sed---
H
h
--------------
 では、上の大文字でハングってしまいます。無限ループよりひどい感じ。マク
ロバッファをずたずたにしているみたい。文字ブロックしてもほぼ同じ。この場
合には、ずたずたにまではしてなさそうですが。


 一歩進んだところで、こんなレスで申し訳ないのですが、(0)の部分で、汎
用という願いからいえば、まだ問題が残っているように考えている次第です。

 おそらく、このすれ違いは、html.shd  を僕が迂回してしまっているからだと
思うのですが、ご考慮いただければ幸いです。

[1270] スレッドごと削除が相当しますが…

めざら 2006/11/04(Sat) 10:16
[1269]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
 %Title%かも。でも,迷走を自戒するため残しておきます。

 うーむ,疲れていたのかなぁ。いくらなんでも視野が狭すぎるわたし。(^^;

 saki... さんは,ちゃんと大小同一用のフラグを用意してくださっていたのでした。

  #F "\i" (ec)?'c' (fb)?{'c' fb-,} &?(" @%s ",f) #m        ; set mp=2
          --(1)--  ----(2)--------

 (1)と(2)は,戻す以外は同じことをやってますよね。なんなんだ,一体。
掲示板書込み時に限らず,その後いくども見てるのに気付かないなんて…。

 …というわけで,ec 指定は撤回して,
仕様通りの fb を独自切出しルーチンのローカル 20:で立てることにします。

(0) fb 立てが仕様なので,saki...さんが既に対応済みです。

(1) 「式の終わり」のセミコロンを取り去る件
 これ,手元ではきちんとはじいているのです。
転記違いということはありませんか?
いろいろアホやってるので,自信がなくなってきましたが,
改めてコードを見る限り問題はないようで…。
テストしていただけるなら以下のようにしてみてトレースしてみてください。

67 "CGI PERL" >>
67 "PL  PERL"
        ?.
        &29
        >78
20:     &f(';',g) (r>0)?g.r-,
        &t &m("%s",g)                   ;g の文字列を表示

 あ,改めて言うまでもないとは思いますが,
ローカル 04:のラベル:B は元に戻してください。

(2) より本質的に、perl.shdでこの同一視が有効であるべきなのか
 おおー,わたしは関数のことしか頭になくて,
ファイルテスト演算子やコマンドラインオプションで大小区別が必要であることを
すっかり忘れていました。(^^; 大小同一は撤回します。
 人様の作られた.pl や.cgi を見ていると,
関数名を大小混在して書く例は見当たりませんでしたので問題ないですね。


> (1)f_call.shdでは同一視ができている(ようだ)

 これは,小文字で書いてあっても大文字に変換しているんです。
ローカルの 26:かな。内部的に十六進数として取得し,再出力してますね。

> (2)sed.shdでは、(中略)ハングってしまいます。無限ループよりひどい感じ。

 これは,そういった要素はないはずなんですけどね。
うーむ,ローカル 04:のラベル:B は元に戻して再度試してみてください。

>  一歩進んだところで、こんなレスで申し訳ないのですが、(0)の部分で、汎
> 用という願いからいえば、まだ問題が残っているように考えている次第です。

 いえいえ,既に対応されていたものを読み切れなくてボケたのはわたしです。
曝書中にトシ不相応の作業を連日続け,曝書明けの土日勤務でへとへとになり,
月曜休みのあとは毎日残業(当然残業代は出ません)して,昨日の祝日勤務。
偽病休しっぱなしで給料出ていた奈良の公務員とはえらい違いだなぁ。(笑)
寝床で半分居眠りしながら LX ひろげていても,ろくに進展しないし。

 遅々として進みませんが,なにとぞもう少々お付き合いくださいませ。m(_'_)m

[1271] Re: スレッドごと削除が相当しますが…

文太 2006/11/04(Sat) 22:15
[1270]へのコメント
めざらさん

 ありがとうございました。また手数をお掛けしてしまってすいません。

> (1) 「式の終わり」のセミコロンを取り去る件
> 転記違いということはありませんか?

 はい、以下の箇所でした。

> テストしていただけるなら以下のようにしてみてトレースしてみてください。

 ばっちりです。

67 "PL  PERL"
        ?.
        &29
        >78             ;ここが77でした。


>> (2)sed.shdでは、(中略)ハングってしまいます。無限ループよりひどい感じ。
> これは,そういった要素はないはずなんですけどね。
>うーむ,ローカル 04:のラベル:B は元に戻して再度試してみてください。

 いえいえ、今回のめざらさんの改造(スレッド消去?)とは無関係に起こって
います。おそらく v1.60 β 11 からのものだと思うのですが…。
 よろしければ、一度、

---test.sed---
H
h
--------------

上で、試していただけませんでしょうか。H で無限ループだと思いますので、注
意して。

 以下のように★行を追加してトレースして追っかけたのですが、

33: ;--- メニューor表示項目スキャン ---
    &m("%c",d..(i&3))   ;#DISPLAY+
        &d&t &m("%s",g)                 ;g の文字列を表示★

    #> #d                               ;何してるのでしょう?see ◆
    (cd)>!{
        @ >Z
        (';') >^
        ($0D) >^
    }

    &35
    
    >^


35: ;--- 
    ;-->
    ;  csr : find line top
    ;  x : work bufer
    ;<--
    ;  (x) : menu str ($ convert)
    ;  l : str length (after convert)
    ;  b,q,i
    ;
    #b #> ps=x,#G l=r,ps=g,
    &SF(x,9) (r)?r-=x,?r=l,(r>w)?w=r,
;#ESC+
    (fi)?.
    r+=x,
:L  (r-x>1)?{       ; 先頭の $ はエスケープしない
        (r--.0!='$')?>L                         ;■このあたり
        r[,&SF("PA",r.1) (r) r],?>L             ;■で無限ループ
        (l+1<x..-1)?{&Sm(r+1,r,l++) >L}?fy+,    ;■していると思う。


◆何をしているのか
------------------------------
@H_ @H 
バッファ
 H ホールドスペースにアペンド (2 hold)
------------------------------

 これが sed.shd 該当部分です。#>#d で「バッファ」の行を取得するのは分か
る(1)。更に「H ホールドスペースに」も #G で取得しています(2)。これ
が正常動作なんでしょうか。

 (1)はメニューを作るのに必要ですよね。
 (2) は、ここにキーワードと同じ文字「H」を入れないとメニューが乱れて
しまう .shd の書式(文法)は、辛い経験から知るにいたっています。でも、こ
こで、両方取得するのでしょうか。

 もっと本質的には、 2つ取得するとして、そのあと L ラベルでどうして無限
ループするのか?

 こんなところです。再現しないと通じないのですが。

 また、perl.shd  の話から逸れて(それのもっとも本質的な問題は、$ を含む
キーワードだったはず)しまい、申し訳ありませんが。

>>(1)f_call.shd では同一視ができている(ようだ)
> これは,小文字で書いてあっても大文字に変換しているんです。
> ローカルの 26: かな。内部的に十六進数として取得し,再出力してますね。

 お教えありがとうございました。

>  いえいえ,既に対応されていたものを読み切れなくてボケたのはわたしです。
>曝書中にトシ不相応の作業を連日続け,曝書明けの土日勤務でへとへとになり,

 「ばくしょ」。やはりバグ避け(笑)に陽に晒すわけですか。
 青ラクダが絶版とのことで、いよいよ図書館のお世話になります。でも、そん
な(ちょっと口はばったいけど)良心的な図書館員さんのお陰でちゃんと本が読
めるので、ありがたいです。でも、お体は大切に。「労働者よ団結せよ」ではぜ
んぜん解決しない問題が、常に現場にはありますからね。(こんな言葉遣いをし
たらクビにされそうだ)

[1272] 別の .shd ファイルで確認を

めざら 2006/11/05(Sun) 10:07
[1271]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
 セミコロンの件,ほっとしました。

 で,無限ループの件ですが,うちではそのような現象は出ていないんです。
文太版の sed.shd を見ると,わたしもよくは解らないのですが,
微妙に .shd の書式と異なるように思ったりもするのですが…。
手元にある 2004/11/18の版では特に問題ありませんでしたが,
その後,文太さんの手元でバージョンを上げる過程で発生とか。

 まずは,初期(2004/11/01〜11/04)の版でやってみてください。

 なお,無限ループを疑われているローカル 35:ラベル:L ですが,
確かにトレースしているととんでもなく時間がかかりますけれど,
バッファの内容を後ろからスキャンしているので正常な動作です。
.shd の内容が濃いなら,ループの回数も数十回にものぼります。
トレースだとトンでもなく時間がかかっているように見えますが,
メモリのスキャンなので通常はあまり時間はかかっていません。

> ◆何をしているのか

 動的メニューで表示するためのアイテムを取得して,
メニュー中で化けそうな $ があればエスケープ処理しています。

 状況によりますけれど,グループ項目を検索して,
個々の表示アイテム(各項目のタイトル)を収集しているのは
トップメニューからグループ項目を選択した場合の動作です。
このときグループ項目は各項目を取得するために検索するだけで,
取得はしていません。

> 更に「H ホールドスペースに」も #G で取得しています(2)。

>  (2) は、ここにキーワードと同じ文字「H」を入れないとメニューが乱れて

 メニューが乱れるというのはよくわかりませんが,
メニュータイトルに表示されているのはグループ項目なので,
キーワードを入れずに意味だけ入れても何のことか不明な時があるでしょう。
例えば,トップメニューから下位メニューをたどっていった場合などです。
キーワード上にカーソルを置いて起動した時は分かりきったことでも,
辞書にキーワード項目が最初に書いてあるように必要だと思いますが…。

 あと,参照項目を選択してジャンプする時に必要だったりするでしょうか。


>  また、perl.shd の話から逸れて(それのもっとも本質的な問題は、$ を含む
> キーワードだったはず)しまい、申し訳ありませんが。

 これについては,特別切出しルーチンを作る過程で考えていけばよいかと思います。
作るだけ作って動作はあまり確認していないの。(^^;
だって,まだ perl のスクリプトを書くことに本腰で取り組んでいませんから。

[1273] Re: 別の .shd ファイルで確認を

文太 2006/11/05(Sun) 12:18
[1272]へのコメント
めざらさん

 今日はまとまった時間が取れそうもないので、とりあえず試行錯誤なしのレス
で失礼します。

>  セミコロンの件,ほっとしました。

 すいませんでした。僕も間違いが見つかりほっとしました。助かりました。

>  で,無限ループの件ですが,うちではそのような現象は出ていないんです。

 あらら。そうですか、stkhekp.defでなく、sed.shdに問題がありそうなんです
ね。うーん。大して変化してないはずなんだけど…。参ったなぁ。

> 文太版の sed.shd を見ると,わたしもよくは解らないのですが,
> 微妙に .shd の書式と異なるように思ったりもするのですが…。
> 手元にある 2004/11/18の版では特に問題ありませんでしたが,
> その後,文太さんの手元でバージョンを上げる過程で発生とか。

 了解です。 まずsed.shdを過去に戻りながら試してみます。ありがとうござい
ました。


>  なお,無限ループを疑われているローカル 35:ラベル:L ですが,
(中略)
> メモリのスキャンなので通常はあまり時間はかかっていません。

 了解。根性でトレースしてみます。

> > ◆何をしているのか
>  動的メニューで表示するためのアイテムを取得して,
> メニュー中で化けそうな $ があればエスケープ処理しています。

 かたじけないです。

> トップメニューからグループ項目を選択した場合の動作です。
> このときグループ項目は各項目を取得するために検索するだけで,
> 取得はしていません。

 あり? これが変だぞ。

>> 更に「H ホールドスペースに」も #G で取得しています(2)。
>>  (2) は、ここにキーワードと同じ文字「H」を入れないとメニューが乱れて
>
> メニューが乱れるというのはよくわかりませんが,
>メニュータイトルに表示されているのはグループ項目なので,
>キーワードを入れずに意味だけ入れても何のことか不明な時があるでしょう。
>例えば,トップメニューから下位メニューをたどっていった場合などです。

 ここはですね、確かにご指摘のとおり「人間に意味が分からない」ということ
もありますが、メニュー遡りが効かない、という困った副作用もあるはずだと思
っています。

>  あと,参照項目を選択してジャンプする時に必要だったりするでしょうか。

 ジャンプはリンクがあればできたと思いますが、 そうでない場合、 いったん
stkhelpを終了しないと身動きできなくなると思いますが…。

> 特別切出しルーチンを作る過程で考えていけばよいかと思います。
> 作るだけ作って動作はあまり確認していないの。(^^;
> だって,まだ perl のスクリプトを書くことに本腰で取り組んでいませんから。

 ですね。スクリプトがなくてshdを作るのは、やはり大変。
 気分転換に、遊びのperlスクリプトを写しましょう。でも面白いのがなくて。
 そうそう、いちおうperl用切り出しルーチンについていえば、(?!> みたいなの
を切らないまま検索したいですね。忘れないように書いておいているだけです。
m(__)m

[1275] Re: 別の .shd ファイルで確認を

文太 2006/11/05(Sun) 22:48
[1272]へのコメント
めざらさん

 いちおう確認だけさせていただいて宜しいでしょうか。
 大した追跡調査をしていないのですが、stkhelp β8とβ11での比較実験か
ら入ったら、β8だと問題なく sed.shd  最新版が動くのです。参ったな、とい
うところなんです。

 で、無限ループが再現しなかったの stkhelp はβ11ですよね。そして sed.
shd は 2004/11/18 のほとんど初版ですよね。

 たぶん再現しないのは、そのあたりの違いによるものだろうと思っているわけ
です。

> 文太版の sed.shd を見ると,わたしもよくは解らないのですが,
> 微妙に .shd の書式と異なるように思ったりもするのですが…。

 で、この「微妙な書式の違い」は、どこでそう思われましたでしょうか。
 宜しければお教えください。

[1276] Re^2: 別の .shd ファイルで確認を

文太 2006/11/05(Sun) 23:20
[1275]へのコメント
めざらさん

 sed.shd 2004/11/01 + stkhelp β11では確かに再現しませんでした。
 しかし、sed.shd 2006/09/08 + stkhelp β11ではきっと再現し、
     sed.shd 2006/09/08 + stkhelp β8では再現しません。

 最悪の組み合わせみたいです…。とほほ。書式の違いですぐ僕が気づいたのは、

sed.shd 2004/11/01 では

@h_ @H_ @h @H 
バッファ
 h / H  ホールドスペースへの保持(hold)
   h  パターンスペースの内容をホールドスペースに上書きで複写する。
   H  パターンスペースの内容をホールドスペースに追加で複写する。

と大小がそもそも sed.shd  で区別されていないという点です。他に何か気づか
れましたでしょうか。

[1277] Re^3: 別の .shd ファイルで確認を

文太 2006/11/06(Mon) 01:11
[1276]へのコメント
めざらさん

 ほんと他力本願モードで申し訳ありませんが、β8とβ11では、例の該当個
所のコード及びロジックが違っていますね。sed.shd のフォーマットエラーとい
うより(その可能性はまだ十分ありますが)、ここがネックなんだろう、とまで
詰めました(大した進歩でなくて残念ですが)。

 β11では、$の扱いの仕様が変わっているのですから、$をスキャンしてい
る、ローカル 33:, 34:, 35: のコードが変わっているのは当たり前なのですが、
読み切れますでしょうか。

 &35  は、33 と 34 から呼ばれていますので、β11で共通部分を外に出して
いるのだと思います。それでも追加された部分で、前になかった .shd のフォー
マット制限が厳しくなっていると思います。

 とりわけ、「(l+b<q) だとハング」の saki. さんメモが気になるのですが。
 これは安直すぎなのかもしれないですが。切り出す時点でHだけの行が短すぎる
のが原因か、とか空想したのですが。


β8

33: ;--- メニューor表示項目スキャン ---
    &m("%c",d..(i&3))        ;#DISPLAY+
    #> #d
    (cd)>!{
        @ >Z
        (';') >^
        ($0D) >^
    }

    #b #> #G l=r,
    &SF(x,9) (r)?r-=x,?r=l,(cd=='$')?r-=3,(r>w)?w=r,

    &Ss(x)                                ; &Ss(x) 後が次の文字なら
    &f(r.0,"#>&") (r<0)?>N                ; バッファ x 先頭に 3 bytes 挿入
    (r)?{(fa)fa-,?r1,?r2,}                ;  #   : 先頭に      "$aa"
    &Sm(x+3,x,l+1) x..0='a$', x.2=c.r,    ;  >,& : 1回目      "$ag"
    l+=3,                                 ;        2回目以降  "$au"

:N  (l<q-b)??.     ; アドレス演算て面倒(^^;;) … (l+b<q) だとハング
    &Sc(b,x,l) b=r+1,q-=2,i++,
    >^
:Z  (0)

-------------------------------------------------------------------
すいません、たぶん最初からだと思うのですがβ8とβ11で4タブ、8タブ
の違いがあり、それを直してはいません。
-------------------------------------------------------------------

β11

33:     ;--- メニューor表示項目スキャン ---
        &m("%c",d..(i&3))       ;#DISPLAY+
        #> #d
        (cd)>!{
                @ >Z
                (';') >^
                ($0D) >^
        }

        &35
        
        >^
:Z      (0)

34:     ;--- グループ項目スキャン ---
        &m("%c",d..(i&3))       ;#DISPLAY+
        #> #d
        (cd)>!{
                (';') >^
                ($0D) >^
        }
        &35
        #c (r)?.                                ; return (0)
        >^

35:     ;--- 
        ;-->
        ;  csr : find line top
        ;  x : work bufer
        ;<--
        ;  (x) : menu str ($ convert)
        ;  l : str length (after convert)
        ;  b,q,i
        ;
        #b #> ps=x,#G l=r,ps=g,
        &SF(x,9) (r)?r-=x,?r=l,(r>w)?w=r,
;#ESC+
        (fi)?.
        r+=x,
:L      (r-x>1)?{               ; 先頭の $ はエスケープしない
                (r--.0!='$')?>L
                r[,&SF("PA",r.1) (r) r],?>L
                (l+1<x..-1)?{&Sm(r+1,r,l++) >L}?fy+,
        }
;#

        (t==2)?>N
        &Ss(x)                                  ; &Ss(x) 後が次の文字なら
        &f(r.0,"#>&") (r<0)?{(l<x..-1)??fy+,>N} ; x 先頭に 3 bytes 挿入
        (l+3<x..-1)??{fy+,>N}
        (r)?{(fa)fa-,?r1,?r2,}                  ; #   : 先頭に      "$aa"
        &Sm(x+3,x,l+1) x..0='a$',x.2=c.r,       ; >,& : 1回目      "$au"
        l+=3,                                   ;       2回目以降  "$ag"

:N      (l<q-b)??{&q(1).}       ; need unsigned b,q  (l+b<q) だとハング
        &Sc(b,x,l) b=r+1,q-=2,i++,

[1278] Re^4: 別の .shd ファイルで確認を

文太 2006/11/06(Mon) 01:13
[1277]へのコメント
めざらさん

 ああ、またスイッチを間違えた。スペースが飛んでしまって申し訳ありません。
これで4・8タブ障害が緩和されてくれるといいのですが。

[1279] Re^5: 別の .shd ファイルで確認を

文太 2006/11/06(Mon) 01:29
[1278]へのコメント
めざらさん

 何度も何度もすいません。

 例の無限ループよりひどい事態が起こったときには(すでに書いた条件でほぼ
間違いなく再現する。 β11と最新 sed.shd の組み合わせ)、間違いなくマク
ロバッファをズタズタにしています。3回試して、vp.81 のコード近辺で無限ル
ープしていたのですが、stkhelp には、vp.81 のコードがありませんでした。vp.
81  のコードがどこから来ているのかは調べていませんが、これは僕の環境に依
存しているはずなので、調査資料としてさえ意味がないでしょう。こんなところ
です。やれやれ。

[1280] &qで呼び出し元がずれたか…

めざら 2006/11/06(Mon) 11:42
[1279]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
 今日は,祝日の代休なのでレンタルビデオでも見てのんびり過ごします。

 文太さん,怒濤のコメント凄すぎます。
見えてきたのは,文太さんの stkhelp.def がオリジナルと異なる可能性です。
あるいは,stkhelp.def のトリッキーなマクロコールの危うさかもしれない。

 まず,次のようなチェックが必要かもしれません。
1 マクロディレクトリを vp\.81 で Grep(エスケープなしでも同じかな)
2 vz.def あるいはインクルードマクロに含まれるもののマクロ番号確認
3 stkhelp.def に同番号のマクロを呼ぶ直前に &d&t を入れてトレース

 高橋版以降であれば,呼ばれたマクロを含むファイル名が表示されるはずです。
チェックで見つけた vp.81 を含むマクロをどこから呼んでいるか解るでしょう。
文太さんなら,もうこの辺まで到達しているかもしれませんが。

> 僕の環境に依存しているはずなので、調査資料としてさえ意味がないでしょう。

 依存していると言っても,マクロコールのネストがらみで
不具合の起こる可能性を示す事例として大きな意味があると思います。
作者ですら自分の環境に依存して動作している可能性が高いのです。

 なお,vp.81 は検索オプションのフラグで,よく参照されるケースは
正規表現を使っているかどうかの判断をするときです。代表的なものは,
マッチした文字列長の確認や,マッチした部分を疑似ブロックするマクロ。

[1281] Re: &qで呼び出し元がずれたか…

文太 2006/11/06(Mon) 12:34
[1280]へのコメント
めざらさん

 どうぞごゆっくりなさってくださいね。
 確かに怒涛は怒涛ですが、1時間かそこいらしかもがいてないんですよ(前史
があるといえばそうかもしれませんが)。深みにはまって「何なのよ」から脱せ
なくてなって次々発言を上げてしまったのです。騒々しくすいませんでした。

 で、これですね。vz.def  内のグローバル 36 番です。はい、検索ヒット文字
列色付けマクロ by 和生さんですね。でも、β8も11も 36 は呼んでないんだ
けど…。どうしてここへ飛んでるのでしょう???&q ???

36 \[DOWN] "" c#c,                              ;#36
 :a     (s)?. &d &o(c) (r||mb||mp-2)?.          ;(mp==2)?#M
        (vp.81==40)?>03                         ;\fx
        (vp.81&$20)?{ &00 ?>b ?>03 }            ;\f,  #ifn VZt03i~ schf=0
        (vp.82&$80)?{ &01 ?>b ?>03 }            ;\x,\z (wait t_vu)
        cx=vp..36,                              ;others

 (r||mb||mp-2)?.とか、すごく見覚えありますねぇ。不幸な記憶。

 stkhelpが弄られている可能性はほとんどないと思うのですが。 触れませんも
の。少なくとも11は昨晩落とし直していますし。8は不具合(?)再現しませ
んし。

[1282] Re^2: &qで呼び出し元がずれたか…

文太 2006/11/06(Mon) 18:16
[1281]へのコメント
めざらさん

> 見えてきたのは,文太さんの stkhelp.def がオリジナルと異なる可能性です。

 ish 部屋のと手元のβ8を比較して、一瞬ひやりとしましたが、以下の対策に
より ish 部屋のβ8と僕の手元のものとは違っていたようです。ish 部屋のが
オリジナルだとすれば、確かに違いますけど、こちらのほうが安定しているよう
です。少なくともβ11よりも。

> 08320/08320 HFD01703 saki... Re:STKhelpと大小英字キーワード
> (14) 04/11/07 09:02 08319へのコメント

 めざらさんが鋭く指摘してるようでした。


 β8に帰ろうかな(環境によっては11に行ってないところもあるし)と思い
始めちゃってます。プリントアウトしてしばし眺めたのですが、これは僕には手
に負えないと、再確認。

> 記事No: 1262
> 投稿日: 2006/11/01(Wed) 06:05
>
>  どうも簡単にはいかないみたいです。(^^;
> 検索でヒットしないと,.shd 開いたままブレイクしたりするんですよ。
> プッシュしたものをポップできずにブレイクなので,その都度whip。

 っていうのもあったんですよね。sed.shd ではないと思うけど、前に書いたと
おり、これは僕も経験済みなんですよ。うーん。

[1284] Re^3: &qで呼び出し元がずれたか…

文太 2006/11/07(Tue) 17:59
[1282]へのコメント
めざらさん

 灯台もと暗し。

--- vz.def ---
35 \[UP]   "" c#r, >a                           ;#35
36 \[DOWN] "" c#c,;#36
--------------

 この 35 をサーチしていました。 そして 36 のラベル a へと突き進んでいま
した。

 はたして、 この件とプッシュ・ポップが戻らないで「Buffer overflow」にな
る件が直接に関係しているか分かりませんが、分かったことを書いておきます。

 例のsed.shd不具合発現項目は、

-----------------------------------------------------------------
@H_ @H 
バッファ
 H ホールドスペースにアペンド (2 hold)
H パターンスペースの内容をホールドスペースに追加でコピーする。
ex. Sed -e $"/./{H;$$!d;}$" -e $"x;/AAA/!d;$"   ***ここ接続***
(paragraph grep w/ "AAA"; blank line sep.)
 > G ホールドスペース内容のアペンド
 > x バッファ内容の交換
-----------------------------------------------------------------

 のようになっていて、「*** ここ接続 ***」が繋がっており、行が長すぎた、
ということのようです(切ったら再現しなくなりました)。

 stkhelp  でいうと、ローカル 35 の L ラベルの永遠とも思えるスキャンのの
ち(トレースですから)、ラベル N へ行って(◆2 のところでたぶんネストレ
ベルを間違って計算し)、33 に戻ってきます。 このとき、カーソルは「長すぎ
た行」の上にあって、#> #d によりリンク行におります。ここで多重分岐のあと、
&35 というわけです。 めざらさんご推察のとおり、この 35 のサーチがマクロバ
ッファの先頭から行われ、vz.def  内の例の和生マクロで訳分からなくなる、と
いう具合のようです。

 stkhelp には、
(fy)?{r="Line overflow!(SHD の行を分割して短くして下さい)",>Q}
 というところがあるのですが、これをかわしてしまって、《なぜか》転ぶとい
う結果になるという具合です。《なぜか》といっても、ネストレベルを間違えた
ら、目的の網にかからなくても仕方ないのでしょうが。(後述:◆3は???)

 これで、少しでも本質的な向上に力添えができるといいのですが。


(もちろん、以下はβ11)

33: ;--- メニューor表示項目スキャン ---
    &m("%c",d..(i&3))   ;#DISPLAY+
;        &d&t &m("%s",g)                   ;g の文字列を表示★

    #> #d
    (cd)>!{                             ;◆1
        @ >Z
        (';') >^
        ($0D) >^
    }

    &35                                 ;★boom!!!
    
    >^
:Z  (0)

34: ;--- グループ項目スキャン ---
    &m("%c",d..(i&3))   ;#DISPLAY+
    #> #d
    (cd)>!{
        (';') >^
        ($0D) >^
    }
    &35
    #c (r)?.                ; return (0)
    >^

35: ;--- 
    ;-->
    ;  csr : find line top
    ;  x : work bufer
    ;<--
    ;  (x) : menu str ($ convert)
    ;  l : str length (after convert)
    ;  b,q,i
    ;
        &d&t &m("%s",g)                   ;g の文字列を表示★

    #b #> ps=x,#G l=r,ps=g,
    &SF(x,9) (r)?r-=x,?r=l,(r>w)?w=r,
;#ESC+
    (fi)?.
    r+=x,
:L  (r-x>1)?{       ; 先頭の $ はエスケープしない
        (r--.0!='$')?>L
        r[,&SF("PA",r.1) (r) r],?>L
        (l+1<x..-1)?{&Sm(r+1,r,l++) >L}?fy+,    ;◆3あ、ここにfy+が!
    }                                           ;でも効いてないと思う。
;#

    (t==2)?>N
    &Ss(x)                  ; &Ss(x) 後が次の文字なら
    &f(r.0,"#>&") (r<0)?{(l<x..-1)??fy+,>N} ; x 先頭に 3 bytes 挿入
    (l+3<x..-1)??{fy+,>N}
    (r)?{(fa)fa-,?r1,?r2,}          ; #   : 先頭に      "$aa"
    &Sm(x+3,x,l+1) x..0='a$',x.2=c.r,   ; >,& : 1回目      "$au"
    l+=3,                   ;   2回目以降  "$ag"

:N  (l<q-b)??{&q(1).}   ; need unsigned b,q  (l+b<q) だとハング
    &Sc(b,x,l) b=r+1,q-=2,i++,                  ;◆2

[1285] Re^4: &qで呼び出し元がずれたか…

文太 2006/11/07(Tue) 18:43
[1284]へのコメント
めざらさん

 自分の発言を読んでいて、もう一歩詰められると思いました。

35: ;--- 
(中略)
:N  (l<q-b)??{【&t&d】 &q(1).}   ; need unsigned b,q  (l+b<q) だとハング▲1
    &Sc(b,x,l) b=r+1,q-=2,i++,
    【&t&d】                                                    ;▲2

 ここで、「ほんとうに &q のところなのか?」と。それなら調べられると思っ
たわけです。
 いえ、▲2 でした。するとどこでずれたのか、分かりませんが。
 うーん、 &q って引数取るのですかねぇ? ローカルの返り値なのだとしても、
意味あるのかなぁ???

[1287] Re^5: &qで呼び出し元がずれたか…

めざら 2006/11/08(Wed) 01:04
[1285]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
 借りていた本の期限が迫ってしまったので,そちらを先に読んでました。

 さて,よくは解らないのですが,一応解決なのでしょうか。
メニューとしては長いアイテムがあっても問題はないのでしょうけど,
ローカル 01のバッファを見ると,取り込み時バッファは 128バイトあるものの,
実行用のコードエリアと共用しているというコメントも有り,
あまり長い行を取り込もうとすると壊してしまうのかもしれませんね。

 ともかく,一「見」落着ってことで。(マクロコールの謎は残るけど)

[1289] Re^6: &qで呼び出し元がずれたか…

文太 2006/11/08(Wed) 02:04
[1287]へのコメント
めざらさん

>  ともかく,一「見」落着ってことで。(マクロコールの謎は残るけど)

 了解です。

[1297] Re^7: &qで呼び出し元がずれたか…

めざら 2006/11/09(Thu) 22:33
[1289]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
 .shd の長い行を取り込むと,呼出元に戻れなくなるという現象を確認しました。
バッファの直後に該当マクロがあるわけではないので,
単純にバッファの後ろを壊したとかいうような単純なものではないようですが,
saki...さんに報告してみます。
本当は現象ではなく原因を突き止めておきたいところですが,
ちと手におえない感じです。

 x に実行用のコードバッファを格納するように書いてあるので,
もしかするとこのあたりが関係しているのかもしれません。

 うーん,もう少し追ってみるかな。

[1301] Re^8: &qで呼び出し元がずれたか…

文太 2006/11/10(Fri) 00:29
[1297]へのコメント
めざらさん

 メールありがとうございました。ちと難物すぎますかね。

 mg..2  がころころ変わり、示す先がポインタで、これを q でいじってるみた
いだとなると、まず僕では無理だな、とだけは思ってました。

 和生さんがVzのマクロ管理(モジュールの壁は突き破るものではなく、壁の
内側に入るんだよ=ワープとか)を丁寧に丁寧の教えようとしてくれたことを思
い出して。ヒットブロック着色マクロから、おい、変なところで繋がるなよ、何
かの縁? とか。ちょびっとはもがきましたが、あはは。q、読めませんね。

 「馬鹿、q だけ調べるデバックプリント入れてうまくいく場合、うまくいかな
い場合の状態ぐらいは調べられたろう」と今日通勤電車の中で突然思い出しては
いたのですが。

 また、&q(1).  は、あはははは、おほほほほの間違いでした。&q で . と同じ
くリターンしてしまうと思っていたのでした。失礼しました。

[1302] stkhelpとvzmacro.shdはすげえ

文太 2006/11/10(Fri) 00:38
[1301]へのコメント
 また忘れた。 これを書こうと思っていたのに。というわけで、&q に問題があ
るわけではないのだろうと思っています。なのでタイトル変えました。

 vzmacro.shdを編纂するところからして、stkhelpは、Vz読み切ってるんです。
なんだけど、汎用一歩手前で今のところ終わってしまってる。メンテナーもいない。
Jperlの最大の問題点も、同じくメンテナーがいないことなんです。捨て子のマクロ
の話みたいですね。

[1316] バッファの後ろを壊していたようです

めざら 2006/11/12(Sun) 16:05
[1302]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
 確かに &q に問題はありませんでした。
おおむね原因が分かりましたので,暫定的修正を施してみました。
後で,この件について saki... さんに報告しておきます。

 問題は,$ 以下を1バイトずらして複写する時のサイズでした。
60%付近のローカル35,原版では次のようになっている箇所です。

;#ESC+
    (fi)?.
    r+=x,
:L  (r-x>1)?{       ; 先頭の $ はエスケープしない
        (r--.0!='$')?>L
        r[,&SF("PA",r.1) (r) r],?>L
;       (l+1<x..-1)?{&Sm(r+1,r,l++) >L}?fy+,        ;★org
        (l+1<x..-1)?{&Sm(r+1,r,x+l++-r) >L}?fy+,    ;☆20061112 j1
    }
;#

 ★が元のコードで,取得した行の長さ分を1バイト先に複写しています。
    x                        r  A          B
  ─┬───────────────┬──────────┬────
    │取得した文字列          $    │   バッファ余白     │次のマクロ
  ─┴───────────────┴──────────┴────
               ↑ $ の位置 は r
   ←──────────────→
    変数 l が示す取得した行の長さ
                ←─→
                複写すべき長さ(r〜A長 == x+l-r)
                ←──────────────→
                複写される長さ(x〜A長 == l)

 $が取得文字列の後ろの方にあると,「B」から始まる次のマクロの先頭を
破壊します。その結果,stkhelp.def はその位置から後ろがごっそり切り捨て
られ,以降にあるマクロにアクセスできなくなります。

 切り捨てられた部分にあったマクロは見つからなくなり,マクロバッファの
先頭からマクロ番号が検索されます。そしてマクロの動作は不定になります。

 無限ループになった理由は,先頭から探した35番マクロに #r があったから
でしょう。わたしの VZ.DEF にあるマクロは #r を拡張するマクロで,
#r コマンド番号である 35番と同じ番号を割り当ててありました。

 このときの #r の動作は検索モードで取得キーワードの戻り検索になります。
そのためグループ項目名の取得を永遠に続けることになります。

 ☆の暫定的修正は,$の位置から文字列の末尾までの文字数分に限定して
複写するというものです。

> なのでタイトル変えました。

 ご配慮に感謝します。原因がわかるまでは,どこかに呼出元を操作する
カラクリがあるかと推測していましたが,完全に外してました。

> なんだけど、汎用一歩手前で今のところ終わってしまってる。メンテナーもいない。

 saki...さんに連絡を取りますよ。作者のメンテナンスなら安心ですから。
で,十分汎用性はあると思いますよ。切出しルーチンさえ作れば,大抵の
キーワードに対応できるわけですから,要はスキルが問題ということだけど。

[1318] Re: バッファの後ろを壊していたようです

文太 2006/11/12(Sun) 19:56
[1316]へのコメント
祝! 祝! 祝! 祝!

めざらさん、祝! 祝! 祝! 祝! 

 以下、一番ご苦労されたところ、そして詳しい解説をカットしてしまってすい
ませんが、いやあん、うーん、マクロ師、コワイ、って感じです。

 とにかく、よかった。

> おおむね原因が分かりましたので,暫定的修正を施してみました。

 しつこいけど、ヤッタ。

> 問題は,$ 以下を1バイトずらして複写する時のサイズでした。

 ここは読めません(過去形でもない)。何をやっているのやら、でした。l と
か x とか。

>  このときの #r の動作は検索モードで取得キーワードの戻り検索になります。
> そのためグループ項目名の取得を永遠に続けることになります。

 おお、無限ループ問題カイケツ! カイカーン。

>  ☆の暫定的修正は,$の位置から文字列の末尾までの文字数分に限定して
> 複写するというものです。

 まさしく! とか、とか。
 テストの結果は良好です! \(^_^)/

>  原因がわかるまでは,どこかに呼出元を操作する
> カラクリがあるかと推測していましたが,完全に外してました。

 僭越ですが、僕も同じことを…。なんてね。

>  saki...さんに連絡を取りますよ。作者のメンテナンスなら安心ですから。

 少しくらい子供のことを思い出してもらえればいいのですが。

> で,十分汎用性はあると思いますよ。切出しルーチンさえ作れば,大抵の
> キーワードに対応できるわけですから,要はスキルが問題ということだけど。

 そのスキルが問題なんですよ。  それでも、 今回のことのおかげで、 少しは
stkhelp 全体についても、切り出しルーチンについても理解が深まりました。';'
のヌルカットで、おお、そうやるのか、と。

 多謝でありまする。m(_B_)m

↑ このページの先頭