summaryrefslogtreecommitdiffstats
path: root/funtools/fitsy/fitsimage.c
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/fitsy/fitsimage.c')
-rw-r--r--funtools/fitsy/fitsimage.c392
1 files changed, 392 insertions, 0 deletions
diff --git a/funtools/fitsy/fitsimage.c b/funtools/fitsy/fitsimage.c
new file mode 100644
index 0000000..516f7e1
--- /dev/null
+++ b/funtools/fitsy/fitsimage.c
@@ -0,0 +1,392 @@
+/* Fitsy FITS routines to read and write FITS images.
+ */
+
+#include <xos.h>
+#include <fcntl.h>
+#include "fitsy.h"
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_MMAN_H
+#include <sys/mman.h>
+#endif
+#include <sys/stat.h>
+
+#ifdef HAVE_SYS_IPC_H
+#include <sys/ipc.h>
+#endif
+#ifdef HAVE_SYS_SHM_H
+#include <sys/shm.h>
+#endif
+
+/* int close PROTOTYPE((int)); */
+
+int ft_indxmemdata PROTOTYPE((
+ char *data, /* Pointer to FITS */
+ int size,
+ int type, /* Type of memory */
+ char *extn,
+ int indx,
+ FITSHead *headptr, /* Returned pointer to FITS header */
+ void **dataptr, /* Returned pointer to FITS data. */
+ void ***data2dptr /* Returned edge vector to data. */));
+
+/* changed name to add _ to avoid conflict with param lib egm 4/25/00 */
+int _filesize(file)
+ int file;
+{
+ struct stat info;
+
+ if ( fstat(file, &info) < 0 ) return 0;
+ else return info.st_size;
+}
+
+#ifdef HAVE_SYS_MMAN_H
+int ft_munmap(head)
+ FITSHead head;
+{
+ return munmap((caddr_t) head->mmap_here, head->mmap_size);
+}
+#endif
+
+#ifdef HAVE_SYS_SHM_H
+int ft_shmdt(head)
+ FITSHead head;
+{
+ return shmdt((caddr_t) head->mmap_here);
+}
+#endif
+
+#ifdef HAVE_SYS_SHM_H
+/* Attach a FITS image from shared memory.
+ */
+
+int ft_simpleimageshm(filename, headptr, dataptr, data2dptr, size, flags)
+ char *filename;
+ FITSHead *headptr; /* Returned pointer to FITS header */
+ void **dataptr; /* Returned pointer to FITS data. */
+ void ***data2dptr; /* Returned edge vector to data. */
+ int size;
+ int flags;
+{
+ char name[FT_FILENAME];
+ char extn[FT_FILENAME];
+ int indx = 0;
+
+ char tail[FT_FILENAME];
+ int max = FT_FILENAME;
+
+ int shkey;
+ char *data;
+
+ char *isize;
+
+ ft_parsefilename(filename, name, extn, max, &indx, tail, max);
+
+ if ( size == 0 && (isize = strstr(tail, "size=")) ) size = atoi(isize+5);
+
+ /* Attach the memory segment
+ */
+ shkey = shmget(atoi(name), size, flags);
+ data = (void *) shmat(shkey, 0, 0);
+
+ return ft_indxmemdata(data, size, FT_SHMAT, extn, indx, headptr, dataptr, data2dptr);
+}
+#endif
+
+#ifdef HAVE_SYS_MMAN_H
+/* MMap a FITS image from the named file.
+ */
+int ft_simpleimagemmap(filename, headptr, dataptr, data2dptr, prot, share)
+ char *filename; /* FITS image file name. */
+ FITSHead *headptr; /* Returned pointer to FITS header */
+ void **dataptr; /* Returned pointer to FITS data. */
+ void ***data2dptr; /* Returned edge vector to data. */
+ int prot; /* Mapped data protections */
+ int share; /* Mapped data attributes */
+{
+ int file;
+
+ char name[FT_FILENAME];
+ char extn[FT_FILENAME];
+ int indx = 0;
+
+ char tail[FT_FILENAME];
+ int max = FT_FILENAME;
+
+ char *data;
+ int size;
+ int mode;
+
+ ft_parsefilename(filename, name, extn, max, &indx, tail, max);
+
+ if ( prot & PROT_WRITE ) {
+ mode = O_RDWR;
+ } else {
+ mode = O_RDONLY;
+ }
+
+ if ( (file = open(name, mode)) == -1) {
+ if ( headptr ) *headptr = NULL;
+ if ( data2dptr ) *data2dptr = NULL;
+
+ return 0;
+ }
+
+ /* Map the file.
+ */
+ size = _filesize(file);
+ data = (char *) mmap(NULL, size, prot, share, file, 0);
+ close(file);
+
+ if ( data == (char *)-1 ) return 0;
+
+ return ft_indxmemdata(data, size, FT_MMAP, extn, indx, headptr, dataptr, data2dptr);
+}
+#endif
+
+#if defined(HAVE_SYS_SHM_H) || defined(HAVE_SYS_MMAN_H)
+int ft_indxmemdata(data, size, type, extn, indx, headptr, dataptr, data2dptr)
+ char *data; /* Pointer to FITS */
+ int size;
+ int type; /* Type of memory */
+ char *extn;
+ int indx;
+ FITSHead *headptr; /* Returned pointer to FITS header */
+ void **dataptr; /* Returned pointer to FITS data. */
+ void ***data2dptr; /* Returned edge vector to data. */
+{
+ FITSHead head = NULL;
+
+ char *here = (char *) data;
+ void *mapdata = data;
+ int mapsize = size;
+
+ if ( *extn ) {
+ while ( (head = ft_headinit(here, size)) && size >= FT_BLOCK ) {
+ if ( !strcmp(extn, ft_name(head))
+ && (indx == -1 || indx == ft_extn(head)) ) break;
+ here += ft_data(head) + ft_databloks(head) * FT_BLOCK;
+ size -= ft_data(head) + ft_databloks(head) * FT_BLOCK;
+ ft_headfree(head, 0);
+ }
+ } else if ( indx > 0 ) {
+ int i;
+
+ for ( i = 0; i < indx && size >= FT_BLOCK; i++ ) {
+ head = ft_headinit(here, size);
+ if( !head ){
+ if ( headptr ) *headptr = NULL;
+ if ( data2dptr ) *data2dptr = NULL;
+
+ return 0;
+ }
+ here += ft_data(head) + ft_databloks(head) * FT_BLOCK;
+ size -= ft_data(head) + ft_databloks(head) * FT_BLOCK;
+ ft_headfree(head, 0);
+ }
+ head = ft_headinit(here, size);
+ data = here + ft_data(head);
+
+ } else {
+ head = ft_headinit(data, size);
+ data = here + ft_data(head);
+ }
+
+ if ( head == NULL ) {
+ switch(type){
+#ifdef HAVE_SYS_MMAN_H
+ case FT_MMAP:
+ munmap(data, mapsize);
+ break;
+#endif
+#ifdef HAVE_SYS_SHM_H
+ case FT_SHMAT:
+ shmdt(mapdata);
+ break;
+#endif
+ default:
+ break;
+ }
+ return 0;
+ }
+
+ head->mem = type;
+ head->mmap_here = mapdata;
+ head->mmap_size = mapsize;
+
+ if ( dataptr != NULL ) *dataptr = data;
+ if ( data2dptr != NULL ) {
+ *data2dptr = (void **) ft_make2d((void *) data
+ , Abs(ft_bitpix(head))/8
+ , 0, 0
+ , ft_naxis(head, 1)
+ , ft_naxis(head, 2));
+ }
+ if ( headptr != NULL ) {
+ *headptr = head;
+ } else {
+ ft_headfree(head, 0);
+ }
+
+ return 1;
+}
+#endif
+
+/* Read a FITS image from the named file.
+ */
+int ft_simpleimageread(filename, headptr, dataptr, data2dptr, pixtype)
+ char *filename; /* FITS image file name. */
+ FITSHead *headptr; /* Returned pointer to FITS header */
+ void **dataptr; /* Returned pointer to FITS data. */
+ void ***data2dptr; /* Returned edge vector to data. */
+ int pixtype; /* pixtype to convert data to. */
+{
+ FITSHead head = NULL;
+ File file;
+ int ret = 1;
+
+ char name[FT_FILENAME];
+ char extn[FT_FILENAME];
+ int indx = 0;
+
+ char tail[FT_FILENAME];
+ int max = FT_FILENAME;
+
+ ft_parsefilename(filename, name, extn, max, &indx, tail, max);
+
+ if ( (file = ftOpen(name, "r")) == NULL ) {
+ if ( headptr ) *headptr = NULL;
+ if ( data2dptr ) *data2dptr = NULL;
+
+ return 0;
+ }
+
+ if ( *extn ) {
+ while ( (head = ft_headread(file)) ) {
+ if ( !strcmp(extn, ft_name(head))
+ && (indx == -1 || indx == ft_extn(head)) ) break;
+ ft_dataskip(file, head, NULL, 0);
+ ft_headfree(head, 1);
+ }
+ } else if ( indx > 0 ) {
+ int i;
+
+ for ( i = 0; i < indx; i++ ) {
+ head = ft_headread(file);
+ if( !head ){
+ if ( headptr ) *headptr = NULL;
+ if ( data2dptr ) *data2dptr = NULL;
+
+ return 0;
+ }
+ ft_dataskip(file, head, NULL, 0);
+ ft_headfree(head, 1);
+ }
+ head = NULL;
+ }
+
+ ret = ft_imageread(file, &head, dataptr, data2dptr, pixtype);
+ if ( headptr ){
+ *headptr = head;
+ if( *name && *headptr ) (*headptr)->filename = strdup(name);
+ }
+ else{
+ ft_headfree(head, 1);
+ }
+ ftClose(file);
+
+ return ret;
+}
+
+/* Write a FITS image to a named file.
+ */
+int ft_simpleimagewrite(filename, fits, data, pixtype)
+ char *filename;
+ FITSHead fits; /* FITS header to write. */
+ void *data; /* Data to write into FITS file. */
+ int pixtype;
+{
+ File file;
+ FITSHead prim;
+
+ if ( fits == NULL ) return 0;
+
+ file = ftOpen(filename, "wb");
+
+ if (file == NULL) {
+ return 0;
+ }
+
+ prim = ft_primary(fits);
+
+ ft_imagewrite(file, prim, data, pixtype);
+ ftClose(file);
+
+ ft_headfree(prim, 1);
+ return 1;
+}
+
+/* Read a FITS image from a file pointer.
+ */
+int ft_imageread(file, headptr, dataptr, data2dptr, pixtype)
+ File file; /* File pointer to read header and data from.*/
+ FITSHead *headptr;
+ void **dataptr;
+ void ***data2dptr;
+ int pixtype;
+{
+ FITSHead fits;
+ float *data = NULL;
+
+ if ( file == NULL ) return 0;
+
+ if ( headptr == NULL || *headptr == NULL ) {
+ if ( (fits = ft_headread(file)) == NULL ) return 0;
+ } else fits = *headptr;
+
+ if ( dataptr ) data = *dataptr;
+ if ( data2dptr ) *data2dptr = NULL;
+
+
+ if ( (data = ft_dataread(file, fits, data, pixtype)) == NULL ) {
+ if ( !headptr ) ft_headfree(fits, 1);
+ return 0;
+ }
+
+ if ( headptr != NULL ) {
+ *headptr = fits;
+ }
+
+ if ( dataptr != NULL ) {
+ *dataptr = data;
+ }
+
+ if ( data2dptr != NULL ) {
+ *data2dptr = (void **) ft_make2d((void *) data
+ , Abs(pixtype)/8
+ , 0, 0
+ , ft_naxis(fits, 1)
+ , ft_naxis(fits, 2));
+ }
+
+ return 1;
+}
+
+
+/* Write a FITS image to a file.
+ */
+int ft_imagewrite(file, fits, data, pixtype)
+ File file;
+ FITSHead fits;
+ void *data;
+ int pixtype;
+{
+ if ( file == NULL ) return 0;
+
+ ft_syncdata(fits);
+ if ( ft_headwrite(file, fits) == 0 ) return 0;
+ if ( ft_datawrite(file, fits, data, pixtype) == 0 ) return 0;
+
+ return 1;
+}
+