;+ ; 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 ;- 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 datatype(str) ne 'STC' then help,str if datatype(tag) ne 'STR' 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