summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libgfortran/io/endfile.c59
-rw-r--r--libgfortran/io/file_pos.c (renamed from libgfortran/io/backspace.c)142
-rw-r--r--libgfortran/io/rewind.c78
3 files changed, 117 insertions, 162 deletions
diff --git a/libgfortran/io/endfile.c b/libgfortran/io/endfile.c
deleted file mode 100644
index 8d01ea1076b..00000000000
--- a/libgfortran/io/endfile.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (C) 2002-2003 Free Software Foundation, Inc.
- Contributed by Andy Vaught
-
-This file is part of the GNU Fortran 95 runtime library (libgfortran).
-
-Libgfortran is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-In addition to the permissions in the GNU General Public License, the
-Free Software Foundation gives you unlimited permission to link the
-compiled version of this file into combinations with other programs,
-and to distribute those combinations without any restriction coming
-from the use of this file. (The General Public License restrictions
-do apply in other respects; for example, they cover modification of
-the file, and distribution when not linked into a combine
-executable.)
-
-Libgfortran is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Libgfortran; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-#include "config.h"
-#include "libgfortran.h"
-#include "io.h"
-
-/* endfile.c-- Implement the ENDFILE statement */
-
-extern void st_endfile (void);
-export_proto(st_endfile);
-
-void
-st_endfile (void)
-{
- gfc_unit *u;
-
- library_start ();
-
- u = get_unit (0);
- if (u != NULL)
- {
- current_unit = u; /* next_record() needs this set */
- if (u->current_record)
- next_record (1);
-
- flush(u->s);
- struncate (u->s);
- u->endfile = AFTER_ENDFILE;
- }
-
- library_end ();
-}
diff --git a/libgfortran/io/backspace.c b/libgfortran/io/file_pos.c
index d4ba3a9baaa..760b8b16f41 100644
--- a/libgfortran/io/backspace.c
+++ b/libgfortran/io/file_pos.c
@@ -1,7 +1,7 @@
-/* Copyright (C) 2002-2003 Free Software Foundation, Inc.
- Contributed by Andy Vaught
+/* Copyright (C) 2002-2003, 2005 Free Software Foundation, Inc.
+ Contributed by Andy Vaught and Janne Blomqvist
-This file is part of the GNU Fortran 95 runtime library (libgfortran).
+This file is part of the GNU Fortran runtime library (libgfortran).
Libgfortran is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -32,12 +32,14 @@ Boston, MA 02111-1307, USA. */
#include "libgfortran.h"
#include "io.h"
-/* backspace.c -- Implement the BACKSPACE statement */
+/* file_pos.c-- Implement the file positioning statements, i.e. BACKSPACE,
+ ENDFILE, and REWIND as well as the FLUSH statement. */
+
/* formatted_backspace(void)-- Move the file back one line. The
- * current position is after the newline that terminates the previous
- * record, and we have to sift backwards to find the newline before
- * that or the start of the file, whichever comes first. */
+ current position is after the newline that terminates the previous
+ record, and we have to sift backwards to find the newline before
+ that or the start of the file, whichever comes first. */
#define READ_CHUNK 4096
@@ -59,12 +61,12 @@ formatted_backspace (void)
if (p == NULL)
goto io_error;
- /* Because we've moved backwords from the current position, it
- * should not be possible to get a short read. Because it isn't
- * clear what to do about such thing, we ignore the possibility. */
+ /* We have moved backwards from the current position, it should
+ not be possible to get a short read. Because it is not
+ clear what to do about such thing, we ignore the possibility. */
/* There is no memrchr() in the C library, so we have to do it
- * ourselves. */
+ ourselves. */
n--;
while (n >= 0)
@@ -74,14 +76,13 @@ formatted_backspace (void)
base += n + 1;
goto done;
}
-
n--;
}
}
while (base != 0);
- /* base is the new pointer. Seek to it exactly */
+ /* base is the new pointer. Seek to it exactly. */
done:
if (sseek (current_unit->s, base) == FAILURE)
goto io_error;
@@ -95,9 +96,9 @@ formatted_backspace (void)
}
-/* unformatted_backspace()-- Move the file backwards for an
- * unformatted sequential file. We are guaranteed to be between
- * records on entry and we have to shift to the previous record. */
+/* unformatted_backspace() -- Move the file backwards for an unformatted
+ sequential file. We are guaranteed to be between records on entry and
+ we have to shift to the previous record. */
static void
unformatted_backspace (void)
@@ -145,14 +146,14 @@ st_backspace (void)
current_unit = u;
- /* Ignore direct access. Non-advancing I/O is only allowed for
- * formatted sequential I/O and the next direct access transfer
- * repositions the file anyway. */
+ /* Ignore direct access. Non-advancing I/O is only allowed for formatted
+ sequential I/O and the next direct access transfer repositions the file
+ anyway. */
if (u->flags.access == ACCESS_DIRECT)
goto done;
- /* Check for special cases involving the ENDFILE record first */
+ /* Check for special cases involving the ENDFILE record first. */
if (u->endfile == AFTER_ENDFILE)
u->endfile = AT_ENDFILE;
@@ -162,11 +163,11 @@ st_backspace (void)
goto done; /* Common special case */
if (u->mode == WRITING)
- {
- flush (u->s);
- struncate (u->s);
- u->mode = READING;
- }
+ {
+ flush (u->s);
+ struncate (u->s);
+ u->mode = READING;
+ }
if (u->flags.form == FORM_FORMATTED)
formatted_backspace ();
@@ -180,3 +181,94 @@ st_backspace (void)
done:
library_end ();
}
+
+
+extern void st_endfile (void);
+export_proto(st_endfile);
+
+void
+st_endfile (void)
+{
+ gfc_unit *u;
+
+ library_start ();
+
+ u = get_unit (0);
+ if (u != NULL)
+ {
+ current_unit = u; /* next_record() needs this set. */
+ if (u->current_record)
+ next_record (1);
+
+ flush(u->s);
+ struncate (u->s);
+ u->endfile = AFTER_ENDFILE;
+ }
+
+ library_end ();
+}
+
+
+extern void st_rewind (void);
+export_proto(st_rewind);
+
+void
+st_rewind (void)
+{
+ gfc_unit *u;
+
+ library_start ();
+
+ u = find_unit (ioparm.unit);
+ if (u != NULL)
+ {
+ if (u->flags.access != ACCESS_SEQUENTIAL)
+ generate_error (ERROR_BAD_OPTION,
+ "Cannot REWIND a file opened for DIRECT access");
+ else
+ {
+ /* If we have been writing to the file, the last written record
+ is the last record in the file, so truncate the file now.
+ Reset to read mode so two consecutive rewind statements do not
+ delete the file contents. Flush buffer when switching mode. */
+ if (u->mode == WRITING)
+ {
+ flush (u->s);
+ struncate (u->s);
+ }
+ u->mode = READING;
+ u->last_record = 0;
+ if (sseek (u->s, 0) == FAILURE)
+ generate_error (ERROR_OS, NULL);
+
+ u->endfile = NO_ENDFILE;
+ u->current_record = 0;
+ test_endfile (u);
+ }
+ /* Update position for INQUIRE. */
+ u->flags.position = POSITION_REWIND;
+ }
+
+ library_end ();
+}
+
+
+extern void st_flush (void);
+export_proto(st_flush);
+
+void
+st_flush (void)
+{
+ gfc_unit *u;
+
+ library_start ();
+
+ u = get_unit (0);
+ if (u != NULL)
+ {
+ current_unit = u; /* Just to be sure. */
+ flush(u->s);
+ }
+
+ library_end ();
+}
diff --git a/libgfortran/io/rewind.c b/libgfortran/io/rewind.c
deleted file mode 100644
index 48d57bafaa5..00000000000
--- a/libgfortran/io/rewind.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Copyright (C) 2002-2003 Free Software Foundation, Inc.
- Contributed by Andy Vaught
-
-This file is part of the GNU Fortran 95 runtime library (libgfortran).
-
-Libgfortran is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-In addition to the permissions in the GNU General Public License, the
-Free Software Foundation gives you unlimited permission to link the
-compiled version of this file into combinations with other programs,
-and to distribute those combinations without any restriction coming
-from the use of this file. (The General Public License restrictions
-do apply in other respects; for example, they cover modification of
-the file, and distribution when not linked into a combine
-executable.)
-
-Libgfortran is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Libgfortran; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-#include "config.h"
-#include "libgfortran.h"
-#include "io.h"
-
-/* rewind.c-- Implement the rewind statement */
-
-extern void st_rewind (void);
-export_proto(st_rewind);
-
-void
-st_rewind (void)
-{
- gfc_unit *u;
-
- library_start ();
-
- u = find_unit (ioparm.unit);
- if (u != NULL)
- {
- if (u->flags.access != ACCESS_SEQUENTIAL)
- generate_error (ERROR_BAD_OPTION,
- "Cannot REWIND a file opened for DIRECT access");
- else
- {
- /* If we have been writing to the file, the last written record
- is the last record in the file, so truncate the file now.
- Reset to read mode so two consecutive rewind statements
- don't delete the file contents. Flush buffer when switching
- mode. */
- if (u->mode == WRITING)
- {
- flush (u->s);
- struncate (u->s);
- }
- u->mode = READING;
- u->last_record = 0;
- if (sseek (u->s, 0) == FAILURE)
- generate_error (ERROR_OS, NULL);
-
- u->endfile = NO_ENDFILE;
- u->current_record = 0;
- test_endfile (u);
- }
- /* update position for INQUIRE */
- u->flags.position = POSITION_REWIND;
- }
-
- library_end ();
-}