diff options
-rw-r--r-- | libgfortran/ChangeLog | 11 | ||||
-rw-r--r-- | libgfortran/io/unix.c | 16 | ||||
-rw-r--r-- | libgfortran/libgfortran.h | 2 | ||||
-rw-r--r-- | libgfortran/runtime/environ.c | 30 |
4 files changed, 30 insertions, 29 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 6dcc055..a5415a0 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,4 +1,15 @@ 2007-10-18 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> + Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR libfortran/33795 + * libgfortran.h: Add unbuffered_preconnected. + * io/unix.c (output_stream): Set stream unbuffered flag if + options.unbuffered_preconnected has been set. + (error_stream): Ditto. + * runtime/environ.c (variable_table): Add to environment variable table + the entry: GFORTRAN_UNBUFFERED_PRECONNECTED. + +2007-10-18 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> PR libfortran/32021 * runtime/backtrace.c (local_strcasestr): Protect by appropriate diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index 9b61507..93484ea 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -1411,10 +1411,16 @@ input_stream (void) stream * output_stream (void) { + stream * s; + #if defined(HAVE_CRLF) && defined(HAVE_SETMODE) setmode (STDOUT_FILENO, O_BINARY); #endif - return fd_to_stream (STDOUT_FILENO, PROT_WRITE); + + s = fd_to_stream (STDOUT_FILENO, PROT_WRITE); + if (options.unbuffered_preconnected) + ((unix_stream *) s)->unbuffered = 1; + return s; } @@ -1424,10 +1430,16 @@ output_stream (void) stream * error_stream (void) { + stream * s; + #if defined(HAVE_CRLF) && defined(HAVE_SETMODE) setmode (STDERR_FILENO, O_BINARY); #endif - return fd_to_stream (STDERR_FILENO, PROT_WRITE); + + s = fd_to_stream (STDERR_FILENO, PROT_WRITE); + if (options.unbuffered_preconnected) + ((unix_stream *) s)->unbuffered = 1; + return s; } diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h index 8d80998..a30ab19 100644 --- a/libgfortran/libgfortran.h +++ b/libgfortran/libgfortran.h @@ -349,7 +349,7 @@ typedef struct int separator_len; const char *separator; - int use_stderr, all_unbuffered, default_recl; + int use_stderr, all_unbuffered, unbuffered_preconnected, default_recl; int fpe, dump_core, backtrace; } options_t; diff --git a/libgfortran/runtime/environ.c b/libgfortran/runtime/environ.c index a7ee3a7..ba8283e 100644 --- a/libgfortran/runtime/environ.c +++ b/libgfortran/runtime/environ.c @@ -299,6 +299,10 @@ static variable variable_table[] = { "If TRUE, all output is unbuffered. This will slow down large writes " "but can be\nuseful for forcing data to be displayed immediately.", 0}, + {"GFORTRAN_UNBUFFERED_PRECONNECTED", 0, &options.unbuffered_preconnected, + init_boolean, show_boolean, + "If TRUE, output to preconnected units is unbuffered.", 0}, + {"GFORTRAN_SHOW_LOCUS", 1, &options.locus, init_boolean, show_boolean, "If TRUE, print filename and line number where runtime errors happen.", 0}, @@ -346,32 +350,6 @@ init_variables (void) } -/* check_buffered()-- Given an unit number n, determine if an override - * for the stream exists. Returns zero for unbuffered, one for - * buffered or two for not set. */ - -int -check_buffered (int n) -{ - char name[22 + sizeof (n) * 3]; - variable v; - int rv; - - if (options.all_unbuffered) - return 0; - - sprintf (name, "GFORTRAN_UNBUFFERED_%d", n); - - v.name = name; - v.value = 2; - v.var = &rv; - - init_boolean (&v); - - return rv; -} - - void show_variables (void) { |