; docformat = 'rst'
;+
; Determines if a given routine is available to call. This can be useful when
; there are optional libraries that will be used if available.
;
; :Examples:
; For example, try::
;
; IDL> print, mg_hasroutine('mg_src_root')
; 1
; IDL> print, mg_hasroutine('mg_fake_routine')
; 0
;
; `MG_HASROUTINE` can also give basic information about the routine that it
; found like whether it is a system routine or a function::
;
; IDL> print, mg_hasroutine('mg_hostname', is_system=sys, is_function=func)
; 1
; IDL> print, sys, func
; 1 1
;-
;+
; Checks to see if routine is in list.
;
; :Private:
;
; :Returns:
; 1B if routine in in list; 0B if not
;
; :Params:
; list : in, required, type=strarr
; list of routines to check against
; routine : in, required, type=string
; name of routine to check (case-insensitive)
;-
function mg_hasroutine_check, list, routine
compile_opt strictarr
ind = where(list eq strupcase(routine), count)
return, count gt 0L
end
;+
; Determine if a given routine name is available to call.
;
; :Returns:
; 1B if a routine is available to call, 0B if not
;
; :Params:
; routine : in, required, type=string
; routine name to look up
;
; :Keywords:
; is_system : out, optional, type=boolean
; set to a named variable to determine if the routine is a system
; routine
; is_function : out, optional, type=boolean
; set to a named variable to determine if the routine is a function
;-
function mg_hasroutine, routine, is_system=isSystem, is_function=isFunction
compile_opt strictarr, hidden
isSystem = 0B
isFunction = 0B
case 1 of
mg_hasroutine_check(routine_info(/system), routine): isSystem = 1B
mg_hasroutine_check(routine_info(/system, /functions), routine): begin
isSystem = 1B
isFunction = 1B
end
mg_hasroutine_check(routine_info(), routine):
mg_hasroutine_check(routine_info(/functions), routine): isFunction = 1B
else: begin
mg_resolve_routine, routine, resolved=resolved, /either
if (~resolved) then return, 0B
case 1 of
mg_hasroutine_check(routine_info(), routine):
mg_hasroutine_check(routine_info(/functions), routine): isFunction = 1B
else: return, 0B
endcase
end
endcase
return, 1B
end