re PR libfortran/19052 (unit 0 not preconnected to standard error)

PR libgfortran/19052
        * libgfortran.h (options_t): Add stderr_unit.
        * io/io.h (error_stream): Declare.
        * io/open.c (new_unit): Do not terminate abnormally if opening
        file preconnected to stdin, stdout, or stderr.
        * io/unit.c (init_units): Initialize stderr_unit.
        * io/unix.c (error_stream): New function.
        * runtime/environ.c (GFORTRAN_STDERR_UNIT): New environment variable.

From-SVN: r94090
This commit is contained in:
David Edelsohn 2005-01-23 00:14:31 +00:00 committed by David Edelsohn
parent a059cdb863
commit fbac336391
7 changed files with 58 additions and 4 deletions

View File

@ -1,3 +1,14 @@
2005-01-22 David Edelsohn <edelsohn@gnu.org>
PR libgfortran/19052
* libgfortran.h (options_t): Add stderr_unit.
* io/io.h (error_stream): Declare.
* io/open.c (new_unit): Do not terminate abnormally if opening
file preconnected to stdin, stdout, or stderr.
* io/unit.c (init_units): Initialize stderr_unit.
* io/unix.c (error_stream): New function.
* runtime/environ.c (GFORTRAN_STDERR_UNIT): New environment variable.
2005-01-22 Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/18982

View File

@ -395,6 +395,9 @@ internal_proto(input_stream);
extern stream *output_stream (void);
internal_proto(output_stream);
extern stream *error_stream (void);
internal_proto(error_stream);
extern int compare_file_filename (stream *, const char *, int);
internal_proto(compare_file_filename);

View File

@ -323,9 +323,14 @@ new_unit (unit_flags * flags)
internal_error ("new_unit(): Bad status");
}
/* Make sure the file isn't already open someplace else. */
/* Make sure the file isn't already open someplace else.
Do not error if opening file preconnected to stdin, stdout, stderr. */
if (find_file () != NULL)
u = find_file ();
if (u != NULL
&& (options.stdin_unit < 0 || u->unit_number != options.stdin_unit)
&& (options.stdout_unit < 0 || u->unit_number != options.stdout_unit)
&& (options.stderr_unit < 0 || u->unit_number != options.stderr_unit))
{
generate_error (ERROR_ALREADY_OPEN, NULL);
goto cleanup;

View File

@ -334,6 +334,27 @@ init_units (void)
insert_unit (u);
}
if (options.stderr_unit >= 0)
{ /* STDERR */
u = get_mem (sizeof (gfc_unit));
u->unit_number = options.stderr_unit;
u->s = error_stream ();
u->flags.action = ACTION_WRITE;
u->flags.access = ACCESS_SEQUENTIAL;
u->flags.form = FORM_FORMATTED;
u->flags.status = STATUS_OLD;
u->flags.blank = BLANK_ZERO;
u->flags.position = POSITION_ASIS;
u->recl = options.default_recl;
u->endfile = AT_ENDFILE;
insert_unit (u);
}
/* Calculate the maximum file offset in a portable manner.
* max will be the largest signed number for the type gfc_offset.
*

View File

@ -1160,7 +1160,7 @@ input_stream (void)
}
/* output_stream()-- Return a stream pointer to the default input stream.
/* output_stream()-- Return a stream pointer to the default output stream.
* Called on initialization. */
stream *
@ -1170,6 +1170,15 @@ output_stream (void)
}
/* error_stream()-- Return a stream pointer to the default error stream.
* Called on initialization. */
stream *
error_stream (void)
{
return fd_to_stream (STDERR_FILENO, PROT_WRITE);
}
/* init_error_stream()-- Return a pointer to the error stream. This
* subroutine is called when the stream is needed, rather than at
* initialization. We want to work even if memory has been seriously

View File

@ -292,7 +292,7 @@ enum
typedef struct
{
int stdin_unit, stdout_unit, optional_plus;
int stdin_unit, stdout_unit, stderr_unit, optional_plus;
int allocate_init_flag, allocate_init_value;
int locus;

View File

@ -443,6 +443,11 @@ static variable variable_table[] = {
"Unit number that will be preconnected to standard output\n"
"(No preconnection if negative)"},
{"GFORTRAN_STDERR_UNIT", 0, &options.stderr_unit, init_integer,
show_integer,
"Unit number that will be preconnected to standard error\n"
"(No preconnection if negative)"},
{"GFORTRAN_USE_STDERR", 1, &options.use_stderr, init_boolean,
show_boolean,
"Sends library output to standard error instead of standard output."},