subroutine ESMF_UtilGetArg(argindex, keywordEnforcer, argvalue, arglength, rc)
!
! !ARGUMENTS:
integer, intent(in) :: argindex
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
character(*), intent(out), optional :: argvalue
integer, intent(out), optional :: arglength
integer, intent(out), optional :: rc
!
! !STATUS:
! \begin{itemize}
! \item\apiStatusCompatibleVersion{5.2.0r}
! \end{itemize}
!
! !DESCRIPTION:
! This method returns a copy of a command line argument specified
! when the process was started. This argument is the same as an
! equivalent C++ program would find in the argv array.
!
! Some MPI implementations do not consistently provide command line
! arguments on PETs other than PET 0. It is therefore recommended
! that PET 0 call this method and broadcast the results to the other
! PETs by using the {\tt ESMF\_VMBroadcast()} method.
!
! The arguments are:
!
! \begin{description}
! \item [{argindex}]
! A non-negative index into the command line argument {\tt argv} array.
! If argindex is negative or greater than the number of user-specified
! arguments, {\tt ESMF\_RC\_ARG\_VALUE} is returned in the {\tt rc} argument.
! \item [{[argvalue]}]
! Returns a copy of the desired command line argument. If the provided
! character string is longer than the command line argument, the string
! will be blank padded. If the string is too short, truncation will
! occur and {\tt ESMF\_RC\_ARG\_SIZE} is returned in the {\tt rc} argument.
! \item [{[arglength]}]
! Returns the length of the desired command line argument in characters.
! The length result does not depend on the length of the {\tt value}
! string. It may be used to query the length of the argument.
! \item [{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!EOP
!-------------------------------------------------------------------------
character(ESMF_MAXPATHLEN) :: localvalue
integer :: localargc, localrc
integer :: localstat
#if defined (ESMF_NEEDSPXFGETARG) || defined (ESMF_NEEDSGETARG)
integer :: locallength
#endif
#if defined (ESMF_NEEDSPXFGETARG)
integer, external :: ipxfconst
integer :: ETRUNC, EINVAL
#endif
! assume failure until success
if (present (rc)) then
rc = ESMF_RC_NOT_IMPL
end if
call ESMF_UtilGetArgc (count=localargc)
if (present (argvalue)) argvalue = ""
if (present (arglength)) arglength = 0
localrc = merge (ESMF_SUCCESS, ESMF_RC_ARG_VALUE, &
argindex >= 0 .and. argindex <= localargc)
if (ESMF_LogFoundError ( localrc, &
ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) &
return
#if !defined (ESMF_NEEDSPXFGETARG) && !defined (ESMF_NEEDSGETARG)
! Fortran 2003 version (default and preferred)
! test on argvalue presense in order to work around a g95
! (version (g95 0.93!) Aug 17 2010) optional argument bug.
if (present (argvalue)) then
call get_command_argument (number=argindex, &
value=argvalue, length=arglength, &
status=localstat)
else
call get_command_argument (number=argindex, &
value=localvalue, length=arglength, &
status=localstat)
end if
! Convert Fortran status to ESMF rc
select case (localstat)
case (0)
localrc = ESMF_SUCCESS
case (-1)
localrc = ESMF_RC_ARG_SIZE
case (1:)
localrc = ESMF_RC_ARG_VALUE
case default
localrc = ESMF_RC_VAL_OUTOFRANGE
end select
#elif defined (ESMF_NEEDSPXFGETARG)
! POSIX Fortran bindings (1003.9-1992)
! Has error checking comparable to F2003. So when F2003 intrinsics
! are not available and PXF is available (e.g., on IRIX), it is
! preferable to calling 'getarg'.
ETRUNC = ipxfconst ("ETRUNC")
EINVAL = ipxfconst ("EINVAL")
if (present (argvalue)) then
call pxfgetarg (argindex, argvalue, locallength, localstat)
else
call pxfgetarg (argindex, localvalue, locallength, localstat)
if (localstat == ETRUNC) localrc = 0
end if
! Convert PXF ierror to ESMF rc
if (localstat == 0) then
localrc = ESMF_SUCCESS
else if (localstat == ETRUNC) then
localrc = ESMF_RC_ARG_SIZE
else if (localstat == EINVAL) then
localrc = ESMF_RC_ARG_VALUE
else
localrc = ESMF_RC_VAL_OUTOFRANGE
end if
if (present (arglength)) then
arglength = locallength
end if
#else
! Non-Standard. But dates back to the original 7th Edition unix f77
! compiler, so is implemented by many compilers. Error checking,
! especially for bad character string lengths, is unreliable.
call getarg (argindex, localvalue)
! If argvalue is present, use the longer of value and localvalue
! for the buffer.
if (present (argvalue)) then
call getarg (argindex, argvalue)
if (len (argvalue) > len (localvalue)) then
locallength = len_trim (argvalue)
else
locallength = len_trim (localvalue)
end if
if (len (argvalue) >= locallength) then
localrc = ESMF_SUCCESS
else
localrc = ESMF_RC_ARG_SIZE
end if
else
locallength = len_trim (localvalue)
localrc = ESMF_SUCCESS
end if
if (present (arglength)) then
arglength = locallength
end if
#endif
if (ESMF_LogFoundError ( localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
return
if (present (rc)) then
rc = localrc
end if
end subroutine ESMF_UtilGetArg