前田です。

At Wed, 17 Nov 1999 13:34:57 +0900,
TAKEUCHi Kahori <take-k / secom-sis.co.jp> wrote:
> > $>.cancel
> > 
> > で、バッファをクリアできるようにすればいいような気がしました。
> 
> あ、それいいですね〜。わかりやすくて。

このメールにパッチを付けます。
# 実は今のversionでも$>.replace("")でできてたりして(^_^;
以下のようなスクリプトで試したところうまく動いているようです。

#!/usr/bin/eruby
Content-Type: text/html

<%
$NOHEADER = true
begin
%>

<html>
<head>
<title>test</title>
</head>
<body>
1 / 0 = <%= 1 / 0 %>
</body>
</html>
<%
rescue
  $>.cancel
  print "Location: http://www.ruby-lang.org/\n\n"
end
%>

> > ついでにnoheaderモードを環境変数で指定できた方がよさそうですね。

まちがえました、環境変数じゃなくてグローバル変数($NOHEADER)です。

-- 
前田 修吾

diff -u -r1.4 eruby_main.c --- eruby_main.c 1999/08/10 04:44:39 1.4 +++ eruby_main.c 1999/11/17 07:38:31 @@ -40,7 +40,7 @@ static char *eruby_filename = NULL; static int eruby_mode = MODE_UNKNOWN; -static int eruby_no_header = 0; +static int eruby_noheader = 0; static char *get_charset() { @@ -439,13 +439,31 @@ } } -static VALUE str_write(VALUE self, VALUE str) +static VALUE defout_write(VALUE self, VALUE str) { str = rb_obj_as_string(str); rb_str_cat(self, RSTRING(str)->ptr, RSTRING(str)->len); return Qnil; } +static VALUE defout_cancel(VALUE self) +{ + if (RSTRING(self)->len == 0) return; + RSTRING(self)->len = 0; + RSTRING(self)->ptr[0] = '\0'; + return Qnil; +} + +static VALUE noheader_getter() +{ + return eruby_noheader ? Qtrue : Qfalse; +} + +static void noheader_setter(VALUE val) +{ + eruby_noheader = RTEST(val); +} + static int guess_mode() { if (getenv("GATEWAY_INTERFACE") == NULL) { @@ -583,7 +601,7 @@ s++; goto again; case 'n': - eruby_no_header = 1; + eruby_noheader = 1; s++; goto again; case '\0': @@ -597,7 +615,7 @@ ruby_debug = Qtrue; } else if (strcmp("noheader", s) == 0) { - eruby_no_header = 1; + eruby_noheader = 1; } else if (strcmp("version", s) == 0) { show_version(); @@ -658,7 +676,9 @@ rb_set_safe_level(1); rb_defout = rb_str_new("", 0); - rb_define_singleton_method(rb_defout, "write", str_write, 1); + rb_define_singleton_method(rb_defout, "write", defout_write, 1); + rb_define_singleton_method(rb_defout, "cancel", defout_cancel, 0); + rb_define_virtual_variable("$NOHEADER", noheader_getter, noheader_setter); script = eruby_load(eruby_filename, 0, &state); if (state) { error_print(state, eruby_mode, script); @@ -672,7 +692,7 @@ unlink(RSTRING(script)->ptr); out = RSTRING(rb_defout)->ptr; nout = RSTRING(rb_defout)->len; - if (!eruby_no_header && + if (!eruby_noheader && (eruby_mode == MODE_CGI || eruby_mode == MODE_NPHCGI)) { if (eruby_mode == MODE_NPHCGI) print_http_headers();