diff options
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 7 | ||||
-rw-r--r-- | libgfortran/io/intrinsics.c | 31 |
2 files changed, 23 insertions, 15 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index a57e53aabf2..d0985674a18 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2010-04-01 Janne Blomqvist <jb@gcc.gnu.org> + + PR libfortran/43605 + * io/intrinsics.c (gf_ftell): New function, seek to correct offset. + (ftell): Call gf_ftell. + (FTELL_SUB): Likewise. + 2010-04-01 Paul Thomas <pault@gcc.gnu.org> * io/transfer.c : Update copyright. diff --git a/libgfortran/io/intrinsics.c b/libgfortran/io/intrinsics.c index 4beb0135c86..f2f532b9291 100644 --- a/libgfortran/io/intrinsics.c +++ b/libgfortran/io/intrinsics.c @@ -260,19 +260,27 @@ fseek_sub (int * unit, GFC_IO_INT * offset, int * whence, int * status) /* FTELL intrinsic */ +static gfc_offset +gf_ftell (int unit) +{ + gfc_unit * u = find_unit (unit); + if (u == NULL) + return -1; + int pos = fbuf_reset (u); + if (pos != 0) + sseek (u->s, pos, SEEK_CUR); + gfc_offset ret = stell (u->s); + unlock_unit (u); + return ret; +} + extern size_t PREFIX(ftell) (int *); export_proto_np(PREFIX(ftell)); size_t PREFIX(ftell) (int * unit) { - gfc_unit * u = find_unit (*unit); - gfc_offset ret; - if (u == NULL) - return ((size_t) -1); - ret = stell (u->s) + fbuf_reset (u); - unlock_unit (u); - return ret; + return gf_ftell (*unit); } #define FTELL_SUB(kind) \ @@ -281,14 +289,7 @@ PREFIX(ftell) (int * unit) void \ ftell_i ## kind ## _sub (int * unit, GFC_INTEGER_ ## kind * offset) \ { \ - gfc_unit * u = find_unit (*unit); \ - if (u == NULL) \ - *offset = -1; \ - else \ - { \ - *offset = stell (u->s) + fbuf_reset (u); \ - unlock_unit (u); \ - } \ + *offset = gf_ftell (*unit); \ } FTELL_SUB(1) |