From b7f94b3ddf0dc1c226b5fa12008b316e7f1b8480 Mon Sep 17 00:00:00 2001 From: "Vandenplas, Jeremie" Date: Mon, 6 Jan 2020 16:22:20 +0100 Subject: [PATCH 1/2] addition of access in the API of open function + tests --- src/stdlib_experimental_io.f90 | 22 ++++++++++--- src/tests/io/Makefile.manual | 4 ++- src/tests/io/test_open.f90 | 60 +++++++++++++++++++++++++++++++--- 3 files changed, 76 insertions(+), 10 deletions(-) diff --git a/src/stdlib_experimental_io.f90 b/src/stdlib_experimental_io.f90 index 05f0a256f..adfef7a2d 100644 --- a/src/stdlib_experimental_io.f90 +++ b/src/stdlib_experimental_io.f90 @@ -269,7 +269,7 @@ integer function number_of_rows_numeric(s) end function -integer function open(filename, mode, iostat) result(u) +integer function open(filename, mode, iostat, access) result(u) ! Open a file ! ! To open a file to read: @@ -287,6 +287,7 @@ integer function open(filename, mode, iostat) result(u) character(*), intent(in) :: filename character(*), intent(in), optional :: mode +character(*), intent(in), optional :: access integer, intent(out), optional :: iostat integer :: io_ @@ -335,15 +336,28 @@ integer function open(filename, mode, iostat) result(u) select case (mode_(3:3)) case('t') - access_='sequential' form_='formatted' -case('b', 's') - access_='stream' +case('b') form_='unformatted' case default call error_stop("Unsupported mode: "//mode_(3:3)) end select +access_='stream' + +if (present(access)) then + select case (trim(adjustl(access))) + case('direct') + access_='direct' + case('sequential') + access_='sequential' + case('stream') + access_='stream' + case default + call error_stop("Unsupported access: "//trim(access)) + end select +end if + if (present(iostat)) then open(newunit=u, file=filename, & action = action_, position = position_, status = status_, & diff --git a/src/tests/io/Makefile.manual b/src/tests/io/Makefile.manual index 3bbce9db7..f5ae133e9 100644 --- a/src/tests/io/Makefile.manual +++ b/src/tests/io/Makefile.manual @@ -5,7 +5,9 @@ PROGS_SRC = test_loadtxt.f90 \ test_parse_mode.f90 \ test_open.f90 -CLEAN_FILES = tmp.dat tmp_qp.dat io_open.dat io_open.stream +CLEAN_FILES = tmp.dat tmp_qp.dat \ + io_open_seq.dat io_open_stream.dat \ + io_open_seq.bin io_open_stream.bin include ../Makefile.manual.test.mk diff --git a/src/tests/io/test_open.f90 b/src/tests/io/test_open.f90 index deaee3593..22f8f61cf 100644 --- a/src/tests/io/test_open.f90 +++ b/src/tests/io/test_open.f90 @@ -6,8 +6,8 @@ program test_open character(:), allocatable :: filename integer :: io, u, a(3) -! Text file -filename = get_outpath() // "/io_open.dat" +! Stream text file +filename = get_outpath() // "/io_open_stream.dat" ! Test mode "w" u = open(filename, "w") @@ -32,9 +32,34 @@ program test_open close(u) +! Sequential text file +filename = get_outpath() // "/io_open_seq.dat" -! Stream file -filename = get_outpath() // "/io_open.stream" +! Test mode "w" +u = open(filename, "w", access = 'sequential') +write(u, *) 1, 2, 3 +close(u) + +! Test mode "r" +u = open(filename, "r", access = 'sequential') +read(u, *) a +call assert(all(a == [1, 2, 3])) +close(u) + +! Test mode "a" +u = open(filename, "a", access = 'sequential') +write(u, *) 4, 5, 6 +close(u) +u = open(filename, "r", access = 'sequential') +read(u, *) a +call assert(all(a == [1, 2, 3])) +read(u, *) a +call assert(all(a == [4, 5, 6])) +close(u) + + +! Stream binary file +filename = get_outpath() // "/io_open_stream.bin" ! Test mode "w" u = open(filename, "wb") @@ -59,9 +84,34 @@ program test_open close(u) +! Sequential binary file +filename = get_outpath() // "/io_open_seq.bin" + +! Test mode "w" +u = open(filename, "wb", access = 'sequential') +write(u) 1, 2, 3 +close(u) + +! Test mode "r" +u = open(filename, "rb", access = 'sequential') +read(u) a +call assert(all(a == [1, 2, 3])) +close(u) + +! Test mode "a" +u = open(filename, "ab", access = 'sequential') +write(u) 4, 5, 6 +close(u) +u = open(filename, "rb", access = 'sequential') +read(u) a +call assert(all(a == [1, 2, 3])) +read(u) a +call assert(all(a == [4, 5, 6])) +close(u) + !0 and non-0 open -filename = get_outpath() // "/io_open.stream" +filename = get_outpath() // "/io_open_stream.bin" u = open(filename, "rb", io) call assert(io == 0) From 58facbd0b2846d6471077a04baf892becbf8d4de Mon Sep 17 00:00:00 2001 From: "Vandenplas, Jeremie" Date: Mon, 6 Jan 2020 22:21:22 +0100 Subject: [PATCH 2/2] Commented direct access because not well supported --- src/stdlib_experimental_io.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stdlib_experimental_io.f90 b/src/stdlib_experimental_io.f90 index 932cdfe8f..2b20d6234 100644 --- a/src/stdlib_experimental_io.f90 +++ b/src/stdlib_experimental_io.f90 @@ -347,8 +347,8 @@ integer function open(filename, mode, iostat, access) result(u) if (present(access)) then select case (trim(adjustl(access))) - case('direct') - access_ = 'direct' +! case('direct') +! access_ = 'direct' case('sequential') access_ = 'sequential' case('stream')