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.
!<
!<```fortran
!< type(string) :: astring
!< type(string) :: line(3)
!< integer :: iostat
!< character(len=99) :: iomsg
!< integer :: scratch
!< integer :: l
!< logical :: test_passed(6)
!< line(1) = ' Hello World! '
!< line(2) = 'How are you? '
!< line(3) = ' All say: "Fine thanks"'
!< open(newunit=scratch, status='SCRATCH')
!< write(scratch, "(A)") line(1)%chars()
!< write(scratch, "(A)") line(2)%chars()
!< write(scratch, "(A)") line(3)%chars()
!< rewind(scratch)
!< l = 0
!< iostat = 0
!< do
!< l = l + 1
!< call astring%read_line(unit=scratch, iostat=iostat, iomsg=iomsg)
!< if (iostat/=0.and..not.is_iostat_eor(iostat)) then
!< exit
!< else
!< test_passed(l) = (astring==line(l))
!< endif
!< enddo
!< close(scratch)
!< open(newunit=scratch, status='SCRATCH', form='UNFORMATTED', access='STREAM')
!< write(scratch) line(1)%chars()//new_line('a')
!< write(scratch) line(2)%chars()//new_line('a')
!< write(scratch) line(3)%chars()//new_line('a')
!< rewind(scratch)
!< l = 0
!< iostat = 0
!< do
!< l = l + 1
!< call astring%read_line(unit=scratch, iostat=iostat, iomsg=iomsg, form='UnfORMatteD')
!< if (iostat/=0.and..not.is_iostat_eor(iostat)) then
!< exit
!< else
!< test_passed(l+3) = (astring==line(l))
!< endif
!< enddo
!< close(scratch)
!< print '(L1)', all(test_passed)
!<```
!=> T <<<
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_
endsubroutine read_line