read_line Subroutine

private subroutine read_line(self, unit, form, iostat, iomsg)

Arguments

Type IntentOptional AttributesName
class(string), intent(inout) :: self

The string.

integer, intent(in) :: unit

Logical unit.

character(len=*), intent(in), optional :: form

Format of unit.

integer, intent(out), optional :: iostat

IO status code.

character(len=*), intent(inout), optional :: iomsg

IO status message.

Description

Read line (record) from a connected unit.

The line is read as an ascii stream read until the eor is reached.


Variables

TypeVisibility AttributesNameInitial
type(string), public :: form_

Format of unit, local variable.

integer, public :: iostat_

IO status code, local variable.

character(len=:), public, allocatable:: iomsg_

IO status message, local variable.

character(kind=CK,len=:), public, allocatable:: line

Line storage.

character(kind=CK,len=1), public :: ch

Character storage.


Source Code

  subroutine read_line(self, unit, form, iostat, iomsg)
  !---------------------------------------------------------------------------------------------------------------------------------
  !< Read line (record) from a connected unit.
  !<
  !< The line is read as an ascii stream read until the eor is reached.
  !<
  !< @note For unformatted read only `access='stream'` is supported with new_line as line terminator.
  !---------------------------------------------------------------------------------------------------------------------------------
  use, intrinsic :: iso_fortran_env, only : iostat_eor
  !---------------------------------------------------------------------------------------------------------------------------------
  class(string),    intent(inout)           :: self    !< The string.
  integer,          intent(in)              :: unit    !< Logical unit.
  character(len=*), intent(in),    optional :: form    !< Format of unit.
  integer,          intent(out),   optional :: iostat  !< IO status code.
  character(len=*), intent(inout), optional :: iomsg   !< IO status message.
  type(string)                              :: form_   !< Format of unit, local variable.
  integer                                   :: iostat_ !< IO status code, local variable.
  character(len=:),          allocatable    :: iomsg_  !< IO status message, local variable.
  character(kind=CK, len=:), allocatable    :: line    !< Line storage.
  character(kind=CK, len=1)                 :: ch      !< Character storage.
  !---------------------------------------------------------------------------------------------------------------------------------

  !---------------------------------------------------------------------------------------------------------------------------------
  form_ = 'FORMATTED' ; if (present(form)) form_ = form ; form_ = form_%upper()
  iomsg_ = repeat(' ', 99) ; if (present(iomsg)) iomsg_ = iomsg
  line = ''
  select case(form_%chars())
  case('FORMATTED')
    do
      read(unit, "(A)", advance='no', iostat=iostat_, iomsg=iomsg_, err=10, end=10, eor=10) ch
      line = line//ch
    enddo
  case('UNFORMATTED')
    do
      read(unit, iostat=iostat_, iomsg=iomsg_, err=10, end=10) ch
      if (ch==new_line('a')) then
        iostat_ = iostat_eor
        exit
      endif
      line = line//ch
    enddo
  endselect
  10 if (line/='') self%raw = line
  if (present(iostat)) iostat = iostat_
  if (present(iomsg)) iomsg = iomsg_
  return
  !---------------------------------------------------------------------------------------------------------------------------------
  endsubroutine read_line