Viewing contents of file '../idllib/contrib/tappin/graffer/gr_get_ds.pro'
pro Gr_get_ds, data, nset, ilu, msgid, version

;+
; GR_GET_DS
;	Read an individual dataset from a V2.x GRAFFER file.
;
; Arguments:
;	data	struct	in/out	The graffer dataset structure
;	nset	int	input	The serial number of the current
;				dataset.
;	ilu	int	input	File unit number to read
;	msgid	long	input	ID of message window (if created).
;	version	float	input	Version of dataset begin read.	
;
; History:
;	Original: 5/11/96; SJT
;	Shorten name: 25/11/96; SJT
;	Add version argument: 14/5/99; SJT
;-

inline = ''

nflag = 0b
nflag2 = 0b
tflag = 0b
dflag = 0b
cflag = bytarr(4)
jflag = 0b

elements = [2, 3, 4, 3, 4, 4, 5, 5, 6]

while (not eof(ilu)) do begin
    
    readf, ilu, inline
    tag_val = str_sep(inline, ':')
    for itag = 0, n_elements(tag_val) - 2, 2 do begin
        
                                ; Recognised tags:
                                ; J - Joining option
                                ; P - symbol
                                ; S - symbol size
                                ; L - line style
                                ; C - colour
                                ; W - thickness (width)
                                ; O - sorted? (Order)
                                ; D - description
                                ; N - number of points (or
                                ;     evaluations)
                                ; N2- Number of points in y-direction
                                ;     for 2-D data.
                                ; T - type
                                ; M - Mode
                                ; K - noclip (both C & N are already
                                ;     bagged)
                                ; E - Mouse editing
                                ; R - function range
                                ; F, FX, FY - function specifiers
                                ; VS, VE - start & end XY data.
                                ; DE - end dataset
        
        case (tag_val(itag)) of
            
            'J': begin
                data(nset).pline = gr_int_val(tag_val(itag+1), 1)
                jflag = 1b
            end
            
            'P': data(nset).psym = gr_int_val(tag_val(itag+1), 1)
            'S': data(nset).symsize = gr_flt_val(tag_val(itag+1), 1)
            'L': data(nset).line = gr_int_val(tag_val(itag+1), 1)
            'C': data(nset).colour = gr_int_val(tag_val(itag+1), 1)
            'W': data(nset).thick = gr_int_val(tag_val(itag+1), 1)
            'O': data(nset).sort = gr_byt_val(tag_val(itag+1), 1)
            'K': data(nset).noclip = gr_byt_val(tag_val(itag+1), 1)
            'E': data(nset).medit = gr_byt_val(tag_val(itag+1), 1)
            'D': begin
                data(nset).descript = gr_str_val(inline, 'D')
                goto, new_line
            end

    
            'N': begin
                if (version(0) eq 2 and version(1) le 1) or $
                  (version(0) lt 2) then $
                  data(nset).ndata = gr_int_val(tag_val(itag+1), 1) $
                else $
                  data(nset).ndata = gr_lon_val(tag_val(itag+1), 1)
                nflag = 1b
            end
            'N2': begin
                if (version(0) eq 2 and version(1) le 1) or $
                  (version(0) lt 2) then $
                  data(nset).ndata2 = gr_int_val(tag_val(itag+1), 1) $
                else $
                  data(nset).ndata2 = gr_lon_val(tag_val(itag+1), 1)
                nflag2 = 1b
            end
            'T': begin
                data(nset).type = gr_int_val(tag_val(itag+1), 1)
                tflag = 1b
            end
            'M': data(nset).mode = gr_int_val(tag_val(itag+1), 1)
            
            'ZF':  data(nset).zopts.format = gr_int_val(tag_val(itag+1), 1)
            
            'ZNL': begin
                data(nset).zopts.n_levels = gr_int_val(tag_val(itag+1), 1)
                if (data(nset).zopts.n_levels gt 0) then cflag(0) = 1b
            end
            'ZL': if (cflag(0)) then data(nset).zopts.levels = $
              gr_flt_val(tag_val(itag+1), data(nset).zopts.n_levels) $
            else graff_msg, msgid, "** W A R N I N G ** Contour level " + $
              "list given without count - ignored"
            
            'ZNC': begin
                data(nset).zopts.n_cols = gr_int_val(tag_val(itag+1), 1)
                cflag(1) = 1b
            end
            'ZC': if (cflag(1)) then data(nset).zopts.colours = $
              gr_int_val(tag_val(itag+1), data(nset).zopts.n_cols) $
            else graff_msg, msgid, "** W A R N I N G ** Contour colour " + $
              "list given without count - ignored"
            
            'ZNS': begin
                data(nset).zopts.n_sty = gr_int_val(tag_val(itag+1), 1)
                cflag(2) = 1b
            end
            'ZS': if (cflag(2)) then data(nset).zopts.style = $
              gr_int_val(tag_val(itag+1), data(nset).zopts.n_sty) $
            else graff_msg, msgid, "** W A R N I N G ** Contour style " + $
              "list given without count - ignored"
            
            'ZNT': begin
                data(nset).zopts.n_thick = gr_int_val(tag_val(itag+1), 1)
                cflag(3) = 1b
            end
            'ZT': if (cflag(3)) then data(nset).zopts.thick = $
              gr_int_val(tag_val(itag+1), data(nset).zopts.n_thick) $
            else graff_msg, msgid, "** W A R N I N G ** Contour thickness " + $
              "list given without count - ignored"
            
            'ZCF': data(nset).zopts.fill = gr_int_val(tag_val(itag+1), 1)
            'ZLI': data(nset).zopts.label = $
              gr_int_val(tag_val(itag+1), 1)
            
            'ZR': data(nset).zopts.range = gr_flt_val(tag_val(itag+1), 2)
            'ZP': data(nset).zopts.pxsize = gr_flt_val(tag_val(itag+1), 1)
            
            'R': begin
                if (not dflag) then $
                  graff_msg, msgid, "Range found before type defined " + $
                  "- ignored" $
                else if (data(nset).type ge 0) then $
                  graff_msg, msgid, "Range found in XY data set - ignored" $
                else if (data(nset).type eq -4) then $
                  xydata.range = gr_flt_val(tag_val(itag+1), 4) $
                else $
                  xydata.range = gr_flt_val(tag_val(itag+1), 2)
            end
            'F': begin
                if (not dflag) then $
                  graff_msg, msgid, "Function found before type defined " + $
                  "- ignored" $
                else if (data(nset).type ge 0) then $
                  graff_msg, msgid, "Function found in XY data set - ignored" $
                else if (data(nset).type eq -3) then $
                  graff_msg, msgid, "Plain function found in " + $
                  "parametric set - ignored" $ 
                else xydata.funct = gr_str_val(inline, 'F')
                goto, new_line
            end
            'FX': begin
                if (not dflag) then $
                  graff_msg, msgid, "Function found before type defined " + $
                  "- ignored" $
                else if (data(nset).type ge 0) then $
                  graff_msg, msgid, "Function found in XY data set - ignored" $
                else if (data(nset).type ne -3) then $
                  graff_msg, msgid, "X function found in " + $
                  "plain function - ignored" $ 
                else xydata.funct(0) = gr_str_val(inline, 'FX')
                goto, new_line
            end
            'FY': begin
                if (not dflag) then $
                  graff_msg, msgid, "Function found before type defined " + $
                  "- ignored" $
                else if (data(nset).type ge 0) then $
                  graff_msg, msgid, "Function found in XY data set - ignored" $
                else if (data(nset).type ne -3) then $
                  graff_msg, msgid, "Y function found in " + $
                  "plain function - ignored" $ 
                else xydata.funct(1) = gr_str_val(inline, 'FY')
                goto, new_line
            end
            
            'VS': begin
                if (not dflag) then begin
                    graff_msg, msgid, "Data found before type defined " + $
                      "- ignored"
                    repeat readf, ilu, inline  $
                      until strpos(inline, 'VE:') ne -1
                endif else if (data(nset).type lt 0) then begin
                    graff_msg, msgid, "Data found in function dataset " + $
                      "- ignored"
                    repeat readf, ilu, inline  $
                      until strpos(inline, 'VE:') ne -1
                endif else if (data(nset).type gt 8) then begin
                    graff_msg, msgid, '1-D Data found in 2-D dataset ' + $
                      "- ignored"
                    repeat readf, ilu, inline  $
                      until strpos(inline, 'VE:') ne -1
                endif else begin
                    ncols = gr_int_val(tag_val(itag+1), 1)
                    if (ncols ne elements(data(nset).type)) then $
                      graff_msg, msgid,  $
                      "WARNING Data columns wrong could get corrupt " + $
                      "DS"
                    readf, ilu, xydata
                    readf, ilu, inline
                    if (strpos(inline, 'VE:') eq -1) then $
                      graff_msg, msgid, $
                      "WARNING Data rows wrong could get corrupt " + $
                      "DS"
                endelse
            end
            'ZXS': begin
                if (not dflag) then begin
                    graff_msg, msgid, "Data found before type defined " + $
                      "- ignored"
                    repeat readf, ilu, inline  $
                      until strpos(inline, 'ZXE:') ne -1
                endif else if (data(nset).type ne 9) then begin
                    graff_msg, msgid, $
                      '2-D Data found in function Or 1-D dataset - ignored'
                    repeat readf, ilu, inline  $
                      until strpos(inline, 'ZXE:') ne -1
                endif else begin
                    xv = fltarr(data(nset).ndata)
                    readf, ilu, xv
                    handle_value, xydata.x, xv, /set, /no_copy
                    readf, ilu, inline
                    if (strpos(inline, 'ZXE:') eq -1) then $
                      graff_msg, msgid, $
                      "WARNING Data X count wrong could get corrupt " + $
                      "DS"
                endelse
            end
            'ZYS': begin
                if (not dflag) then begin
                    graff_msg, msgid, "Data found before type defined " + $
                      "- ignored"
                    repeat readf, ilu, inline  $
                      until strpos(inline, 'ZYE:') ne -1
                endif else if (data(nset).type ne 9) then begin
                    graff_msg, msgid, $
                      '2-D Data found in function Or 1-D dataset - ignored'
                    repeat readf, ilu, inline  $
                      until strpos(inline, 'ZYE:') ne -1
                endif else begin
                    yv = fltarr(data(nset).ndata2)
                    readf, ilu, yv
                    handle_value, xydata.y, yv, /set, /no_copy
                    readf, ilu, inline
                    if (strpos(inline, 'ZYE:') eq -1) then $
                      graff_msg, msgid, $
                      "WARNING Data Y count wrong could get corrupt " + $
                      "DS"
                endelse
            end
            'ZZS': begin
                if (not dflag) then begin
                    graff_msg, msgid, "Data found before type defined " + $
                      "- ignored"
                    repeat readf, ilu, inline  $
                      until strpos(inline, 'ZZE:') ne -1
                endif else if (data(nset).type ne 9) then begin
                    graff_msg, msgid, $
                      '2-D Data found in function Or 1-D dataset - ignored'
                    repeat readf, ilu, inline  $
                      until strpos(inline, 'ZZE:') ne -1
                endif else begin
                    zv = fltarr(data(nset).ndata, data(nset).ndata2)
                    readf, ilu, zv
                    handle_value, xydata.z, zv, /set, /no_copy
                    readf, ilu, inline
                    if (strpos(inline, 'ZZE:') eq -1) then $
                      graff_msg, msgid, $
                      "WARNING Data Z count wrong could get corrupt " + $
                      "DS"
                endelse
            end
            
            'DE': goto, ds_read
            
            Else: graff_msg, msgid, $
              "Unknown Dataset tag "+tag_val(itag)+" - ignored"
        endcase
        
        
        if (nflag and tflag and not dflag) then begin
            dflag = 1b
            case data(nset).type of
                -4: xydata = {graff_zfunct,  $
                              Range:fltarr(2, 2),  $
                              Funct:''}
                    
                -3: xydata = {graff_pfunct,  $
                              Range:fltarr(2), $
                              Funct:strarr(2)}
                -2: xydata = {graff_funct,  $
                              Range:fltarr(2), $
                              Funct:''}
                -1: xydata = {graff_funct,  $
                              Range:fltarr(2), $
                              Funct:''}
                9: if (nflag2) then begin
                    xydata = {graff_zdata,  $
                              Z: handle_create(), $
                              X: handle_create(), $
                              Y: handle_create()}
                endif else dflag = 0b
                
                Else: begin
                    xydata = fltarr(elements(data(nset).type), $
                                    data(nset).ndata > 2)
                end
            endcase
        endif
    endfor
    
    New_line:
    
endwhile

Ds_read:

if (not jflag) then begin
    if (data(nset).psym eq 10) then begin
        data(nset).pline = 2
        data(nset).psym = 0
    endif else if (data(nset).psym eq 0) then begin
        data(nset).pline = 1
    endif else if (data(nset).psym lt 0) then begin
        data(nset).pline = 1
        data(nset).psym = abs(data(nset).psym)
    endif else data(nset).pline = 0
endif

data(nset).xydata = handle_create()
handle_value, data(nset).xydata, xydata, /set, /no_copy

end