;+
; Project : SOHO - CDS
;
; Name : TAG_EXIST()
;
; Purpose : To test whether a tag name exists in a structure.
;
; Explanation : Routine obtains a list of tagnames and tests whether the
; requested one exists or not. The search is recursive so
; if any tag names in the structure are themselves structures
; the search drops down to that level. (However, see the keyword
; TOP_LEVEL).
;
; Use : IDL> status = tag_exist(str, tag)
;
; Inputs : str - structure variable to search
; tag - tag name to search for
;
; Opt. Inputs : None
;
; Outputs : Function returns 1 if tag name exists or 0 if it does not.
;
; Opt. Outputs: None
;
; Keywords : INDEX = Index of matching tag
;
; TOP_LEVEL = If set, then only the top level of the structure is
; searched.
; RECURSE = set to recurse on nested structures
;
; Category : Util, structure
;
; Written : C D Pike, RAL, 18-May-94
;
; Modified : Version 1.1, D Zarro, ARC/GSFC, 27-Jan-95
; Passed out index of matching tag
; Version 2, William Thompson, GSFC, 6 March 1996
; Added keyword TOP_LEVEL
; Version 2.1, Zarro, GSFC, 1 August 1996
; Added call to help
; Version 3, Zarro, EIT/GSFC, 3 June 2000
; added check for input array structure
; Version 4, Zarro, EIT/GSFC, 23 Aug 2000
; removed calls to DATATYPE
; Version 5, Zarro, EIT/GSFC, 29 Sept 2000
; added /quiet
; Version 6, Zarro (EER/GSC), 22 Dec 2002
; made recursion NOT the default
; Removed datatype calls, jmm, 4-jun-2007
;-
function tag_exist, str, tag, index = index, top_level = top_level, $
quiet = quiet, recurse = recurse
;dprint,'% TAG_EXIST: ', get_caller()
loud=1-keyword_set(quiet)
if n_params() lt 2 then begin
if loud then print,'Use: status = tag_exist(structure, tag_name)'
return,0b
endif
;
; check quality of input
;
sz=size(str)
stype=sz(n_elements(sz)-2)
sz=size(tag)
dtype=sz(n_elements(sz)-2)
if (stype ne 8) or (dtype ne 7) then begin
if loud then begin
if stype ne 8 then help,str
if dtype ne 7 then help,tag
print,'Use: status = tag_exist(str, tag)'
print,'str = structure variable'
print,'tag = string variable'
endif
return,0b
endif
i=-1
tn = tag_names(str)
nt = where(tn eq strupcase(tag)) & index=nt[0]
if nt[0] eq -1 then begin
status = 0b
if (not keyword_set(top_level)) and keyword_set(recurse) then begin
for i=0,n_elements(tn)-1 do begin
sz=size(str[0].(i))
dtype=sz(n_elements(sz)-2)
if dtype eq 8 then $
status=tag_exist(str[0].(i),tag,index=index)
if status eq 1b then return,status
endfor
endif
return,0b
endif else begin
return,1b
endelse
end