home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / software / unix / saoimage / sao1_07.tar / readiraf.c < prev    next >
C/C++ Source or Header  |  1990-05-02  |  8KB  |  256 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    readiraf.c (Read IRAF)
  6.  * Purpose:    Read "old style" IRAF OIF (.imh) files directly
  7.  * Copyright:    1989 Smithsonian Astrophysical Observatory
  8.  *        You may do anything you like with this file except remove
  9.  *        this copyright.  The Smithsonian Astrophysical Observatory
  10.  *        makes no representations about the suitability of this
  11.  *        software for any purpose.  It is provided "as is" without
  12.  *        express or implied warranty.
  13.  * Modified:    {0} Michael VanHilst    initial version         23 January 1989
  14.  *              {1} MVH BSDonly strings.h compatability           19 Feb 1990
  15.  *        {n} <who> -- <does what> -- <when>
  16.  */
  17.  
  18. #include <stdio.h>        /* define stderr, FD, and NULL */
  19.  
  20. #ifndef VMS
  21. #ifdef SYSV
  22. #include <string.h>        /* strlen, strcat, strcpy, strrchr */
  23. #else
  24. #include <strings.h>        /* strlen, strcat, strcpy, rindex */
  25. #define strchr index
  26. #define strrchr rindex
  27. #endif
  28. #else
  29. #include <string.h>        /* strlen, strcat, strcpy, strrchr */
  30. #endif
  31.  
  32. #include <X11/Xlib.h>        /* needed for control.h */
  33. #include "hfiles/constant.h"
  34. #include "hfiles/control.h"    /* define IOP codes */
  35. #include "hfiles/image.h"
  36.  
  37. /* just read in a nice power of two enough to cover the interesting parts */
  38. /* actual size is (LEN_IMHDR + 1) * sizeof(int) */
  39. #define READHEAD 1024
  40. /* parameters from iraf/lib/imhdr.h */
  41. #define SZ_IMPIXFILE 79
  42. #define LEN_IMHDR 513
  43. /* offsets into header in sizeof(int) units for various parameters */
  44. #define    IM_PIXTYPE    4        /* datatype of the pixels */
  45. #define    IM_NDIM        5        /* number of dimensions */
  46. #define    IM_PHYSLEN    13        /* physical length (as stored) */
  47. #define    IM_PIXOFF    22        /* offset of the pixels */
  48. #define    IM_CTRAN    52        /* coordinate transformations */
  49. #define    IM_PIXFILE    103        /* name of pixel storage file */
  50.  
  51. /* The Coordinate Transformation Structure (IM_CTRAN) from iraf/lib/imhdr.h */
  52. /* None of this stuff is supported by IRAF applications, yet */
  53. #define    LEN_CTSTRUCT    50
  54. #define    CT_VALID    0        /* (y/n) is structure valid? */
  55. #define    CT_BSCALE    1        /* pixval scale factor */
  56. #define    CT_BZERO    2        /* pixval offset */
  57. #define    CT_CRVAL    3        /* value at pixel (for each dim) */
  58. #define    CT_CRPIX    10        /* index of pixel (for each dim) */
  59. #define    CT_CDELT    17        /* increment along axis for each dim */
  60. #define    CT_CROTA    24        /* rotation angle (for each dim) */
  61. #define    CT_CTYPE    36        /* coord units string */
  62.  
  63. /* codes from iraf/unix/hlib/iraf.h */
  64. #define    TY_CHAR        2
  65. #define    TY_SHORT    3
  66. #define    TY_INT        4
  67. #define    TY_LONG        5
  68. #define    TY_REAL        6
  69. #define    TY_DOUBLE    7
  70. #define    TY_COMPLEX    8
  71.  
  72. /*
  73.  * Subroutine:    init_irafimh
  74.  * Purpose:    Open and read the iraf .imh file and set up the pixfile
  75.          for reading
  76.  * Returns:    -1 if failure, else FD to image file ready for reading data
  77.  * Notes:    The imhdr format is defined in iraf/lib/imhdr.h, some of
  78.  *        which defines or mimiced, above.
  79.  */
  80. int init_irafimh ( img )
  81.      struct imageRec *img;
  82. {
  83.   int fd;
  84.   int *header;
  85.   static int check_immagic(), open_pixfile();
  86.   int open_disk(), lseek_disk(), read_disk();
  87.   char *calloc_errchk();
  88.   void close_disk();
  89.  
  90.   /* open the image header file */
  91.   if( (fd = open_disk(img->filename, IOP_Read, 0)) <= 0 )
  92.     return( -1 );
  93.   /* allocate initial sized buffer */
  94.   header = (int *)calloc_errchk(LEN_IMHDR, sizeof(int), "FITS header");
  95.   /* read in first block */
  96.   if( read_disk(fd, (char *)header, READHEAD, 1,
  97.         img->filename, "IRAF header") != READHEAD ) {
  98.     free((char *)header);
  99.     close_disk(fd, img->filename);
  100.     return( -1 );
  101.   }
  102.   close_disk (fd, img->filename);
  103.   /* check header magic word */
  104.   if( check_immagic((char *)header) ) {
  105.     free ((char *)header);
  106.     (void)fprintf(stderr, "File %s not valid SPP imhdr.\n", img->filename);
  107.     return( -1 );
  108.   }
  109.   /* check number of image dimensions */
  110.   if( header[IM_NDIM] < 2 ) {
  111.     free ((char *)header);
  112.     (void)fprintf(stderr, "File does not contain 2d image\n", img->filename);
  113.     return(-1);
  114.   }
  115.   /* get file parameters */
  116.   switch( header[IM_PIXTYPE] ) {
  117.   case TY_SHORT:
  118.     img->storage_type = ARR_I2;
  119.     img->bytepix = 2;
  120.     break;
  121.   case TY_INT:
  122.   case TY_LONG:
  123.     img->storage_type = ARR_I4;
  124.     img->bytepix = 4;
  125.     break;
  126.   case TY_REAL:
  127.     img->storage_type = ARR_R4;
  128.     img->bytepix = 4;
  129.     break;
  130.   case TY_DOUBLE:
  131.     img->storage_type = ARR_R8;
  132.     img->bytepix = 8;
  133.     break;
  134.   default:
  135.     (void)fprintf(stderr,"Unsupported data type: %d\n",header[IM_PIXTYPE]);
  136.     free((char *)header);
  137.     return( -1 );
  138.   }
  139.   img->filecols = header[IM_PHYSLEN];
  140.   img->filerows = header[IM_PHYSLEN+1];
  141.   /* check for existence and open pix file */
  142.   if( (fd = open_pixfile((char *)&header[IM_PIXFILE],img->filename)) < 0 ) {
  143.     free((char *)header);
  144.     return( -1 );
  145.   } 
  146.   if( lseek_disk(fd, (header[IM_PIXOFF]-1) * sizeof(short), img->filename)
  147.      < 0 ) {
  148.     free((char *)header);
  149.     close_disk(fd, img->filename);
  150.     return( -1 );
  151.   }
  152.   free((char *)header);
  153.   return( fd );
  154. }
  155.  
  156. /*
  157.  * Subroutine:    open_pixfile
  158.  * Purpose:    Open the pixfile
  159.  * Returns:    -1 if failure, else fd of open file
  160.  * Note:    IRAF pixfile name includes machine name in case file system
  161.  *        is specific to a machine (i.e. /tmp).  We try with machine
  162.  *        name only if it cannot be read without the machine name.
  163.  */
  164. static int open_pixfile ( pixname, hdrname )
  165.      char *pixname;
  166.      char *hdrname;
  167. {
  168.   int fd;
  169.   char *bang;
  170.   int open_disk();
  171.   static void pack_SPPstring(), same_path();
  172.  
  173.   pack_SPPstring(pixname, SZ_IMPIXFILE);
  174.   if( strncmp(pixname, "HDR$", 4) == 0 )
  175.     same_path(pixname, hdrname);
  176.   if( (bang = strchr(pixname, '!')) != NULL ) {
  177.     if( (fd = open_disk(bang + 1, IOP_Read, 0)) >= 0 )
  178.       return( fd );
  179.   }
  180.   if( (fd = open_disk(pixname, IOP_Read, 0)) >= 0 ) {
  181.     return( fd );
  182.   }
  183.   return( -1 );
  184. }
  185.     
  186. /*
  187.  * Subroutine:    check_immagic
  188.  * Purpose:    verify that file is valid IRAF imhdr by checking first 5 chars
  189.  * Returns:    0 on success, 1 on failure
  190.  */
  191. static int check_immagic ( line )
  192.      char *line;
  193. {
  194.   static void pack_SPPstring();
  195.  
  196.   pack_SPPstring (line, 5);
  197.   if( strncmp(line, "imhdr", 5) != 0 )
  198.     return(1);
  199.   else
  200.     return(0);
  201. }
  202.  
  203. /*
  204.  * Subroutine:    pack_SPPstring
  205.  * Purpose:    Convert ASCII string from SPP char per short to C char per byte
  206.  */
  207. static void pack_SPPstring ( line, len )
  208.      char *line;
  209.      int len;
  210. {
  211.   int i, j;
  212.  
  213.   /* adaptive byte selection (whichever byte order) chars alternate w/ \0 */
  214.   if( line[0] == '\0' )
  215.     j=1;
  216.   else
  217.     j=0;
  218.   for( i=0; i<len; i++, j+=2 )
  219.     line[i] = line[j];
  220.   line[i] = '\0';
  221. }
  222.  
  223. /*
  224.  * Subroutine:    same_path
  225.  * Purpose:    Put filename and header path together
  226.  */
  227. static void same_path ( pixname, hdrname )
  228.      char *pixname, *hdrname;
  229. {
  230.   int len;
  231.   char temp[SZ_IMPIXFILE];
  232.  
  233.   if( strncmp(pixname, "HDR$", 4) == 0 ) {
  234.     /* load entire header name string into name buffer */
  235.     (void)strncpy(temp, &pixname[4], SZ_IMPIXFILE);
  236.     (void)strncpy(pixname, hdrname, SZ_IMPIXFILE);
  237.     /* find the end of the pathname */
  238.     len = strlen(pixname);
  239. #ifndef VMS
  240.     while( (len > 0) && (pixname[len-1] != '/') )
  241. #else
  242.     while( (len > 0) && (pixname[len-1] != ']') && (pixname[len-1] != ':') )
  243. #endif
  244.       len--;
  245.     /* add name */
  246.     pixname[len] = '\0';
  247.     (void)strncat(pixname, temp, SZ_IMPIXFILE);
  248.   }
  249. }
  250.                                   
  251.                                                                
  252.                                                                
  253.                                                                
  254.                                                                
  255.                                                      
  256.