Viewing contents of file '../idllib/uit/pro/dbext_ind.pro'
pro dbext_ind,list,item,dbno,values
;+
; NAME:
;	DBEXT_IND
; PURPOSE:
;	routine to read a indexed item values from index file
;
; CALLING SEQUENCE:  
;	dbext_ind,list,item,dbno,values
;
; INPUTS:
;	list - list of entry numbers to extract values for
;		(if it is a scalar, values for all entries are extracted)
;	item - item to extract
;	dbno - number of the opened data base
;
; OUTPUT:
;	values - vector of values returned as function value
; HISTORY:
;	version 1  D. Lindler  Feb 88
;	Faster processing of string values    W. Landsman   April, 1992
;-
On_error,2
;
if N_params() LT 4 then begin
     print,'Syntax - dbext_ind, list, item, dbno, values'
     return
endif

; Determine first and last block to extract
;
s=size(list) & ndim=s(0)
if (ndim GT 0) then if (list(0) EQ -1) then ndim=0
zeros = 0				;flag if zero's present in list

if ndim EQ 0 then begin
	minl = 1
	maxl = db_info('ENTRIES',dbno)
    end else begin
	minl = min(list)
	if minl EQ 0 then begin	;any zero values in list
		zeros = 1
		nonzero = where(list GT 0)
		bad = where(list LE 0)
		minl = min(list(nonzero))
	endif
	maxl=max(list)
end
;
; get item info
;
db_item,item,it,ivalnum,dtype,sbyte,numvals,nbytes
nbytes = nbytes(0)
if N_elements(it) GT 1 then $
	message,'ERROR - Only one item can be extracted by dbext_ind'

itnum=db_item_info('itemnumber',it(0))	;item number in this dbno
;
; determine if indexed
;
index_type = db_item_info('index',it(0))
if index_type EQ 0  then $
	message,'ERROR - Requested item is not indexed'

if index_type EQ 3 then $
	message,'ERROR - Unsorted values of item not recorded in index file'
;
; get unit number of index file and read header info
;
unit=db_info('UNIT_DBX',dbno)
p=assoc(unit,lonarr(2))
h=p(0)
p = assoc(unit,lonarr(7,h(0)),8)
header = p(0)
items = header(0,*)
pos = where(items EQ itnum) & pos=pos(0)
if !ERR LT 1 then $
	message,'Item not indexed, DBNO may be wrong'

;
; find starting location to read
;
if index_type NE 4 then sblock=header(4,pos) else sblock=header(6,pos)
;
sbyte = 512L*sblock
sbyte = sbyte+(minl-1L)*nbytes
nv = (maxl-minl+1L) ;number of bytes to extract
;            
; create mapped i/o variable
;
dtype = dtype(0)
if dtype NE 7 then $
   p = assoc(unit, make_array(size=[1,nv,dtype,0],/NOZERO), sbyte ) else $
   p = assoc(unit, make_array(size=[2,nbytes,nv,1,0],/NOZERO), sbyte )
;
; read values from file
; Modified, April 92 to delay conversion to string until the last step WBL
;
values = p(0)
;
; if subset list specified perform extraction
;
if ndim NE 0 then begin
	if zeros then begin			;zero out bad values
		if dtype NE 7 then begin	;not a string?
  		        values = values( (list-minl)>0 )
			values(bad)=0
		   end else begin		        ;string 
                        values = values(*, (list-minl)>0 )
                        if N_elements(bad) EQ 1 then bad = bad(0)
			values(0,bad) = replicate( 32b, nbytes )
                   endelse
	   end else begin
		  if dtype EQ 7 then values = values(*, list-minl) $
                                else values = values( list-minl )
	end
end
if dtype EQ 7 then values = string(values)
return
end