Viewing contents of file '../idllib/astron/pro/conv_stsdas.pro'
pro conv_stsdas, sdas_name, FROM_IEEE = from_ieee
;+
; NAME:
;	CONV_STSDAS
; PURPOSE:
;	Convert internal format of an STSDAS image to host machine architecture
; EXPLANATION:
;	Converts the internal format of an STSDAS image (.hhh and .hhd file)
;	to the host machine architecture.     Useful for copying STSDAS files
;	between different machines.     If the host is not a VMS machine, then
;	by default CONV_STSDAS assumes the image originated on VMS.   If the
;	host is VMS, then CONV_STSDAS assumes that the image originated on
;	an IEEE machine (e.g. SparcStation).
;
; CALLING SEQUENCE:
;	CONV_STSDAS, sdas_name, [ /FROM_IEEE]
;
; INPUTS:
;	sdas_name - scalar string giving name of the STSDAS image
;		CONV_STSDAS assumes a default header extension of .hhh -- 
;		otherwise the header extension should be included in sdas_name.
;		The internal format of the file will be modified by CONV_STSDAS.
;
; OPTIONAL KEYWORD INPUT:
;	/FROM_IEEE - On little endian machines (OSF, windows) this keyword
;		indicates that the STSDAS file originated on an IEEE machine
;		(e.g SparcStation) rather than a VMS machine
;
; EXAMPLE:
;	Suppose files test.hhd and test.hhh have been copied with FTP from
;	a Vax to a Sparcstation.   Convert these files to the SparcStation
;	internal format.
;
;	IDL> conv_stsdas, 'test'
;
; METHOD:
;	CONV_STSDAS reads each group image and parameter block and uses 
;	IEEE_TO_HOST or CONV_VAX_UNIX to convert the internal format.   The
;	converted images and parameter blocks are written back to the orginal
;	file.
;
; PROCEDURE CALLS
;	sxopen, fdecomp, datatype(), sxgpar(), ieee_to_host, conv_vax_unix()
;
; NOTES:
;	(1)  When copying STSDAS files to VMS, be sure the .hhh file is 
;		formatted as fixed block 80 byte.
;	(2)  CONV_STSDAS has no way of knowing if a file really came from
;		a different machine architecture.    If it is applied to a file
;		that already has the correct internal format, then CONV_STSDAS
;		will "convert" this file and corrupt the internal format.
;	(3)  Note that CONV_STSDAS currently does not support conversion *from*
;		a little-endian machine (OSF, windows)		
;
; REVISION HISTORY:
;	Written   W. Landsman                     January, 1993
;	Don't require .hhh extension		April, 1993
;	Increase speed by calling SXGINFO	May, 1993
;	Converted to IDL V5.0   W. Landsman   September 1997
;-
 On_error,2

 if N_params() EQ 0 then begin
     print,'Syntax - CONV_STSDAS, sdas_name, [ /FROM_IEEE ]
     return
 endif

 common stcommn, result, filename      ;SXOPEN common block

 fdecomp,sdas_name,disk,dir,name,ext       ;Decompose filename
 sxopen, 1, name + '.' + ext, h            ;Open file and find stcommn values
 close,1 
 desc = result[*, 1]
 ndimen = desc[3]                      ;Number of dimensions of each image
 dtype  =  desc[8]                     ;Datatype of each image
 dimen = desc[10:9+ndimen]             ;Vector of image dimensions

 ext = strmid(ext,0,2) + 'd'
 openu,lun, name + '.' + ext, /BLOCK, /GET_LUN
 gcount = sxpar( h, 'GCOUNT' ) > 1     ;Number of groups
 pcount = sxpar( h, 'PCOUNT' )         ;Number of group parameters

 fromieee = (!VERSION.OS eq "vms") or keyword_set( FROM_IEEE)

 for group = 0,gcount-1 do begin       ;Loop over each group
 
 message,'Processing group '+ strtrim( group , 2), /CONT

 if ( pcount GT 0 ) then begin         ;Parameter block in file?

   parrec = assoc(lun, bytarr(desc[7]),(group+1)*desc[9]-desc[7])
   par = parrec[0]
   if group EQ 0 then sxginfo, h, par, pdtype, pdsbyte, nbyte

   for i = 0, pcount-1 do begin          ;Loop over each parameter

       parval = sxgpar(h, par,i+1, pdtype[i], pdsbyte[i], nbyte[i] )
       if fromieee then ieee_to_host, parval $
                  else parval = conv_vax_unix( parval)
       if datatype( parval ) NE 'STR' then $
          par[pdsbyte[i] ] = byte( parval, 0, nbyte[i] )
  endfor

  parrec[0] = par          ;Write back converted parameter block

 endif

  sbyte = long(group)*desc[9]
  rec  =  assoc( lun, make_array(size=[ndimen,dimen>1,dtype,0],/nozero), sbyte)
  im = rec[0]
  if fromieee then ieee_to_host, im $
             else im = conv_vax_unix( im)
  rec[0] = im
  endfor

  free_lun, lun
  return
  end