Index: /trunk/Ohana/src/libfits/header/F_read_XH.c
===================================================================
--- /trunk/Ohana/src/libfits/header/F_read_XH.c	(revision 13038)
+++ /trunk/Ohana/src/libfits/header/F_read_XH.c	(revision 13039)
@@ -4,16 +4,37 @@
 /*********************** fits read header ***********************************/
 int gfits_read_Xheader (char *filename, Header *header, int N) {
+
+  int status;
+  FILE *f;
+
+  f = fopen (filename, "r");
+  if (f == NULL) {
+    header[0].buffer = NULL;
+    fclose (f);
+    return (FALSE);
+  }
+
+  status = gfits_fread_Xheader (f, header, N);
+  if (!status) {
+    header[0].buffer = NULL;
+    fclose (f);
+    return (FALSE);
+  }
+
+  fclose (f);
+  return (TRUE);
+
+}
+
+/*********************** fits read header ***********************************/
+int gfits_fread_Xheader (FILE *f, Header *header, int N) {
   
   /* read header for extension number N */
 
-  FILE *f;
   int j, Nmatrix, Nskip;
   Header theader;
   
-  f = fopen (filename, "r");
-  if (f == NULL) {
-    header[0].buffer = NULL;
-    return (FALSE);
-  }
+  /* set f to beginning of file */
+  fseek (f, 0, SEEK_SET);
 
   Nskip = 0;
@@ -21,5 +42,4 @@
     /* load data for this header */
     if (!gfits_load_header (f, &theader)) {
-      fclose (f);
       return (FALSE);
     }
@@ -34,8 +54,6 @@
   
   if (!gfits_load_header (f, header)) {
-    fclose (f);
     return (FALSE);
   }
-  fclose (f);
   Nskip += header[0].size;
   return (Nskip);
Index: /trunk/Ohana/src/libfits/include/gfitsio.h
===================================================================
--- /trunk/Ohana/src/libfits/include/gfitsio.h	(revision 13038)
+++ /trunk/Ohana/src/libfits/include/gfitsio.h	(revision 13039)
@@ -96,4 +96,5 @@
 char *gfits_header_field           PROTO((Header *, char *, int)); 
 int   gfits_read_Xheader           PROTO((char *filename, Header *header, int N));
+int   gfits_fread_Xheader          PROTO((FILE *f, Header *header, int N));
 int   gfits_load_header            PROTO((FILE *f, Header *header));
 
@@ -137,5 +138,6 @@
 int   gfits_load_matrix            PROTO((FILE *f, Matrix *matrix, Header *header));
 int   gfits_fread_matrix           PROTO((FILE *f, Matrix *matrix, Header *header));
-int   gfits_read_segment           PROTO((char *filename, Matrix *matrix, char *region));
+int   gfits_read_matrix_segment    PROTO((char *filename, Matrix *matrix, char *region));
+int   gfits_fread_matrix_segment   PROTO((FILE *f, Matrix *matrix, Header *header, char *region));
 int   gfits_convert_format         PROTO((Header *header, Matrix *matrix, int outBitpix, double outScale, double outZero, int outUnsign));
 
Index: /trunk/Ohana/src/libfits/matrix/F_read_segment.c
===================================================================
--- /trunk/Ohana/src/libfits/matrix/F_read_segment.c	(revision 13038)
+++ /trunk/Ohana/src/libfits/matrix/F_read_segment.c	(revision 13039)
@@ -2,12 +2,38 @@
 # include <gfitsio.h>
 
-/** warning: this function requires 'dparse' which is included in libohana.a **/
-int dparse (double *, int, char *region);
-
 /*********************** fits read matrix ***********************************/
-int gfits_read_segment (char *filename, Matrix *matrix, char *region) {
+int gfits_read_matrix_segment (char *filename, Matrix *matrix, char *region) {
 
   FILE *f;
   Header header;
+  int status;
+
+  f = fopen (filename, "r");
+  if (f == NULL) {
+    return (FALSE);
+  }
+
+  status = gfits_fread_header (f, &header);
+  if (!status) {
+    fclose (f);
+    fprintf (stderr, "error reading header of FITS file %s\n", filename);
+    return (FALSE);
+  }
+
+  status = gfits_fread_matrix_segment (f, matrix, &header, region);
+  if (!status) {
+    fclose (f);
+    fprintf (stderr, "error reading header of FITS file %s\n", filename);
+    return (FALSE);
+  }
+
+  fclose (f);
+  return (TRUE);
+}
+
+// read header before calling this function
+// file pointer should be at start of Matrix data segment
+int gfits_fread_matrix_segment (FILE *f, Matrix *matrix, Header *header, char *region) {
+
   int status, i, nbytes, Nbytes, Nskip, NbytesData;
   int wantaxis[FT_MAX_NAXES][2];
@@ -16,39 +42,26 @@
   int perpix;
 
-  status = gfits_read_header (filename, &header);
-  if (!status) {
-    fprintf (stderr, "error reading header of FITS file %s\n", filename);
-    return (FALSE);
-  }
-
-  f = fopen (filename, "r");
-  if (f == NULL) {
-    return (FALSE);
-  }
-
   for (i = 0; i < FT_MAX_NAXES; i++) {
     wantaxis[i][0] = wantaxis[i][1] = 0;
   }
 
-  for (i = 0; i < header.Naxes; i++) {
+  for (i = 0; i < header[0].Naxes; i++) {
     status = dparse (&tmp, 2*i + 1, region);
     if (!status || (tmp < 0))
       wantaxis[i][0] = 0;
     else 
-      wantaxis[i][0] = (tmp > header.Naxis[i] - 1) ? header.Naxis[i] - 1 : tmp;
+      wantaxis[i][0] = (tmp > header[0].Naxis[i] - 1) ? header[0].Naxis[i] - 1 : tmp;
     status = dparse (&tmp, 2*i + 2, region);
     if (!status || (tmp < 0))
-      wantaxis[i][1] = header.Naxis[i];
+      wantaxis[i][1] = header[0].Naxis[i];
     else 
-      wantaxis[i][1] = (tmp > header.Naxis[i]) ? header.Naxis[i] : tmp;
+      wantaxis[i][1] = (tmp > header[0].Naxis[i]) ? header[0].Naxis[i] : tmp;
   }
 
-  fseek (f, header.size, 0);
-
-  matrix[0].bitpix = header.bitpix;
-  matrix[0].unsign = header.unsign;
-  matrix[0].bscale = header.bscale;
-  matrix[0].bzero  = header.bzero;
-  matrix[0].Naxes  = header.Naxes;
+  matrix[0].bitpix = header[0].bitpix;
+  matrix[0].unsign = header[0].unsign;
+  matrix[0].bscale = header[0].bscale;
+  matrix[0].bzero  = header[0].bzero;
+  matrix[0].Naxes  = header[0].Naxes;
   for (i = 0; i < FT_MAX_NAXES; i++)
     matrix[0].Naxis[i] = wantaxis[i][1] - wantaxis[i][0];
@@ -76,11 +89,9 @@
   /* currently only good for reading in full planes in 3-D */
   fseek (f, Nskip, SEEK_CUR);
-
   nbytes = fread (matrix[0].buffer, sizeof(char), Nbytes, f);
-  fclose (f);
   matrix[0].size = Nbytes;
 
 # ifdef BYTE_SWAP  
-  perpix = abs(header.bitpix) / 8;
+  perpix = abs(header[0].bitpix) / 8;
   if (perpix > 1) {
     byte0 = (unsigned char *) matrix[0].buffer;
@@ -128,12 +139,10 @@
 # endif
 
-  gfits_free_header (&header);
-
   if (nbytes < Nbytes - 2880) {  /* this is a bad FITS error: image is not OK */
-    fprintf (stderr, "error reading in matrix data from FITS file %s (%d < %d - 2880)\n", filename, nbytes, Nbytes);
+    fprintf (stderr, "error reading in matrix data from FITS file (%d < %d - 2880)\n", nbytes, Nbytes);
     return (FALSE);
   }
   if (nbytes != Nbytes) {  /* this is a FITS error, but often the image is OK */
-    fprintf (stderr, "incomplete block in %s: (%d, %d)\n", filename, nbytes, Nbytes);
+    fprintf (stderr, "incomplete block in FITS file: (%d, %d)\n", nbytes, Nbytes);
     return (TRUE); 
   }
@@ -142,3 +151,2 @@
 
 }
-
