diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2010-03-20 14:39:00 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2010-03-20 14:39:00 +0000 |
commit | 41c3cddc6b5d279f56f02709a92f55d61e4675c7 (patch) | |
tree | 1f0dd89e327efd48666fe5142e7c12087383968d | |
parent | d491d2af314a455227666dd245dc27ea0dfdea8e (diff) | |
download | gcc-41c3cddc6b5d279f56f02709a92f55d61e4675c7.zip gcc-41c3cddc6b5d279f56f02709a92f55d61e4675c7.tar.gz gcc-41c3cddc6b5d279f56f02709a92f55d61e4675c7.tar.bz2 |
re PR fortran/43409 (I/O: INQUIRE for SIZE does not work.)
2010-03-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/43409
* ioparm.def: Change inquire size variable to type pointer to
GFC_IO_INT type.
2010-03-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/43409
* io/unix.h: Add prototype for new function to return file size.
* io/unix.c (file_size): New function.
* io/inquire.c (inquire_via_unit): Use new function.
(inquire_via_filename): Use new function.
From-SVN: r157593
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/ioparm.def | 2 | ||||
-rw-r--r-- | libgfortran/ChangeLog | 10 | ||||
-rw-r--r-- | libgfortran/io/inquire.c | 11 | ||||
-rw-r--r-- | libgfortran/io/unix.c | 16 | ||||
-rw-r--r-- | libgfortran/io/unix.h | 3 |
6 files changed, 46 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index dc155fa..d8a2d3e 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2010-03-20 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/43409 + * ioparm.def: Change inquire size variable to type pointer to + GFC_IO_INT type. + 2010-03-18 Paul Thomas <pault@gcc.gnu.org> PR fortran/43039 diff --git a/gcc/fortran/ioparm.def b/gcc/fortran/ioparm.def index 7de7a51..ba1ba23 100644 --- a/gcc/fortran/ioparm.def +++ b/gcc/fortran/ioparm.def @@ -85,7 +85,7 @@ IOPARM (inquire, encoding, 1 << 2, char1) IOPARM (inquire, round, 1 << 3, char2) IOPARM (inquire, sign, 1 << 4, char1) IOPARM (inquire, pending, 1 << 5, pint4) -IOPARM (inquire, size, 1 << 6, pint4) +IOPARM (inquire, size, 1 << 6, pintio) IOPARM (inquire, id, 1 << 7, pint4) IOPARM (wait, common, 0, common) IOPARM (wait, id, 1 << 7, pint4) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 6f2198b..7a80556 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,7 +1,15 @@ +2010-03-20 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/43409 + * io/unix.h: Add prototype for new function to return file size. + * io/unix.c (file_size): New function. + * io/inquire.c (inquire_via_unit): Use new function. + (inquire_via_filename): Use new function. + 2010-03-17 Jerry DeLisle <jvdelisle@gcc.gnu.org> * io/transfer.c (read_sf_internal): Remove stray function declaration - used during debigging. + used during debugging. 2010-03-17 Jerry DeLisle <jvdelisle@gcc.gnu.org> diff --git a/libgfortran/io/inquire.c b/libgfortran/io/inquire.c index c36b9e5..cd44c04 100644 --- a/libgfortran/io/inquire.c +++ b/libgfortran/io/inquire.c @@ -371,6 +371,14 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit * u) cf_strcpy (iqp->round, iqp->round_len, p); } + + if ((cf2 & IOPARM_INQUIRE_HAS_SIZE) != 0) + { + if (u == NULL) + *iqp->size = -1; + else + *iqp->size = file_size (u->file, (gfc_charlen_type) u->file_len); + } } if ((cf & IOPARM_INQUIRE_HAS_POSITION) != 0) @@ -601,6 +609,9 @@ inquire_via_filename (st_parameter_inquire *iqp) if ((cf2 & IOPARM_INQUIRE_HAS_ENCODING) != 0) cf_strcpy (iqp->encoding, iqp->encoding_len, undefined); + + if ((cf2 & IOPARM_INQUIRE_HAS_SIZE) != 0) + *iqp->size = file_size (iqp->file, iqp->file_len); } if ((cf & IOPARM_INQUIRE_HAS_POSITION) != 0) diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index bd2b659..4435674 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -1475,6 +1475,22 @@ file_exists (const char *file, gfc_charlen_type file_len) } +/* file_size()-- Returns the size of the file. */ + +GFC_IO_INT +file_size (const char *file, gfc_charlen_type file_len) +{ + char path[PATH_MAX + 1]; + gfstat_t statbuf; + + if (unpack_filename (path, file, file_len)) + return -1; + + if (stat (path, &statbuf) < 0) + return -1; + + return (GFC_IO_INT) statbuf.st_size; +} static const char yes[] = "YES", no[] = "NO", unknown[] = "UNKNOWN"; diff --git a/libgfortran/io/unix.h b/libgfortran/io/unix.h index e691982..e567fdf 100644 --- a/libgfortran/io/unix.h +++ b/libgfortran/io/unix.h @@ -121,6 +121,9 @@ internal_proto(delete_file); extern int file_exists (const char *file, gfc_charlen_type file_len); internal_proto(file_exists); +extern GFC_IO_INT file_size (const char *file, gfc_charlen_type file_len); +internal_proto(file_size); + extern const char *inquire_sequential (const char *, int); internal_proto(inquire_sequential); |