/usr/share/gnudatalanguage/astrolib/sxgpar.pro is in gdl-astrolib 2018.02.16+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | function sxgpar,h,par,name,type,sbyte,nbytes
;
;+
; NAME:
; SXGPAR
;
; PURPOSE:
; Obtain group parameter value in SDAS/FITS file
;
; CALLING SEQUENCE:
; result = sxgpar( h, par, name, [ type, sbyte, nbytes] )
;
; INPUTS:
; h - header returned by SXOPEN
; par - parameter block returned by SXREAD or multiple
; parameter blocks stored in array of dimension
; greater than one.
; name - parameter name (keyword PTYPEn) or integer
; parameter number.
;
; OPTIONAL INPUT/OUTPUT
; type - data type (if not supplied or null string, the
; header is searched for type,sbyte, and nbytes)
; sbyte - starting byte in parameter block for data
; nbytes - number of bytes in parameter block for data
;
; OUTPUT:
; parameter value or value(s) returned as function value
;
; SIDE EFFECTS:
; If an error occured then !err is set to -1
;
; OPERATIONAL NOTES:
; Supplying type, sbyte and nbytes greatly decreases execution
; time. The best way to get the types is on the first call
; pass undefined variables for the three parameters or set
; type = ''. The routine will then return their values for
; use in subsequent calls.
;
; METHOD:
; The parameter type for parameter n is obtained
; from PDTYPEn keyword. If not found then DATATYPE keyword
; value is used. If that is not found then BITPIX is
; used. BITPIX=8, byte; BITPIX=16 integer*2; BITPIX=32
; integer*4.
;
; HISTORY:
; version 1 D. Lindler Oct. 86
; version 2 D. Lindler Jan. 90 added ability to process
; multiple parameter blocks in single call
; version 3 D. Lindler (converted to New vaxidl)
; Apr 14 1991 JKF/ACC - fixed make_array datatypes(float/double)
; Converted to IDL V5.0 W. Landsman September 1997
;-
;------------------------------------------------------------
On_error,2
if N_params() lt 3 then $
message,'Syntax - result = sxgpar( h, par, name, [ type, sbyte, nbytes ])'
;
; determine size of output result
;
s = size(par)
ndim = s[0]
dtype = s[ndim+1]
case 1 of
(ndim eq 0) or (dtype ne 1) : begin
print,'SXGPAR - invalid parameter block specified'
return,0
end
ndim eq 1 : begin
scalar = 1 ; output will be scalar
dimen = intarr(1)+1
end
else: begin
scalar = 0 ; output will be vector
dimen = s[2:ndim]
end
endcase
plen = s[1] ;length of parameter blocks
;
; check if type, sbyte and nbytes supplied
;
if n_elements(type) ne 0 then if strtrim(type) ne '' then goto,bypass
;
; check remaining input parameters
;
s=size(h)
!err=-1
if (s[0] ne 1) or (s[2] ne 7) then begin
print,'SXGPAR -- Header array must be string array'
return,0
end
if strlen(h[0]) ne 80 then begin
print,'SXGPAR -- header must contain 80 character strings'
return,0
end
;
if n_elements(name) eq 0 then begin
print,'SXGPAR -- parameter name must be a scalar'
return,0
endif
;
; get number of group parameters and size
;
;
pcount=sxpar(h,'PCOUNT') ;get number of group parameters
if pcount eq 0 then begin
print,'sxgpar -- No group parameters present'
return,0
endif
psize=sxpar(h,'PSIZE') ;number of bits in parameter block
if psize eq 0 then psize=sxpar(h,'BITPIX')*pcount
;
; determine if name supplied or parameter number
;
s=size(name)
if s[1] eq 7 then begin ;is it a string?
nam=strtrim(strupcase(name)) ;convert to upper case and trim
;
; search for parameter name
;
for i=1,pcount do begin
if strtrim(sxpar(h,'PTYPE'+strtrim(i,2))) eq nam then $
goto,found
endfor
!err=-1
print,'SXGPAR -- group parameter ',name,' not found'
return,0
found:
ipar=i
end else begin ;integer
ipar=fix(name)
if ipar gt pcount then begin
!err=-1
print,'SXGPAR -- parameter number',name,' is too large'
print,' -- only ',pcount,' group parameters'
return,0
endif
endelse
;
; find starting position of parameter in parameter block
;
nbits=0 ;number of bits to skip
if ipar gt 1 then begin
for i=1,ipar-1 do begin
nbit=sxpar(h,'PSIZE'+strtrim(i,2))
if !err lt 0 then nbit=sxpar(h,'bitpix')
nbits=nbits+nbit
endfor
endif
sbyte=nbits/8 ;number of bytes to skip
;
; determine type of output data
;
charn=strtrim(ipar,2) ;convert ipar to string
type=strtrim(sxpar(h,'pdtype'+charn))
if !err lt 0 then type=strtrim(sxpar(h,'datatype'))
if !err lt 0 then begin
case sxpar(h,'bitpix') of
8: type = 'BYTE'
16: type = 'INTEGER*2'
32: type = 'INTEGER*4'
-32: type = 'REAL*4'
endcase
endif
;
; get number of bytes from type
;
aster=strpos(type,'*')
if aster gt 0 then $
nbytes=fix(strmid(type,aster+1,strlen(type)-aster-1)) $
else nbytes=4
BYPASS:
;-------------------------------------------------------------
;
; get first character of type
;
c=strupcase(strmid(type,0,1))
;
; create output vector
;
if c eq 'L' then c = 'I' ;change LOGICAL to INTEGER
case c of
'R' : if nbytes eq 8 then $
val = make_array(dimension=dimen,/double) $
else val = make_array(dimension=dimen,/float)
'I' : case nbytes of
1: val=make_array(dimension=dimen,/byte)
2: val=make_array(dimension=dimen,/int)
4: val=make_array(dimension=dimen,/long)
endcase
'B' : val = make_array(dimension=dimen,/byte)
'C' : val = make_array(dimension=dimen,/string)
else: begin
print,'sxgpar -- unsupported group parameter data type'
!err=-1
return,0
end
endcase
nval = n_elements(val)
;
; extract data
;
for i=0,nval-1 do begin
ssbyte = sbyte + plen*i
case c of
'R' : begin
if nbytes eq 4 then val[i]=float(par,ssbyte)
if nbytes eq 8 then val[i]=double(par,ssbyte)
end
'I' : begin
if nbytes eq 1 then val[i]=byte(par,ssbyte)
if nbytes eq 2 then val[i]=fix(par,ssbyte)
if nbytes eq 4 then val[i]=long(par,ssbyte)
end
'B' :val=byte(par,ssbyte,1)
'C' : begin
val[i]=string(byte(par,ssbyte,nbytes))
end
endcase
endfor
;
if scalar then val=val[0]
!err=0
return,val
end
|