aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Edelsohn <edelsohn@gnu.org>2005-01-23 00:14:31 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2005-01-22 19:14:31 -0500
commitfbac336391e238f8e92714fce5431f69d4f2d338 (patch)
tree58334819ab2857c14b05d08b9782ac195c0413b5
parenta059cdb8632f1a0a64d0ae2b4ada084ab69cac5e (diff)
downloadgcc-fbac336391e238f8e92714fce5431f69d4f2d338.zip
gcc-fbac336391e238f8e92714fce5431f69d4f2d338.tar.gz
gcc-fbac336391e238f8e92714fce5431f69d4f2d338.tar.bz2
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
-rw-r--r--libgfortran/ChangeLog11
-rw-r--r--libgfortran/io/io.h3
-rw-r--r--libgfortran/io/open.c11
-rw-r--r--libgfortran/io/unit.c21
-rw-r--r--libgfortran/io/unix.c11
-rw-r--r--libgfortran/libgfortran.h2
-rw-r--r--libgfortran/runtime/environ.c5
7 files changed, 59 insertions, 5 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 537415f..c2218fb 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -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
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index 2975f9e..694ca1d 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -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);
diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c
index 9c23131f..eaeb5a2 100644
--- a/libgfortran/io/open.c
+++ b/libgfortran/io/open.c
@@ -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. */
-
- if (find_file () != NULL)
+ /* Make sure the file isn't already open someplace else.
+ Do not error if opening file preconnected to stdin, stdout, stderr. */
+
+ 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;
diff --git a/libgfortran/io/unit.c b/libgfortran/io/unit.c
index bf68b78..ae0771f 100644
--- a/libgfortran/io/unit.c
+++ b/libgfortran/io/unit.c
@@ -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.
*
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index daa0fb1..5dc31a5 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -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
diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h
index ccafb7c..dfa2e40 100644
--- a/libgfortran/libgfortran.h
+++ b/libgfortran/libgfortran.h
@@ -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;
diff --git a/libgfortran/runtime/environ.c b/libgfortran/runtime/environ.c
index 87fe565..ae82f56 100644
--- a/libgfortran/runtime/environ.c
+++ b/libgfortran/runtime/environ.c
@@ -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."},