OLD | NEW |
1 /* Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009 | 1 /* Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009 |
2 Free Software Foundation, Inc. | 2 Free Software Foundation, Inc. |
3 Contributed by Andy Vaught | 3 Contributed by Andy Vaught |
4 F2003 I/O support contributed by Jerry DeLisle | 4 F2003 I/O support contributed by Jerry DeLisle |
5 | 5 |
6 This file is part of the GNU Fortran 95 runtime library (libgfortran). | 6 This file is part of the GNU Fortran 95 runtime library (libgfortran). |
7 | 7 |
8 Libgfortran is free software; you can redistribute it and/or modify | 8 Libgfortran is free software; you can redistribute it and/or modify |
9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
10 the Free Software Foundation; either version 3, or (at your option) | 10 the Free Software Foundation; either version 3, or (at your option) |
11 any later version. | 11 any later version. |
12 | 12 |
13 Libgfortran is distributed in the hope that it will be useful, | 13 Libgfortran is distributed in the hope that it will be useful, |
14 but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 GNU General Public License for more details. | 16 GNU General Public License for more details. |
17 | 17 |
18 Under Section 7 of GPL version 3, you are granted additional | 18 Under Section 7 of GPL version 3, you are granted additional |
19 permissions described in the GCC Runtime Library Exception, version | 19 permissions described in the GCC Runtime Library Exception, version |
20 3.1, as published by the Free Software Foundation. | 20 3.1, as published by the Free Software Foundation. |
21 | 21 |
22 You should have received a copy of the GNU General Public License and | 22 You should have received a copy of the GNU General Public License and |
23 a copy of the GCC Runtime Library Exception along with this program; | 23 a copy of the GCC Runtime Library Exception along with this program; |
24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | 24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
25 <http://www.gnu.org/licenses/>. */ | 25 <http://www.gnu.org/licenses/>. */ |
26 | 26 |
27 #include "io.h" | 27 #include "io.h" |
| 28 #include "fbuf.h" |
| 29 #include "unix.h" |
28 #include <unistd.h> | 30 #include <unistd.h> |
29 #include <string.h> | 31 #include <string.h> |
30 #include <errno.h> | 32 #include <errno.h> |
31 | 33 |
32 | 34 |
33 static const st_option access_opt[] = { | 35 static const st_option access_opt[] = { |
34 {"sequential", ACCESS_SEQUENTIAL}, | 36 {"sequential", ACCESS_SEQUENTIAL}, |
35 {"direct", ACCESS_DIRECT}, | 37 {"direct", ACCESS_DIRECT}, |
36 {"append", ACCESS_APPEND}, | 38 {"append", ACCESS_APPEND}, |
37 {"stream", ACCESS_STREAM}, | 39 {"stream", ACCESS_STREAM}, |
(...skipping 730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
768 form_opt, "Bad FORM parameter in OPEN statement"); | 770 form_opt, "Bad FORM parameter in OPEN statement"); |
769 | 771 |
770 flags.position = !(cf & IOPARM_OPEN_HAS_POSITION) ? POSITION_UNSPECIFIED : | 772 flags.position = !(cf & IOPARM_OPEN_HAS_POSITION) ? POSITION_UNSPECIFIED : |
771 find_option (&opp->common, opp->position, opp->position_len, | 773 find_option (&opp->common, opp->position, opp->position_len, |
772 position_opt, "Bad POSITION parameter in OPEN statement"); | 774 position_opt, "Bad POSITION parameter in OPEN statement"); |
773 | 775 |
774 flags.status = !(cf & IOPARM_OPEN_HAS_STATUS) ? STATUS_UNSPECIFIED : | 776 flags.status = !(cf & IOPARM_OPEN_HAS_STATUS) ? STATUS_UNSPECIFIED : |
775 find_option (&opp->common, opp->status, opp->status_len, | 777 find_option (&opp->common, opp->status, opp->status_len, |
776 status_opt, "Bad STATUS parameter in OPEN statement"); | 778 status_opt, "Bad STATUS parameter in OPEN statement"); |
777 | 779 |
778 /* First, we check whether the convert flag has been set via environment | 780 /* First, we check wether the convert flag has been set via environment |
779 variable. This overrides the convert tag in the open statement. */ | 781 variable. This overrides the convert tag in the open statement. */ |
780 | 782 |
781 conv = get_unformatted_convert (opp->common.unit); | 783 conv = get_unformatted_convert (opp->common.unit); |
782 | 784 |
783 if (conv == GFC_CONVERT_NONE) | 785 if (conv == GFC_CONVERT_NONE) |
784 { | 786 { |
785 /* Nothing has been set by environment variable, check the convert tag. *
/ | 787 /* Nothing has been set by environment variable, check the convert tag. *
/ |
786 if (cf & IOPARM_OPEN_HAS_CONVERT) | 788 if (cf & IOPARM_OPEN_HAS_CONVERT) |
787 conv = find_option (&opp->common, opp->convert, opp->convert_len, | 789 conv = find_option (&opp->common, opp->convert, opp->convert_len, |
788 convert_opt, | 790 convert_opt, |
(...skipping 18 matching lines...) Expand all Loading... |
807 conv = big_endian ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE; | 809 conv = big_endian ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE; |
808 break; | 810 break; |
809 | 811 |
810 default: | 812 default: |
811 internal_error (&opp->common, "Illegal value for CONVERT"); | 813 internal_error (&opp->common, "Illegal value for CONVERT"); |
812 break; | 814 break; |
813 } | 815 } |
814 | 816 |
815 flags.convert = conv; | 817 flags.convert = conv; |
816 | 818 |
817 if (opp->common.unit < 0) | 819 if (!(opp->common.flags & IOPARM_OPEN_HAS_NEWUNIT) && opp->common.unit < 0) |
818 generate_error (&opp->common, LIBERROR_BAD_OPTION, | 820 generate_error (&opp->common, LIBERROR_BAD_OPTION, |
819 "Bad unit number in OPEN statement"); | 821 "Bad unit number in OPEN statement"); |
820 | 822 |
821 if (flags.position != POSITION_UNSPECIFIED | 823 if (flags.position != POSITION_UNSPECIFIED |
822 && flags.access == ACCESS_DIRECT) | 824 && flags.access == ACCESS_DIRECT) |
823 generate_error (&opp->common, LIBERROR_BAD_OPTION, | 825 generate_error (&opp->common, LIBERROR_BAD_OPTION, |
824 "Cannot use POSITION with direct access files"); | 826 "Cannot use POSITION with direct access files"); |
825 | 827 |
826 if (flags.access == ACCESS_APPEND) | 828 if (flags.access == ACCESS_APPEND) |
827 { | 829 { |
828 if (flags.position != POSITION_UNSPECIFIED | 830 if (flags.position != POSITION_UNSPECIFIED |
829 && flags.position != POSITION_APPEND) | 831 && flags.position != POSITION_APPEND) |
830 generate_error (&opp->common, LIBERROR_BAD_OPTION, | 832 generate_error (&opp->common, LIBERROR_BAD_OPTION, |
831 "Conflicting ACCESS and POSITION flags in" | 833 "Conflicting ACCESS and POSITION flags in" |
832 " OPEN statement"); | 834 " OPEN statement"); |
833 | 835 |
834 notify_std (&opp->common, GFC_STD_GNU, | 836 notify_std (&opp->common, GFC_STD_GNU, |
835 "Extension: APPEND as a value for ACCESS in OPEN statement"); | 837 "Extension: APPEND as a value for ACCESS in OPEN statement"); |
836 flags.access = ACCESS_SEQUENTIAL; | 838 flags.access = ACCESS_SEQUENTIAL; |
837 flags.position = POSITION_APPEND; | 839 flags.position = POSITION_APPEND; |
838 } | 840 } |
839 | 841 |
840 if (flags.position == POSITION_UNSPECIFIED) | 842 if (flags.position == POSITION_UNSPECIFIED) |
841 flags.position = POSITION_ASIS; | 843 flags.position = POSITION_ASIS; |
842 | 844 |
843 if ((opp->common.flags & IOPARM_LIBRETURN_MASK) == IOPARM_LIBRETURN_OK) | 845 if ((opp->common.flags & IOPARM_LIBRETURN_MASK) == IOPARM_LIBRETURN_OK) |
844 { | 846 { |
| 847 if ((opp->common.flags & IOPARM_OPEN_HAS_NEWUNIT)) |
| 848 { |
| 849 *opp->newunit = get_unique_unit_number(opp); |
| 850 opp->common.unit = *opp->newunit; |
| 851 } |
| 852 |
845 u = find_or_create_unit (opp->common.unit); | 853 u = find_or_create_unit (opp->common.unit); |
846 | |
847 if (u->s == NULL) | 854 if (u->s == NULL) |
848 { | 855 { |
849 u = new_unit (opp, u, &flags); | 856 u = new_unit (opp, u, &flags); |
850 if (u != NULL) | 857 if (u != NULL) |
851 unlock_unit (u); | 858 unlock_unit (u); |
852 } | 859 } |
853 else | 860 else |
854 already_open (opp, u, &flags); | 861 already_open (opp, u, &flags); |
855 } | 862 } |
856 | 863 |
857 library_end (); | 864 library_end (); |
858 } | 865 } |
OLD | NEW |