check_exponent Subroutine

private pure subroutine check_exponent(text, pos, err)

Validate the exponent part of a real, starting at pos.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: text
integer(kind=default_int), intent(in) :: pos
type(error_t), intent(inout) :: err

Calls

proc~~check_exponent~~CallsGraph proc~check_exponent check_exponent proc~error_set error_t%error_set proc~check_exponent->proc~error_set proc~skip_sign skip_sign proc~check_exponent->proc~skip_sign

Called by

proc~~check_exponent~~CalledByGraph proc~check_exponent check_exponent proc~parse_real_wide parse_real_wide proc~parse_real_wide->proc~check_exponent proc~parse_real_dp_char parse_real_dp_char proc~parse_real_dp_char->proc~parse_real_wide proc~parse_real_dp_string parse_real_dp_string proc~parse_real_dp_string->proc~parse_real_wide proc~parse_real_sp_char parse_real_sp_char proc~parse_real_sp_char->proc~parse_real_wide interface~parse_real parse_real interface~parse_real->proc~parse_real_dp_char interface~parse_real->proc~parse_real_dp_string interface~parse_real->proc~parse_real_sp_char proc~parse_real_sp_string parse_real_sp_string interface~parse_real->proc~parse_real_sp_string proc~parse_real_sp_string->proc~parse_real_sp_char proc~cli_get_real_dp cli_t%cli_get_real_dp proc~cli_get_real_dp->interface~parse_real proc~cli_get_real_sp cli_t%cli_get_real_sp proc~cli_get_real_sp->interface~parse_real

Variables

Type Visibility Attributes Name Initial
integer(kind=default_int), private :: scan_pos

Source Code

   pure subroutine check_exponent(text, pos, err)
      !! Validate the exponent part of a real, starting at `pos`.
      character(len=*), intent(in) :: text
      integer(default_int), intent(in) :: pos
      type(error_t), intent(inout) :: err

      integer(default_int) :: scan_pos

      if (index(EXPONENT_MARKERS, text(pos:pos)) == 0) then
         call err%set(ERROR_PARSE, "invalid character '"//text(pos:pos)// &
                      "' while parsing the real '"//text//"'")
         return
      end if

      scan_pos = pos + 1
      call skip_sign(text, scan_pos)
      if (scan_pos > len(text)) then
         call err%set(ERROR_PARSE, "missing exponent digits in '"//text//"'")
         return
      end if

      do while (scan_pos <= len(text))
         if (index(digits, text(scan_pos:scan_pos)) == 0) then
            call err%set(ERROR_PARSE, "invalid character '"//text(scan_pos:scan_pos)// &
                         "' in the exponent of '"//text//"'")
            return
         end if
         scan_pos = scan_pos + 1
      end do

   end subroutine check_exponent