Index: trunk/Ohana/src/libfits/Makefile
===================================================================
--- trunk/Ohana/src/libfits/Makefile	(revision 37054)
+++ trunk/Ohana/src/libfits/Makefile	(revision 37807)
@@ -32,6 +32,7 @@
 $(HEAD)/F_scan.$(ARCH).o			$(HEAD)/F_print.$(ARCH).o     \
 $(HEAD)/F_copy_H.$(ARCH).o			$(HEAD)/F_delete.$(ARCH).o    \
-$(HEAD)/F_read_XH.$(ARCH).o			$(HEAD)/F_init_H.$(ARCH).o    \
-$(HEAD)/F_convert_H.$(ARCH).o                   $(HEAD)/version.$(ARCH).o
+$(HEAD)/F_find_H.$(ARCH).o			$(HEAD)/F_init_H.$(ARCH).o    \
+$(HEAD)/F_convert_H.$(ARCH).o                   $(HEAD)/F_read_XH.$(ARCH).o   \
+$(HEAD)/version.$(ARCH).o
 
 MATRIX_OBJ = \
Index: trunk/Ohana/src/libfits/header/F_find_H.c
===================================================================
--- trunk/Ohana/src/libfits/header/F_find_H.c	(revision 37807)
+++ trunk/Ohana/src/libfits/header/F_find_H.c	(revision 37807)
@@ -0,0 +1,39 @@
+# include <ohana.h>
+# include <gfitsio.h>
+
+/*********************** fits find (and read) named header, leave file pointer and end of header *******/
+int gfits_find_Xheader (FILE *f, Header *header, char *extname) {
+
+  char tname[80];
+
+  // start at the very beginning (no other info)
+  fseeko (f, 0, SEEK_SET);
+
+  // read the PHU header
+  if (!gfits_load_header (f, header)) return FALSE;
+
+  // skip to next header 
+  off_t Nbytes = gfits_data_size (header);
+  fseeko (f, Nbytes, SEEK_CUR);
+  gfits_free_header (header);
+
+  while (TRUE) {
+    // load data for this header 
+    if (!gfits_load_header (f, header)) return FALSE;
+
+    // grab the EXTNAME field
+    bzero (tname, 80);
+    if (!gfits_scan (header, "EXTNAME", "%s", 1, tname)) goto next_header;
+
+    // check if this is the correct extension or not 
+    if (strcmp (tname, extname)) goto next_header;
+    return TRUE;
+
+  next_header:
+    /* skip to next header */
+    Nbytes = gfits_data_size (header);
+    fseeko (f, Nbytes, SEEK_CUR);
+    gfits_free_header (header);
+  }
+  myAbort("impossible");
+}	
Index: trunk/Ohana/src/libfits/header/F_free_H.c
===================================================================
--- trunk/Ohana/src/libfits/header/F_free_H.c	(revision 37054)
+++ trunk/Ohana/src/libfits/header/F_free_H.c	(revision 37807)
@@ -4,4 +4,6 @@
 /*********************** fits free header ***********************************/
 void gfits_free_header (Header *header) {
+
+  // fprintf (stderr, "free data for %zx\n", (size_t) header->buffer);
 
   if (header[0].buffer == (char *) NULL) return;
Index: trunk/Ohana/src/libfits/include/gfitsio.h
===================================================================
--- trunk/Ohana/src/libfits/include/gfitsio.h	(revision 37054)
+++ trunk/Ohana/src/libfits/include/gfitsio.h	(revision 37807)
@@ -17,4 +17,7 @@
 # define NEWLINE                 10  /* UNIX RETURN character */
 # endif /* NEWLINE */
+
+/* gfits_bintable_format returns 'byte' as the type associated with one-byte logical (non-char) values */
+typedef char byte;
 
 /********** FITS Constants *********/
@@ -116,4 +119,5 @@
 int     gfits_modify_alt               PROTO((Header *header, char *field, char *mode, int N,...)); 
 int     gfits_print_alt                PROTO((Header *header, char *field, char *mode, int N,...)); 
+int     gfits_find_Xheader             PROTO((FILE *f, Header *header, char *extname));
 int     gfits_read_Xheader             PROTO((char *filename, Header *header, int N));
 int     gfits_read_header              PROTO((char *filename, Header *header));
@@ -184,5 +188,5 @@
 int   	gfits_fread_ftable             PROTO((FILE *f, FTable *ftable, char *extname)); 
 int   	gfits_fread_ftable_data        PROTO((FILE *f, FTable *ftable, int padIfShort));
-int   	gfits_fread_ftable_range       PROTO((FILE *f, FTable *ftable, off_t start, off_t Nrows));
+int   	gfits_fread_ftable_range       PROTO((FILE *f, int padIfShort, FTable *ftable, off_t start, off_t Nrows));
 int   	gfits_fread_vtable             PROTO((FILE *f, VTable *vtable, char *extname, off_t Nrow, off_t *row));
 int   	gfits_fread_vtable_range       PROTO((FILE *f, VTable *vtable, off_t start, off_t Nrows));
Index: trunk/Ohana/src/libfits/table/F_read_T.c
===================================================================
--- trunk/Ohana/src/libfits/table/F_read_T.c	(revision 37054)
+++ trunk/Ohana/src/libfits/table/F_read_T.c	(revision 37807)
@@ -19,33 +19,13 @@
 int gfits_fread_ftable (FILE *f, FTable *table, char *extname) {
 
-  int j, found;
-  off_t Nbytes;
   Header *header;
-  char tname[80];
 
   header = table[0].header;
-  fseeko (f, 0, SEEK_SET);
-
-  found = FALSE;
-  for (j = -1; !found; j++) {
-    /* load data for this header */
-    if (!gfits_load_header (f, header)) return (FALSE);
-
-    /* check if this is the correct extension or not */
-    bzero (tname, 80);
-    gfits_scan (header, "EXTNAME", "%s", 1, tname);
-    if (!strcmp (tname, extname)) {
-      if (gfits_fread_ftable_data (f, table, FALSE)) return (TRUE);
-      gfits_free_header (header);
-      return (FALSE);
-    }
-
-    /* skip to next header */
-    Nbytes = gfits_data_size (header);
-    fseeko (f, Nbytes, SEEK_CUR);
-    gfits_free_header (header);
-  }
-  return (TRUE);
-}	
+  if (!gfits_find_Xheader (f, header, extname)) return FALSE;
+
+  if (gfits_fread_ftable_data (f, table, FALSE)) return (TRUE);
+  gfits_free_header (header);
+  return (FALSE);
+}
 
 /*********************** fits read ftable data ***********************************/
