read_line Subroutine

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

Type Bound

string

Arguments

Type IntentOptional Attributes Name
class(string), intent(inout) :: self
integer, intent(in) :: unit
character(len=*), intent(in), optional :: form
integer, intent(out), optional :: iostat
character(len=*), intent(inout), optional :: iomsg

Calls

proc~~read_line~~CallsGraph proc~read_line string%read_line proc~chars string%chars proc~read_line->proc~chars proc~upper~2 string%upper proc~read_line->proc~upper~2

Called by

proc~~read_line~~CalledByGraph proc~read_line string%read_line proc~read_lines string%read_lines proc~read_lines->proc~read_line proc~read_lines~3 read_lines proc~read_lines~3->proc~read_line proc~read_lines~4 read_lines proc~read_lines~4->proc~read_line program~volatile_doctest~1104 volatile_doctest program~volatile_doctest~1104->proc~read_line program~volatile_doctest~321 volatile_doctest program~volatile_doctest~321->proc~read_line proc~read_file string%read_file proc~read_file->proc~read_lines proc~read_file~3 read_file proc~read_file~3->proc~read_lines~3 proc~read_file~4 read_file proc~read_file~4->proc~read_lines~4 program~volatile_doctest~353 volatile_doctest program~volatile_doctest~353->proc~read_lines program~volatile_doctest~729 volatile_doctest program~volatile_doctest~729->proc~read_lines proc~glob_string string%glob_string proc~glob_string->proc~read_file program~stringifor_test_csv_naive_parser stringifor_test_csv_naive_parser program~stringifor_test_csv_naive_parser->proc~read_file program~stringifor_test_csv_naive_parser~2 stringifor_test_csv_naive_parser program~stringifor_test_csv_naive_parser~2->proc~read_file program~stringifor_test_parse_large_csv stringifor_test_parse_large_csv program~stringifor_test_parse_large_csv->proc~read_file program~stringifor_test_parse_large_csv~2 stringifor_test_parse_large_csv program~stringifor_test_parse_large_csv~2->proc~read_file program~volatile_doctest~1107 volatile_doctest program~volatile_doctest~1107->proc~read_file program~volatile_doctest~1125 volatile_doctest program~volatile_doctest~1125->proc~read_file program~volatile_doctest~26 volatile_doctest program~volatile_doctest~26->proc~read_file program~volatile_doctest~415 volatile_doctest program~volatile_doctest~415->proc~read_file~3 program~volatile_doctest~444 volatile_doctest program~volatile_doctest~444->proc~read_file program~volatile_doctest~664 volatile_doctest program~volatile_doctest~664->proc~read_file program~volatile_doctest~789 volatile_doctest program~volatile_doctest~789->proc~read_file~3 program~volatile_doctest~964 volatile_doctest program~volatile_doctest~964->proc~read_file interface~glob glob interface~glob->proc~glob_string proc~glob_character string%glob_character interface~glob->proc~glob_character none~glob string%glob none~glob->proc~glob_string none~glob->proc~glob_character proc~glob_character->none~glob program~volatile_doctest~1058 volatile_doctest program~volatile_doctest~1058->none~glob program~volatile_doctest~334 volatile_doctest program~volatile_doctest~334->none~glob program~volatile_doctest~426 volatile_doctest program~volatile_doctest~426->none~glob program~volatile_doctest~468 volatile_doctest program~volatile_doctest~468->interface~glob program~volatile_doctest~498 volatile_doctest program~volatile_doctest~498->interface~glob program~volatile_doctest~511 volatile_doctest program~volatile_doctest~511->none~glob

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.
   !<
   !<```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