From: WATANABE Hirofumi Date: 1998-04-30T04:21:04+09:00 Subject: [ruby-dev:2544] Re: `-r debug' and `-e' with multiline わたなべです. Inaba Hiroto writes: :まず、-r debugで起動されるデバッガで、returnのみを入力した時に、最後に実行し :た n または s コマンドを実行するようにならないでしょうか? これはつい return のみってやっちゃうのでこうなって欲しいですね. わたしは gets と ungets ってのを作って対応してます. return のときは最後に実行した n か s を ungets して next. :次に -e オプション中でのhere documentができないのですが、なんとかなりません :か?. 一番簡単なのは perl のように -e もテンポラリファイルに書き出 してから実行すればいいんだけど. そうすれば :それから, -r debug -e ...とした時に 実行中コードがデバッガから見えませ :ん. perlでは、-e でも デバッガから見えます。 これも解決します. 参考パッチ. テンポラリファイルはカレントに作ってるけど /tmp とか環境変数の TMPDIR, TEMP, TMP あたりに作ったほうがいいで すね. というか Ruby にも mktemp のようなものがあってもいいで すよね? -- わたなべひろふみ --- ruby-1.1b9_16/ruby.c Mon Apr 20 14:55:54 1998 +++ rbgw11b9_16/ruby.c Wed Apr 29 21:05:44 1998 @@ -83,2 +83,5 @@ +static FILE *e_fp; +static char *e_tmpname; + static void @@ -165,2 +168,3 @@ script_given = 0; + e_tmpname = NULL; @@ -228,11 +232,17 @@ forbid_setid("-e"); - script_given++; - if (script == 0) script = "-e"; - if (argv[1]) { - compile_string("-e", argv[1], strlen(argv[1])); - argc--,argv++; + if (!e_fp) { + e_tmpname = strdup("rbXXXXXX"); + mktemp(e_tmpname); + if (!*e_tmpname) + Fatal("Can't mktemp(%s)", e_tmpname); + e_fp = fopen(e_tmpname, "w"); + if (!e_fp) + Fatal("Cannot open temporary file: %s", e_tmpname); + if (script == 0) script = e_tmpname; } - else { - compile_string("-e", "", 0); + if (argv[1]) { + fputs(argv[1], e_fp); + argc--, argv++; } + putc('\n', e_fp); break; @@ -365,2 +375,10 @@ + if (e_fp) { + if (fflush(e_fp) || ferror(e_fp) || fclose(e_fp)) + Fatal("Cannot write to temp file for -e"); + e_fp = NULL; + argc++, argv--; + argv[0] = e_tmpname; + } + if (version) { @@ -786,2 +804,10 @@ yywhile_loop(do_line, do_split); + } + if (e_tmpname) { + unlink(e_tmpname); + e_tmpname = NULL; + } + if (e_fp) { + fclose(e_fp); + e_fp = NULL; }