X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=libgfortran%2Fio%2Fopen.c;h=be8f4bb0b4369f9f4bf890f5deb4d767bff7d04d;hp=e16386cabd783a8c7b814108da62d8c4d58e6bc5;hb=897f9d25c9514d0a9eb4f9af7cce1a59b0645f13;hpb=d875179d7d2d8f4aa45d4f06379b3b1b111ac43b diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c index e16386cabd7..be8f4bb0b43 100644 --- a/libgfortran/io/open.c +++ b/libgfortran/io/open.c @@ -1,38 +1,36 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008 +/* Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Andy Vaught F2003 I/O support contributed by Jerry DeLisle -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 -the Free Software Foundation; either version 2, or (at your option) +the Free Software Foundation; either version 3, 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, 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ #include "io.h" +#include "fbuf.h" +#include "unix.h" #include #include #include +#include static const st_option access_opt[] = { @@ -107,7 +105,7 @@ static const st_option decimal_opt[] = static const st_option encoding_opt[] = { - /* TODO { "utf-8", ENCODING_UTF8}, */ + { "utf-8", ENCODING_UTF8}, { "default", ENCODING_DEFAULT}, { NULL, 0} }; @@ -155,7 +153,7 @@ static const st_option async_opt[] = static void test_endfile (gfc_unit * u) { - if (u->endfile == NO_ENDFILE && file_length (u->s) == file_position (u->s)) + if (u->endfile == NO_ENDFILE && file_length (u->s) == stell (u->s)) u->endfile = AT_ENDFILE; } @@ -271,7 +269,7 @@ edit_modes (st_parameter_open *opp, gfc_unit * u, unit_flags * flags) break; case POSITION_REWIND: - if (sseek (u->s, 0) == FAILURE) + if (sseek (u->s, 0, SEEK_SET) != 0) goto seek_error; u->current_record = 0; @@ -281,7 +279,7 @@ edit_modes (st_parameter_open *opp, gfc_unit * u, unit_flags * flags) break; case POSITION_APPEND: - if (sseek (u->s, file_length (u->s)) == FAILURE) + if (sseek (u->s, 0, SEEK_END) < 0) goto seek_error; if (flags->access != ACCESS_STREAM) @@ -557,7 +555,7 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags) if (flags->position == POSITION_APPEND) { - if (sseek (u->s, file_length (u->s)) == FAILURE) + if (sseek (u->s, 0, SEEK_END) < 0) generate_error (&opp->common, LIBERROR_OS, NULL); u->endfile = AT_ENDFILE; } @@ -611,7 +609,8 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags) { u->maxrec = max_offset; u->recl = 1; - u->strm_pos = 1; + u->bytes_left = 1; + u->strm_pos = stell (u->s) + 1; } memmove (u->file, opp->file, opp->file_len); @@ -625,12 +624,18 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags) test_endfile (u); if (flags->status == STATUS_SCRATCH && opp->file != NULL) - free_mem (opp->file); + free (opp->file); - if (flags->form == FORM_FORMATTED && (flags->action != ACTION_READ)) - fbuf_init (u, 0); + if (flags->form == FORM_FORMATTED) + { + if ((opp->common.flags & IOPARM_OPEN_HAS_RECL_IN)) + fbuf_init (u, u->recl); + else + fbuf_init (u, 0); + } else u->fbuf = NULL; + return u; @@ -640,7 +645,7 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags) /* Free memory associated with a temporary filename. */ if (flags->status == STATUS_SCRATCH && opp->file != NULL) - free_mem (opp->file); + free (opp->file); fail: @@ -675,7 +680,7 @@ already_open (st_parameter_open *opp, gfc_unit * u, unit_flags * flags) } #endif - if (sclose (u->s) == FAILURE) + if (sclose (u->s) == -1) { unlock_unit (u); generate_error (&opp->common, LIBERROR_OS, @@ -685,7 +690,7 @@ already_open (st_parameter_open *opp, gfc_unit * u, unit_flags * flags) u->s = NULL; if (u->file) - free_mem (u->file); + free (u->file); u->file = NULL; u->file_len = 0; @@ -789,7 +794,7 @@ st_open (st_parameter_open *opp) conv = compile_options.convert; } - /* We use l8_to_l4_offset, which is 0 on little-endian machines + /* We use big_endian, which is 0 on little-endian machines and 1 on big-endian machines. */ switch (conv) { @@ -798,11 +803,11 @@ st_open (st_parameter_open *opp) break; case GFC_CONVERT_BIG: - conv = l8_to_l4_offset ? GFC_CONVERT_NATIVE : GFC_CONVERT_SWAP; + conv = big_endian ? GFC_CONVERT_NATIVE : GFC_CONVERT_SWAP; break; case GFC_CONVERT_LITTLE: - conv = l8_to_l4_offset ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE; + conv = big_endian ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE; break; default: @@ -812,7 +817,7 @@ st_open (st_parameter_open *opp) flags.convert = conv; - if (opp->common.unit < 0) + if (!(opp->common.flags & IOPARM_OPEN_HAS_NEWUNIT) && opp->common.unit < 0) generate_error (&opp->common, LIBERROR_BAD_OPTION, "Bad unit number in OPEN statement"); @@ -840,8 +845,13 @@ st_open (st_parameter_open *opp) if ((opp->common.flags & IOPARM_LIBRETURN_MASK) == IOPARM_LIBRETURN_OK) { - u = find_or_create_unit (opp->common.unit); + if ((opp->common.flags & IOPARM_OPEN_HAS_NEWUNIT)) + { + *opp->newunit = get_unique_unit_number(opp); + opp->common.unit = *opp->newunit; + } + u = find_or_create_unit (opp->common.unit); if (u->s == NULL) { u = new_unit (opp, u, &flags);