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

;+
; GR_BIN_DS
;	Read an individual dataset from a binary 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 (binary version): 15/1/97; SJT
;	Add version argument: 14/5/99; SJT
;-

tag = '   '

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
    
    readu, ilu, tag
    
                                ; 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 (strtrim(tag)) of
        
        'J': begin
            data(nset).pline = gr_int_rd(ilu, 1)
            jflag = 1b
        end
        
        'P': data(nset).psym = gr_int_rd(ilu, 1)
        'S': data(nset).symsize = gr_flt_rd(ilu, 1)
        'L': data(nset).line = gr_int_rd(ilu, 1)
        'C': data(nset).colour = gr_int_rd(ilu, 1)
        'W': data(nset).thick = gr_int_rd(ilu, 1)
        'O': data(nset).sort = gr_byt_rd(ilu, 1)
        'K': data(nset).noclip = gr_byt_rd(ilu, 1)
        'E': data(nset).medit = gr_byt_rd(ilu, 1)
        'D': data(nset).descript = gr_str_rd(ilu)

        
        'N': begin
            if (version(0) eq 2 and version(1) le 1) or  $
              (version(0) lt 2) then $
              data(nset).ndata = gr_int_rd(ilu, 1) $
            else $
              data(nset).ndata = gr_lon_rd(ilu, 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_rd(ilu, 1) $
            else $
              data(nset).ndata2 = gr_lon_rd(ilu, 1)
            nflag2 = 1b
        end
        'T': begin
            data(nset).type = gr_int_rd(ilu, 1)
            tflag = 1b
        end
        'M': data(nset).mode = gr_int_rd(ilu, 1)
        
        'ZF':  data(nset).zopts.format = gr_int_rd(ilu, 1)
        
        'ZNL': begin
            data(nset).zopts.n_levels = gr_int_rd(ilu, 1)
            if (data(nset).zopts.n_levels gt 0) then cflag(0) = 1b
        end
        'ZL': data(nset).zopts.levels = $
          gr_flt_rd(ilu, data(nset).zopts.n_levels)
        
        'ZNC': begin
            data(nset).zopts.n_cols = gr_int_rd(ilu, 1)
            cflag(1) = 1b
        end
        'ZC': data(nset).zopts.colours = $
          gr_int_rd(ilu, data(nset).zopts.n_cols)
        
        'ZNS': begin
            data(nset).zopts.n_sty = gr_int_rd(ilu, 1)
            cflag(2) = 1b
        end
        'ZS': data(nset).zopts.style = $
          gr_int_rd(ilu, data(nset).zopts.n_sty)
        
        'ZNT': begin
            data(nset).zopts.n_thick = gr_int_rd(ilu, 1)
            cflag(3) = 1b
        end
        'ZT': data(nset).zopts.thick = $
          gr_int_rd(ilu, data(nset).zopts.n_thick)
        
        'ZCF': data(nset).zopts.fill = gr_byt_rd(ilu, 1)
        'ZLI': data(nset).zopts.label = $
          gr_int_rd(ilu, 1)
        
        'ZR': data(nset).zopts.range = gr_flt_rd(ilu, 2)
        'ZP': data(nset).zopts.pxsize = gr_flt_rd(ilu, 1)
        
        'R': begin
            if (data(nset).type eq -4) then $
              xydata.range = gr_flt_rd(ilu, 4) $
            else $
              xydata.range = gr_flt_rd(ilu, 2)
        end
        'F': xydata.funct = gr_str_rd(ilu)
        'FX': xydata.funct(0) = gr_str_rd(ilu)
        'FY': xydata.funct(1) = gr_str_rd(ilu)
        
        'VS': begin
            ncols = gr_int_rd(ilu, 1)
            readu, ilu, xydata
            readu, ilu, tag
        end
        'ZXS': begin
            xv = gr_flt_rd(ilu, data(nset).ndata)
            handle_value, xydata.x, xv, /set, /no_copy
            readu, ilu, tag
        end
        'ZYS': begin
            yv = gr_flt_rd(ilu, data(nset).ndata2)
            handle_value, xydata.y, yv, /set, /no_copy
            readu, ilu, tag
        end
        'ZZS': begin
            zv = fltarr(data(nset).ndata, data(nset).ndata2)
            readu, ilu, zv
            handle_value, xydata.z, zv, /set, /no_copy
            readu, ilu, tag
        end
        
        'DE': goto, ds_read
        
        Else: begin
            graff_msg, msgid, "Unknown DS tag: " + $
              tag + "Ignoring."
            stop
        end
    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
    
    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