| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | unit | |||
| type(input_fragment_t), | intent(inout) | :: | fragment | |||
| type(error_t), | intent(out) | :: | error |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer, | private | :: | eq_pos | ||||
| logical, | private | :: | in_indices | ||||
| integer, | private | :: | io_stat | ||||
| character(len=MAX_LINE_LEN), | private | :: | key | ||||
| character(len=MAX_LINE_LEN), | private | :: | line | ||||
| character(len=MAX_LINE_LEN), | private | :: | value |
subroutine parse_fragment(unit, fragment, error) integer, intent(in) :: unit type(input_fragment_t), intent(inout) :: fragment type(error_t), intent(out) :: error character(len=MAX_LINE_LEN) :: line, key, value integer :: io_stat, eq_pos logical :: in_indices in_indices = .false. do read (unit, '(A)', iostat=io_stat) line if (io_stat /= 0) then call error%set(ERROR_IO, "Unexpected end of file in %fragment") return end if line = adjustl(line) if (len_trim(line) == 0) cycle if (line(1:1) == '#' .or. line(1:1) == '!') cycle if (trim(strip_comment(line)) == 'end') then if (in_indices) then in_indices = .false. cycle else exit end if end if if (trim(line) == '%indices') then in_indices = .true. cycle end if if (in_indices) then ! Read indices call parse_indices_line(line, fragment, error) if (error%has_error()) then call error%add_context("mqc_config_parser:parse_fragment") return end if else eq_pos = index(line, '=') if (eq_pos > 0) then key = adjustl(line(1:eq_pos - 1)) value = adjustl(line(eq_pos + 1:)) select case (trim(key)) case ('charge') read (value, *, iostat=io_stat) fragment%charge case ('multiplicity') read (value, *, iostat=io_stat) fragment%multiplicity case default call error%set(ERROR_PARSE, "Unknown key in fragment properties: "//trim(key)) return end select end if end if end do end subroutine parse_fragment