@@ -84,5 +64,5 @@
 
 /*********************** fits read ftable data ***********************************/
-int gfits_fread_ftable_range (FILE *f, FTable *table, off_t start, off_t Nrows) {
+int gfits_fread_ftable_range (FILE *f, int padIfShort, FTable *table, off_t start, off_t Nrows) {
 
   off_t Nbytes, Nread, Nskip, Nx, Ny;
@@ -109,9 +89,17 @@
     if (ferror (f)) {
       perror ("fits read error");
+      free (table[0].buffer);
+      return (FALSE);
+    } 
+    fprintf (stderr, "error: fits read error in %s, read "OFF_T_FMT", need "OFF_T_FMT"\n", __func__,  Nread,  Nbytes);
+    if (padIfShort) {
+      memset (&table[0].buffer[Nread], 0, Nbytes - Nread);
+      fprintf (stderr, "warning: file missing data, padding with zeros: USE AT YOUR OWN RISK!\n");
+      table[0].validsize = Nread;
+      table[0].datasize = Nbytes;
     } else {
-      fprintf (stderr, "unexpected eof\n");
-    }      
-    free (table[0].buffer);
-    return (FALSE);
+      free (table[0].buffer);
+      return (FALSE);
+    }
   }
 
Index: trunk/Ohana/src/libfits/table/F_write_T.c
===================================================================
--- trunk/Ohana/src/libfits/table/F_write_T.c	(revision 37054)
+++ trunk/Ohana/src/libfits/table/F_write_T.c	(revision 37807)
@@ -95,5 +95,9 @@
 
   // cursor must be at start of the table (after table header)
-  fseeko (f, Nskip, SEEK_CUR);
+  if (fseeko (f, Nskip, SEEK_CUR)) {
+    fprintf (stderr, "can't seek table start\n");
+    return (FALSE);
+  }
+
   Nwrite = fwrite (ftable[0].buffer, sizeof (char), Nbytes, f);
   if (Nwrite != Nbytes) {
