module aqm_rc_mod

  implicit none

  integer, parameter :: AQM_RC_SUCCESS = 0
  integer, parameter :: AQM_RC_FAILURE = -1

  public

contains

  logical function aqm_rc_check(rcToCheck, msg, file, line, rc)

    integer,                    intent(in)  :: rcToCheck
    character(len=*), optional, intent(in)  :: msg
    character(len=*), optional, intent(in)  :: file
    integer,          optional, intent(in)  :: line
    integer,          optional, intent(out) :: rc

    ! -- local variables
    integer, parameter :: maxMsgLen = 255
    character(len=maxMsgLen) :: descr  = "Internal error"
    character(len=maxMsgLen) :: label  = ""

    ! -- begin
    if (present(rc)) rc = rcToCheck

    aqm_rc_check = (rcToCheck /= AQM_RC_SUCCESS)

    if (aqm_rc_check) then
      if (present(msg))  descr = msg
      if (present(line)) write(label, '(i0)') line
      if (present(file)) label = trim(file) // ":" // trim(label)
      if (len_trim(label) > 0) label = " " // trim(label)
      write(0,'("ERROR:",a,1x,a)') trim(label), trim(descr)
      flush(0)
      write(6,'("ERROR:",a,1x,a)') trim(label), trim(descr)
      flush(6)
    end if

  end function aqm_rc_check

  subroutine aqm_rc_set(rcToCheck, msg, file, line, rc)

    integer,                    intent(in)  :: rcToCheck
    character(len=*), optional, intent(in)  :: msg
    character(len=*), optional, intent(in)  :: file
    integer,          optional, intent(in)  :: line
    integer,          optional, intent(out) :: rc

    ! -- local variables
    logical :: flag

    ! -- begin
    flag = aqm_rc_check(rcToCheck, msg=msg, file=file, line=line, rc=rc)

  end subroutine aqm_rc_set

  logical function aqm_rc_test(flagToTest, msg, file, line, rc)

    logical,                    intent(in)  :: flagToTest
    character(len=*), optional, intent(in)  :: msg
    character(len=*), optional, intent(in)  :: file
    integer,          optional, intent(in)  :: line
    integer,          optional, intent(out) :: rc

    ! -- local variables

    ! -- begin
    if (present(rc)) rc = AQM_RC_SUCCESS

    aqm_rc_test = flagToTest

    if (flagToTest) call aqm_rc_set(AQM_RC_FAILURE, msg=msg, file=file, line=line, rc=rc)

  end function aqm_rc_test

end module aqm_rc_mod