; docformat = 'rst'
;+
; Routine to resolve a given routine without crashing.
;
; :Examples:
;    For example, try::
;
;       IDL> mg_resolve_routine, 'mg_src_root', resolved=resolved, /either
;       IDL> help, resolved
;       RESOLVED        BYTE      =    1
;       IDL> mg_resolve_routine, 'mg_fake_routine', resolved=resolved, /either
;       IDL> help, resolved                                                         
;       RESOLVED        BYTE      =    0
;
;    Note that `RESOLVE_ROUTINE` would have crashed in the second call to
;    `MG_RESOLVE_ROUTINE`.
;
; :Params:
;    routine : in, required, type=string
;       name of routine to resolve
;
; :Keywords:
;    resolved : out, optional, type=boolean
;       set to a named variable to find out if the routine was resolved
;    _extra : in, optional, type=keywords
;       keywords to `RESOLVE_ROUTINE`
;-
pro mg_resolve_routine, routine, resolved=resolved, _extra=e
  compile_opt strictarr, hidden
  oldQuiet = !quiet
  !quiet = 1
  
  resolved = 0B
    
  catch, error
  if (error ne 0L) then begin
    catch, /cancel
    !quiet = oldQuiet
    return
  endif
  
  ; resolving the currently executing routine is a problem, but if you are
  ; executing the routine it has already been resolved
  if (strlowcase(routine) ne 'mg_resolve_routine') then begin
    resolve_routine, routine, _extra=e
  endif
  
  resolved = 1B
  
  !quiet = oldQuiet
end