Index: /branches/eam_branch_20071015/Ohana/src/addstar/src/LoadStars.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/addstar/src/LoadStars.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/addstar/src/LoadStars.c	(revision 15312)
@@ -102,5 +102,5 @@
 
     // advance to the next header
-    Nskip = gfits_matrix_size (headers[i]);
+    Nskip = gfits_data_size (headers[i]);
     fseek (f, Nskip, SEEK_CUR); 
     if (i == NHEADERS - 1) {
@@ -139,5 +139,5 @@
       extsize[0][i] = headers[i][0].size;
     } else {
-      extsize[0][i] = headers[i][0].size + gfits_matrix_size (headers[i]);
+      extsize[0][i] = headers[i][0].size + gfits_data_size (headers[i]);
     }
     gfits_scan (headers[i], "EXTTYPE", "%s", 1, exttype);
@@ -181,6 +181,6 @@
   // extension matched to the header in the PHU
   if (Nimage == 0) {
-    extsize[0][0] = headers[0][0].size + gfits_matrix_size (headers[0]);
-    extsize[0][1] = headers[1][0].size + gfits_matrix_size (headers[1]);
+    extsize[0][0] = headers[0][0].size + gfits_data_size (headers[0]);
+    extsize[0][1] = headers[1][0].size + gfits_data_size (headers[1]);
     gfits_scan (headers[1], ExtnameKeyword, "%s", 1, extname);
     if (!strcmp (extname, "SMPFILE")) {
Index: /branches/eam_branch_20071015/Ohana/src/gastro2/src/gstars2.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/gastro2/src/gstars2.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/gastro2/src/gstars2.c	(revision 15312)
@@ -128,5 +128,5 @@
   gfits_scan (&Target[0].header, "NAXIS",  "%t", 1, &naxis);
   if ((naxis == 0) && !TEXTMODE) {
-    Nskip = gfits_matrix_size (&Target[0].header);
+    Nskip = gfits_data_size (&Target[0].header);
     fseek (f, Nskip, SEEK_CUR); 
     stars = rfits (f, &Nstars);
Index: /branches/eam_branch_20071015/Ohana/src/getstar/src/ReadImageFiles.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/getstar/src/ReadImageFiles.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/getstar/src/ReadImageFiles.c	(revision 15312)
@@ -87,5 +87,5 @@
   // the first header is already loaded
   headers[0] = header;
-  Nskip = gfits_matrix_size (header);
+  Nskip = gfits_data_size (header);
   fseek (f, Nskip, SEEK_CUR); 
 
@@ -98,5 +98,5 @@
 	  done = TRUE;
       } else {
-	  Nskip = gfits_matrix_size (headers[i]);
+	  Nskip = gfits_data_size (headers[i]);
 	  fseek (f, Nskip, SEEK_CUR); 
       }
@@ -129,5 +129,5 @@
   // now examine the headers, count the table entries, find corresponding headers
   for (i = 0; i < Nheader; i++) {
-      extsize[i] = headers[i][0].size + gfits_matrix_size (headers[i]);
+      extsize[i] = headers[i][0].size + gfits_data_size (headers[i]);
       gfits_scan (headers[i], "EXTTYPE", "%s", 1, tmpword);
 
@@ -163,6 +163,6 @@
   // extension matched to the header in the PHU
   if (Nimage == 0) {
-      extsize[0] = headers[0][0].size + gfits_matrix_size (headers[0]);
-      extsize[1] = headers[1][0].size + gfits_matrix_size (headers[1]);
+      extsize[0] = headers[0][0].size + gfits_data_size (headers[0]);
+      extsize[1] = headers[1][0].size + gfits_data_size (headers[1]);
       gfits_scan (headers[1], "EXTNAME", "%s", 1, tmpword);
       if (!strcmp (tmpword, "SMPFILE")) {
Index: /branches/eam_branch_20071015/Ohana/src/imregister/imphot/rtext.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/imregister/imphot/rtext.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/imregister/imphot/rtext.c	(revision 15312)
@@ -43,5 +43,5 @@
   gfits_modify (&db[0].theader, "NAXIS2", "%d", 1, Nimage);
   db[0].theader.Naxis[1] = Nimage;
-  db[0].ftable.size = gfits_matrix_size (&db[0].theader);
+  db[0].ftable.size = gfits_data_size (&db[0].theader);
   
   return (TRUE);
Index: /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_catalog_mef.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_catalog_mef.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_catalog_mef.c	(revision 15312)
@@ -51,5 +51,5 @@
     }
   } else {
-    Nbytes = gfits_matrix_size (&header);
+    Nbytes = gfits_data_size (&header);
     fseek (f, Nbytes, SEEK_CUR);
   }
@@ -73,5 +73,5 @@
     }
   } else {
-    Nbytes = gfits_matrix_size (&header);
+    Nbytes = gfits_data_size (&header);
     fseek (f, Nbytes, SEEK_CUR);
   }
@@ -94,5 +94,5 @@
     }
   } else {
-    Nbytes = gfits_matrix_size (&header);
+    Nbytes = gfits_data_size (&header);
     fseek (f, Nbytes, SEEK_CUR);
   }
@@ -139,5 +139,5 @@
   } else {
     /* no real need to skip the data array here... */
-    Nbytes = gfits_matrix_size (&header);
+    Nbytes = gfits_data_size (&header);
     fseek (f, Nbytes, SEEK_CUR);
     if (primary != NULL) free (primary);
Index: /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_catalog_split.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_catalog_split.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_catalog_split.c	(revision 15312)
@@ -585,5 +585,5 @@
 
     /* skip past matrix (already at end of header) */
-    Nskip = gfits_matrix_size (&catalog[0].header);
+    Nskip = gfits_data_size (&catalog[0].header);
     fseek (catalog[0].f, Nskip, SEEK_CUR);
 
@@ -615,5 +615,5 @@
 
     /* skip past PHU header and matrix */
-    Nskip = catfile[0].header.size + gfits_matrix_size (&catfile[0].header);
+    Nskip = catfile[0].header.size + gfits_data_size (&catfile[0].header);
     fseek (catfile[0].f, Nskip, SEEK_SET);
 
@@ -642,5 +642,5 @@
     header.Naxis[1] = Nlines;
 
-    vtable.size = gfits_matrix_size (&header);
+    vtable.size = gfits_data_size (&header);
     vtable.Nrow = Nout;
     vtable.pad = vtable.size - Nx*Ny;
@@ -705,5 +705,5 @@
 
     /* skip past PHU header and matrix */
-    Nskip = catfile[0].header.size + gfits_matrix_size (&catfile[0].header);
+    Nskip = catfile[0].header.size + gfits_data_size (&catfile[0].header);
     fseek (catfile[0].f, Nskip, SEEK_SET);
 
Index: /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_convert.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_convert.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_convert.c	(revision 15312)
@@ -245,5 +245,5 @@
     gfits_modify (theader, "NAXIS2", "%d", 1, Nimage);
     theader[0].Naxis[1] = Nimage;
-    ftable[0].size = gfits_matrix_size (theader);
+    ftable[0].size = gfits_data_size (theader);
     return (TRUE);
   }
@@ -266,5 +266,5 @@
     gfits_modify (theader, "NAXIS2", "%d", 1, Nimage); \
     theader[0].Naxis[1] = Nimage; \
-    ftable[0].size = gfits_matrix_size (theader); \
+    ftable[0].size = gfits_data_size (theader); \
     return (TRUE); }
 
@@ -344,5 +344,5 @@
       gfits_modify (theader, "NAXIS2", "%d", 1, Nimage); \
       theader[0].Naxis[1] = Nimage; \
-      vtable[0].size = gfits_matrix_size (theader); \
+      vtable[0].size = gfits_data_size (theader); \
       return (TRUE); }
 
Index: /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_image_raw.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_image_raw.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libdvo/src/dvo_image_raw.c	(revision 15312)
@@ -88,5 +88,5 @@
   gfits_modify (&db[0].theader, "NAXIS2", "%d", 1, Nimage);
   db[0].theader.Naxis[1] = Nimage;
-  db[0].ftable.size = gfits_matrix_size (&db[0].theader);
+  db[0].ftable.size = gfits_data_size (&db[0].theader);
   db[0].swapped = FALSE;  /* table does not have internal byte-order */
   return (TRUE);
Index: /branches/eam_branch_20071015/Ohana/src/libdvo/src/fits_db.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libdvo/src/fits_db.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libdvo/src/fits_db.c	(revision 15312)
@@ -126,5 +126,5 @@
     }
   } else {
-    Nskip = gfits_matrix_size (&db[0].header);
+    Nskip = gfits_data_size (&db[0].header);
     Fseek (db[0].f, Nskip, SEEK_CUR);
   }
Index: /branches/eam_branch_20071015/Ohana/src/libfits/doc/notes-compress.txt
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/doc/notes-compress.txt	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/doc/notes-compress.txt	(revision 15312)
@@ -1,2 +1,16 @@
+
+TFORMn : rPt(e_max)
+r is 0, 1, or absent
+P is literal
+t is datatype character for binary tables
+e_max is the largest record in the column
+
+data column actually contains: 2 32bit values:
+Length + Offset
+
+THEAP : offset from start of data to start of heap
+(note that the heap starts at NAXIS1 x NAXIS2, not Nx2880 bytes). 
+
+total size of heap segment (gap + heap data) is PCOUNT
 
 I need to implement (at least) support for read of compressed images.
@@ -16,5 +30,5 @@
     level ones as needed.
 
-* possible needed APIs:
+* possible needed APIs & upgrades:
 
   - gfits_image_is_compressed (Header *header) 
@@ -30,3 +44,11 @@
     compress the given image returning the table data
 
+  o include PCOUNT in data area size (gfits_matrix_size)
 
+  o read heap when reading table (gfits_fread_table_data)
+
+  - void *gfits_varlength_column_pointer (FTable *ftable, VarLengthColumn *column, int row);
+
+  o int gfits_varlength_column_define (FTable *ftable, VarLengthColumn *def, int column);
+
+
Index: /branches/eam_branch_20071015/Ohana/src/libfits/header/F_create_H.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/header/F_create_H.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/header/F_create_H.c	(revision 15312)
@@ -22,5 +22,5 @@
 				       
   for (i = 0; i < header[0].Naxes; i++) {
-    sprintf (axis, "NAXIS%d", i + 1);
+    snprintf (axis, 10, "NAXIS%d", i + 1);
     gfits_modify (header,  axis, "%d", 1, header[0].Naxis[i]);
   }
Index: /branches/eam_branch_20071015/Ohana/src/libfits/header/F_read_H.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/header/F_read_H.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/header/F_read_H.c	(revision 15312)
@@ -76,4 +76,9 @@
   gfits_scan (header, "NAXIS10", "%d", 1, &header[0].Naxis[9]);
 
+  // XXX what about GCOUNT???
+  if (!gfits_scan (header, "PCOUNT",  "%d", 1, &header[0].pcount)) {
+    header[0].pcount = 0;
+  }
+
   return (TRUE);
 
Index: /branches/eam_branch_20071015/Ohana/src/libfits/header/F_read_XH.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/header/F_read_XH.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/header/F_read_XH.c	(revision 15312)
@@ -45,5 +45,5 @@
     }
 
-    Nmatrix = gfits_matrix_size (&theader);
+    Nmatrix = gfits_data_size (&theader);
 
     /* skip to next header */
Index: /branches/eam_branch_20071015/Ohana/src/libfits/include/gfitsio.h
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/include/gfitsio.h	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/include/gfitsio.h	(revision 15312)
@@ -48,4 +48,6 @@
   int                     Naxis[FT_MAX_NAXES];
   int                     size;
+  int                     pcount;
+  int                     gcount;
   double                  bzero;
   double                  bscale;
@@ -84,108 +86,105 @@
 } VTable;
 
+typedef struct {
+  int  length;
+  int  offset;
+  int  maxlen;
+  int  nbytes;
+  char format;
+} VarLengthColumn;
+
 # ifndef PROTO
 # define PROTO(A) A
 # endif
 
-char *gfits_version                PROTO(());
+char   *gfits_version                  PROTO((void));
 
 /******************************* Header functions *************/
-int   gfits_read_header            PROTO((char *, Header *));
-// int   fits_copy_header            PROTO((Header *, Header *)); 
-int   gfits_copy_header           PROTO((Header *, Header *)); 
-void  gfits_free_header            PROTO((Header *)); 
-int   gfits_write_header           PROTO((char *, Header *)); 
-int   gfits_create_header          PROTO((Header *)); 
-int   gfits_delete                 PROTO((Header *, char *, int)); 
-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));
 
-int   gfits_fread_header           PROTO((FILE *, Header *));
-int   gfits_fread_Theader          PROTO((FILE *, Header *));
-int   gfits_fread_ftable           PROTO((FILE *, FTable *, char *)); 
-int   gfits_fread_vtable_range     PROTO((FILE *f, VTable *table, int start, int Nrows));
-int   gfits_fread_vtable           PROTO((FILE *f, VTable *table, char *extname, int Nrow, int *row));
-int   gfits_fread_ftable_data      PROTO((FILE *f, FTable *table));
-int   gfits_fwrite_header          PROTO((FILE *, Header *)); 
-int   gfits_fwrite_Theader         PROTO((FILE *, Header *));
-int   gfits_fwrite_matrix          PROTO((FILE *, Matrix *));      
-int   gfits_fwrite_table           PROTO((FILE *, FTable *)); 
-int   gfits_fwrite_vtable          PROTO((FILE *, VTable *)); 
-
-int   gfits_matrix_size            PROTO ((Header *));
-int   gfits_init_header            PROTO ((Header *));
-int   gfits_get_unsign_mode        PROTO (());
-int   gfits_set_unsign_mode        PROTO ((int mode));
-int   gfits_create_table_header    PROTO ((Header *, char *, char *));
-int   gfits_vtable_from_ftable     PROTO ((FTable *ftable, VTable *vtable, int *row, int Nrow));
-int   gfits_table_to_vtable        PROTO ((FTable *ftable, VTable *vtable, int start, int Nkeep));
-int   gfits_create_table           PROTO ((Header *, FTable *));
-int   gfits_vadd_rows              PROTO ((VTable *, char *, int, int));
-int   gfits_add_rows               PROTO ((FTable *, char *, int, int));
-char *gfits_table_print            PROTO ((FTable *,...));
-int   gfits_table_scale_data       PROTO ((FTable *ftable));
-int   gfits_table_scale_storage    PROTO ((FTable *ftable));
+char   *gfits_header_field             PROTO((Header *header, char *field, int N)); 
+char   *gfits_keyword_end              PROTO((char *line));
+int     gfits_copy_header              PROTO((Header *in, Header *out)); 
+int     gfits_create_header            PROTO((Header *header)); 
+int     gfits_delete_field             PROTO((Header *header, char *field, int N)); 
+int     gfits_fread_Xheader            PROTO((FILE *f, Header *header, int N));
+int     gfits_fread_header             PROTO((FILE *f, Header *header));
+void    gfits_free_header              PROTO((Header *header)); 
+int     gfits_fwrite_header            PROTO((FILE *f, Header *header)); 
+int     gfits_get_unsign_mode          PROTO((void));
+int     gfits_init_header              PROTO((Header *header));
+int     gfits_load_header              PROTO((FILE *f, Header *header));
+int     gfits_modify                   PROTO((Header *header, char *field, char *mode, int N,...)); 
+int     gfits_print                    PROTO((Header *header, char *field, char *mode, int N,...)); 
+int     gfits_read_Xheader             PROTO((char *filename, Header *header, int N));
+int     gfits_read_header              PROTO((char *filename, Header *header));
+int     gfits_save_header              PROTO((FILE *f, Header *header));
+int     gfits_scan                     PROTO((Header *header, char *field, char *mode, int N,...));
+int     gfits_set_unsign_mode          PROTO((int mode));
+int     gfits_stripwhite               PROTO((char *string));
+int     gfits_vscan                    PROTO((Header *header, char *field, char *mode, int N, va_list argp));
+int     gfits_write_header             PROTO((char *filename, Header *header)); 
+int     gfits_matrix_size              PROTO((Header *header));
 
 /******************************* Matrix functions *************/
-int   gfits_read_matrix            PROTO((char *, Matrix *));      
-int   gfits_read_portion           PROTO((char *filename, Matrix *matrix, int Nskip, int Npix));
-void  gfits_free_matrix            PROTO((Matrix *)); 
-int   gfits_copy_matrix            PROTO((Matrix *, Matrix *)); 
-int   gfits_write_matrix           PROTO((char *,Matrix *)); 
-int   gfits_create_matrix          PROTO((Header *, Matrix *)); 
-double  gfits_get_matrix_value     PROTO((Matrix *, int, int)); 
-void  gfits_set_matrix_value       PROTO((Matrix *, int, int, double)); 
-void  gfits_add_matrix_value       PROTO((Matrix *, int, int, double)); 
-int   gfits_multiply_matrix        PROTO((Matrix *, Matrix *, Matrix *)); 
-int   gfits_divide_matrix          PROTO((Matrix *, Matrix *, Matrix *)); 
-void  gfits_insert_array           PROTO((Matrix *, Matrix *, int, int)); 
-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_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));
+
+void   	gfits_add_matrix_value         PROTO((Matrix *matrix, int x, int y, double value)); 
+int    	gfits_convert_format           PROTO((Header *header, Matrix *matrix, int outBitpix, double outScale, double outZero, int outUnsign));
+int     gfits_copy_matrix              PROTO((Matrix *in, Matrix *out)); 
+int     gfits_create_matrix            PROTO((Header *header, Matrix *matrix)); 
+int    	gfits_divide_matrix            PROTO((Matrix *M1, Matrix *M2, Matrix *M3)); 
+int    	gfits_fread_matrix             PROTO((FILE *f, Matrix *matrix, Header *header));
+int    	gfits_fread_matrix_segment     PROTO((FILE *f, Matrix *matrix, Header *header, char *region));
+void    gfits_free_matrix              PROTO((Matrix *matrix)); 
+int     gfits_fwrite_matrix            PROTO((FILE *f, Matrix *matrix));      
+double  gfits_get_matrix_value         PROTO((Matrix *matrix, int x, int y)); 
+void   	gfits_insert_array             PROTO((Matrix *matrix, Matrix *array, int x, int y)); 
+int    	gfits_load_matrix              PROTO((FILE *f, Matrix *matrix, Header *header));
+int    	gfits_multiply_matrix          PROTO((Matrix *M1, Matrix *M2, Matrix *M3)); 
+int     gfits_read_matrix              PROTO((char *filename, Matrix *matrix));      
+int    	gfits_read_matrix_segment      PROTO((char *filename, Matrix *matrix, char *region));
+int     gfits_read_portion             PROTO((char *filename, Matrix *matrix, int Nskip, int Npix));
+void   	gfits_set_matrix_value         PROTO((Matrix *matrix, int x, int y, double value)); 
+int     gfits_write_matrix             PROTO((char *filename, Matrix *matrix)); 
 
 /******************************* Table functions *************/
-int   gfits_load_Theader           PROTO((FILE *f, Header *Theader));
-int   gfits_read_Theader           PROTO((char *, Header *));     
-int   gfits_read_table             PROTO((char *, FTable *)); 
-int   gfits_read_table             PROTO((char *, FTable *)); 
-int   gfits_write_Theader          PROTO((char *, Header *header));
-int   gfits_write_table            PROTO((char *, FTable *)); 
-int   gfits_fwrite_table           PROTO((FILE *f, FTable *table));
-int   gfits_fwrite_vtable          PROTO((FILE *f, VTable *table));
 
-int   gfits_bintable_format        PROTO((char *, char *, int *, int *));
-int   gfits_table_format           PROTO((char *, char *, int *, int *));
-int   gfits_save_header            PROTO((FILE *, Header *header));
-int   gfits_set_bintable_column    PROTO((Header *header, FTable *table, char *, void *, int));
-int   gfits_set_table_column       PROTO((Header *header, FTable *table, char *, void *, int));
-int   gfits_define_bintable_column PROTO((Header *header, char *, char *, char *, char *, double, double));
-int   gfits_define_table_column    PROTO((Header *header, char *, char *, char *, char *));
-int   gfits_read_ftable            PROTO((char *filename, FTable *table, char *extname));
+char   *gfits_table_print              PROTO((FTable *ftable,...));
+int     gfits_add_rows                 PROTO((FTable *ftable, char *data, int Nrow, int Nbytes));
+int     gfits_bintable_format          PROTO((char *format, char *type, int *Nval, int *Nbytes));
+int     gfits_create_table             PROTO((Header *header, FTable *ftable));
+int     gfits_create_table_header      PROTO((Header *header, char *type, char *extname));
+int     gfits_define_bintable_column   PROTO((Header *header, char *format, char *label, char *comment, char *unit, double bscale, double bzero));
+int     gfits_define_table_column      PROTO((Header *header, char *format, char *label, char *comment, char *unit));
+int   	gfits_fread_ftable             PROTO((FILE *f, FTable *ftable, char *extname)); 
+int   	gfits_fread_ftable_data        PROTO((FILE *f, FTable *ftable));
+int   	gfits_fread_vtable             PROTO((FILE *f, VTable *vtable, char *extname, int Nrow, int *row));
+int   	gfits_fread_vtable_range       PROTO((FILE *f, VTable *vtable, int start, int Nrows));
+int     gfits_free_table               PROTO((FTable *ftable));
+int     gfits_free_vtable              PROTO((VTable *vtable));
+int     gfits_fwrite_table             PROTO((FILE *f, FTable *table));
+int     gfits_fwrite_vtable            PROTO((FILE *f, VTable *table));
+int     gfits_get_bintable_column      PROTO((Header *header, FTable *table, char *label, void **data));
+int     gfits_get_bintable_column_type PROTO((Header *header, char *label, char *type, int *Nval));
+int     gfits_get_table_column         PROTO((Header *header, FTable *table, char *label, void **data));
+int     gfits_get_table_column_type    PROTO((Header *header, char *label, char *type));
+int     gfits_read_ftable              PROTO((char *filename, FTable *table, char *extname));
+int     gfits_read_table               PROTO((char *filename, FTable *ftable)); 
+int     gfits_set_bintable_column      PROTO((Header *header, FTable *table, char *label, void *data, int Nrow));
+int     gfits_set_table_column         PROTO((Header *header, FTable *table, char *label, void *data, int Nrow));
+int     gfits_table_column             PROTO((FTable *ftable, char *field, char *mode,...));
+int     gfits_table_format             PROTO((char *format, char *type, int *Nval, int *Nbytes));
+int     gfits_table_scale_data         PROTO((FTable *ftable));
+int     gfits_table_scale_storage      PROTO((FTable *ftable));
+int     gfits_table_to_vtable          PROTO((FTable *ftable, VTable *vtable, int start, int Nkeep));
+int     gfits_vadd_rows                PROTO((VTable *vtable, char *data, int Nrow, int Nbytes));
+int     gfits_vtable_from_ftable       PROTO((FTable *ftable, VTable *vtable, int *row, int Nrow));
+int     gfits_write_table              PROTO((char *filename, FTable *ftable)); 
 
-int   gfits_free_table             PROTO((FTable *table));
-int   gfits_free_vtable            PROTO((VTable *table));
-int   gfits_create_Theader         PROTO((Header *header, char *type));
-
-/* prototyping demanded for these four -- could be a problem on non-ANSI comp comp */
-int   gfits_scan                   PROTO((Header *, char *, char *, int,...)); 
-int   gfits_print                  PROTO((Header *, char *, char *, int,...)); 
-int   gfits_modify                 PROTO((Header *, char *, char *, int,...)); 
-int   gfits_table_column           PROTO((FTable *, char *, char *,...)); 
-int   gfits_table_column           PROTO((FTable *table, char *, char *,...));
-
-char *gfits_keyword_end            PROTO((char *line));
-int   gfits_vscan                  PROTO((Header *header, char *field, char *mode, int N, va_list argp));
-int   gfits_scan                   PROTO((Header *header, char *field, char *mode, int N,...));
-int   gfits_stripwhite             PROTO((char *string));
-int   gfits_matrix_size            PROTO((Header *header));
-
-int   gfits_get_bintable_column_type PROTO((Header *header, char *label, char *type, int *Nval));
-int   gfits_get_bintable_column    PROTO((Header *header, FTable *table, char *label, void **data));
-int   gfits_get_table_column_type  PROTO((Header *header, char *label, char *type));
-int   gfits_get_table_column       PROTO((Header *header, FTable *table, char *label, void **data));
+int     gfits_create_Theader           PROTO((Header *header, char *type));
+int     gfits_fread_Theader            PROTO((FILE *f, Header *header));
+int     gfits_fwrite_Theader           PROTO((FILE *f, Header *header));
+int     gfits_load_Theader             PROTO((FILE *f, Header *header));
+int     gfits_read_Theader             PROTO((char *filename, Header *header));     
+int     gfits_write_Theader            PROTO((char *filename, Header *header));
 
 #endif /* FITSIO */
Index: /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_compress_M.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_compress_M.c	(revision 15312)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_compress_M.c	(revision 15312)
@@ -0,0 +1,120 @@
+# include <ohana.h>
+# include <gfitsio.h>
+
+# define MOD_KEYWORD(NAME,ZNAME,TYPE,IN,OUT) { \
+  gfits_scan (header, ZNAME, TYPE, 1, IN); \
+  gfits_delete_field (header, ZNAME, 1); \
+  gfits_print (header, NAME, TYPE, 1, OUT);
+
+# define MOD_KEYWORD_REQUIRED(NAME,ZNAME,TYPE,IN,OUT) { \
+  if (!gfits_scan (header, ZNAME, TYPE, 1, IN)) return (NULL); \
+  gfits_delete_field (header, ZNAME, 1); \
+  gfits_print (header, NAME, TYPE, 1, OUT);
+
+Matrix *gfits_uncompress_image (Header *header, FTable *ftable) {
+
+  int status;
+  int zimage;
+  char cmptype[80];
+  char azis[10];
+
+  // is ZIMAGE present?
+  status = gfits_scan (ftable->header, "ZIMAGE", "%t", 1, &zimage);
+  if (!status || !zimage) return NULL;
+
+  // copy original header to output header
+  gfits_copy_header (&ftable->header, header);
+
+  // extract compression-specific keywords, update header as needed.
+  if (!gfits_scan (header, "ZCMPTYPE", "%s", 1, cmptype)) return NULL;
+  gfits_delete_field (header, "ZCMPTYPE", 1);
+
+  MOD_KEYWORD_REQUIRED ("ZBITPIX", "BITPIX", "%d", &header->bitpix, header->bitpix);
+  MOD_KEYWORD_REQUIRED ("ZNAXIS",  "NAXIS",  "%d", &header->Naxes,  header->Naxes);
+
+  for (i = 0; i < header->Naxes; i++) {
+    snprintf (zaxis, 10, "ZNAXIS%d", i + 1);
+    snprintf (axis, 10, "NAXIS%d", i + 1);
+    MOD_KEYWORD_REQUIRED (zaxis,  axis,  "%d", &header->Naxis[i],  header->Naxis[i]);
+  }    
+
+  // set up the tile sizes
+  ALLOCATE (ztile, int, header->Naxes);
+  if (!gfits_scan (header, "ZTILE1", "%d", 1, &ztile[0])) {
+    ztile[0] = header->Naxis[0];
+    for (i = 1; i < header->Naxes; i++) {
+      ztile[i] = 1;
+    }
+  } else {
+    for (i = 1; i < header->Naxes; i++) {
+      snprintf (axis, 10, "ZTILE%d", i + 1);
+      if (!gfits_scan (header, axis, "%d", 1, &ztile[i])) return NULL;
+      gfits_delete_field (header, axis, 1);
+    }
+  }
+
+  // search for algorithm-specific keywords
+  NOPTIONS = 10;
+  ALLOCATE (optname, char *, NOPTIONS);
+  ALLOCATE (optvalue, char *, NOPTIONS);
+  for (Noptions = 0; TRUE; Noptions++) {
+    snprintf (axis, 10, "ZNAME%d", Noptions + 1);
+    if (!gfits_scan (header, axis, "%s", 1, word)) break;
+    gfits_delete_field (header, axis, 1);
+    optname[Noptions] = strcreate (word);
+
+    snprintf (axis, 10, "ZVAL%d", Noptions + 1);
+    if (!gfits_scan (header, axis, "%s", 1, word)) ESCAPE;
+    gfits_delete_field (header, axis, 1);
+    optvalue[Noptions] = strcreate (word);
+
+    if (Noptions == NOPTIONS - 1) {
+      NOPTIONS += 10;
+      REALLOCATE (optname, char *, NOPTIONS);
+      REALLOCATE (optvalue, char *, NOPTIONS);
+    }
+  }
+  // XXX is Noptions set to the correct value?
+
+  // XXX get ZMASKCMP 
+
+  if (primary) {
+    // XXX SIMPLE & XTENSION need to be set on the first line
+    gfits_scan (header, "ZSIMPLE", "%t", 1, &header->simple) return NULL;
+    gfits_delete_field (header, "ZSIMPLE", 1);
+    gfits_print (header, "SIMPLE", "%d", 1, header->simple);
+
+    MOD_KEYWORD ("ZEXTEND",  "EXTEND",   "%t", &header->extend, header->extend);
+    MOD_KEYWORD ("ZBLOCKED", "BLOCKED",  "%t", &header->extend, header->extend);
+  } else {
+    // XXX XTENSION needs to be set on the first line
+    gfits_scan (header, "ZTENSION", "%s", 1, exttype) return NULL;
+    gfits_delete_field (header, "ZTENSION", 1);
+    gfits_print (header, "SIMPLE", "%d", 1, header->simple);
+
+    MOD_KEYWORD ("ZPCOUNT",  "PCOUNT",   "%d", &header->pcount, header->pcount);
+    MOD_KEYWORD ("ZGCOUNT",  "GCOUNT",   "%d", &header->gcount, header->gcount);
+  }
+
+  MOD_KEYWORD ("ZHECKSUM", "ZHECKSUM", "%s", checksum,        checksum);
+  MOD_KEYWORD ("ZDATASUM", "DATASUM",  "%s", datasum,         datasum);
+
+  // find the COMPRESSED_DATA column (format should be 1PB, 1PI, 1PJ)
+  for (i = 1; TRUE; i++) {
+    snprintf (key, 10, "TTYPE%d", i);
+    if (!gfits_scan (&ftable->header, key, "%s", 1, ttype)) return NULL;
+    if (!strcmp (ttype, "COMPRESSED_DATA")) break;
+  }
+  compcol = i;
+
+  if (!gfits_varlength_column_define (ftable, compdef, compcol)) return NULL;
+
+  // create the output image
+  gfits_create_matrix (matrix, header);
+
+  // uncompress the data
+
+  // ZSCALE & ZZERO convert uncompressed values to output values
+  // data = (uncompressed * ZSCALE) + ZZERO
+
+  
Index: /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_convert_format.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_convert_format.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_convert_format.c	(revision 15312)
@@ -49,5 +49,5 @@
   matrix[0].bzero  = header[0].bzero  = outZero;
   matrix[0].unsign = header[0].unsign = outUnsign;
-  matrix[0].size   = gfits_matrix_size (header);
+  matrix[0].size   = gfits_data_size (header);
   gfits_modify (header, "BITPIX", "%d", 1, outBitpix);
   gfits_modify (header, "BSCALE", "%lf", 1, outScale);
Index: /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_create_M.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_create_M.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_create_M.c	(revision 15312)
@@ -18,5 +18,5 @@
     matrix[0].Naxis[i] = header[0].Naxis[i];
 
-  Nbytes = gfits_matrix_size (header);
+  Nbytes = gfits_data_size (header);
   ALLOCATE (matrix[0].buffer, char, MAX (Nbytes, 1));
   bzero (matrix[0].buffer, Nbytes);
Index: /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_get_M_value.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_get_M_value.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_get_M_value.c	(revision 15312)
@@ -3,8 +3,5 @@
 
 /***************** fits get matrix value ***********************************/
-double gfits_get_matrix_value (matrix, x, y) 
-Matrix *matrix; 
-int x, y;
-{
+double gfits_get_matrix_value (Matrix *matrix, int x, int y) {
 
   double value;
Index: /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_insert_M.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_insert_M.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_insert_M.c	(revision 15312)
@@ -3,5 +3,5 @@
 
 /*********************** fits insert array ***********************************/
-void gfits_insert_matrix (Matrix  *matrix, Matrix *array, int x, int y) {
+void gfits_insert_matrix (Matrix *matrix, Matrix *array, int x, int y) {
 
   /* there is no check here to match BITPIX, BZERO, or BSCALE */
Index: /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_load_M.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_load_M.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_load_M.c	(revision 15312)
@@ -25,5 +25,5 @@
     matrix[0].Naxis[i] = header[0].Naxis[i];
 
-  Nbytes = gfits_matrix_size (header);
+  Nbytes = gfits_data_size (header);
   ALLOCATE (matrix[0].buffer, char, Nbytes);
   matrix[0].size = Nbytes;
Index: /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_matrix.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_matrix.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_matrix.c	(revision 15312)
@@ -2,5 +2,5 @@
 # include <gfitsio.h>
 
-int gfits_matrix_size (Header *header) {
+int gfits_data_size (Header *header) {
   
   int i, Nrec, size;
@@ -13,4 +13,7 @@
     size *= header[0].Naxis[i];
 
+  // XXX do I multiply this times gcount?
+  size += header[0].pcount;
+
   /* round up to next complete block */
   if (size % FT_RECORD_SIZE) {
Index: /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_set_M_value.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_set_M_value.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_set_M_value.c	(revision 15312)
@@ -3,9 +3,5 @@
 
 /****************** fits set matrix value ***********************************/
-void gfits_set_matrix_value (matrix, x, y, Value) 
-Matrix *matrix; 
-int x, y; 
-double Value;
-{
+void gfits_set_matrix_value (Matrix *matrix, int x, int y, double Value) {
 
   int pixel;
Index: /branches/eam_branch_20071015/Ohana/src/libfits/table/F_create_T.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/table/F_create_T.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/table/F_create_T.c	(revision 15312)
@@ -12,5 +12,5 @@
   table[0].header = header;
   
-  Nbytes = gfits_matrix_size (header);
+  Nbytes = gfits_data_size (header);
   ALLOCATE (table[0].buffer, char, MAX (Nbytes, 1));
   if (!strcmp (type, "TABLE")) {
@@ -37,5 +37,5 @@
   Nx = table[0].header[0].Naxis[0];
   Ny = table[0].header[0].Naxis[0];
-  table[0].size = gfits_matrix_size (header);
+  table[0].size = gfits_data_size (header);
   table[0].pad = table[0].size - Nx*Ny;
  
Index: /branches/eam_branch_20071015/Ohana/src/libfits/table/F_read_T.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/table/F_read_T.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/table/F_read_T.c	(revision 15312)
@@ -41,5 +41,5 @@
 
     /* skip to next header */
-    Nbytes = gfits_matrix_size (header);
+    Nbytes = gfits_data_size (header);
     fseek (f, Nbytes, SEEK_CUR);
     gfits_free_header (header);
@@ -54,5 +54,5 @@
 
   /* find buffer size */
-  Nbytes = gfits_matrix_size (table[0].header);
+  Nbytes = gfits_data_size (table[0].header);
   ALLOCATE (table[0].buffer, char, Nbytes);
 
@@ -75,5 +75,5 @@
   Nx = table[0].header[0].Naxis[0];
   Ny = table[0].header[0].Naxis[1];
-  table[0].size = gfits_matrix_size (table[0].header);
+  table[0].size = gfits_data_size (table[0].header);
   table[0].pad = table[0].size - Nx*Ny;
 
@@ -120,5 +120,5 @@
 
     /* find buffer size */
-    Nbytes = gfits_matrix_size (header);
+    Nbytes = gfits_data_size (header);
 
     /* check if this is the correct extension or not */
@@ -152,64 +152,9 @@
     ALLOCATE (table[0].row, int, MAX (1, Nrow));    
     for (i = 0; i < Nrow; i++) table[0].row[i] = row[i];
-    table[0].size   = gfits_matrix_size (table[0].header);
+    table[0].size   = gfits_data_size (table[0].header);
     table[0].pad    = table[0].size - Nx*Ny;
     return (TRUE);
   }
 }	
-
-# if (0)
-/*********************** fits read table ***********************************/
-/* a poor function: read only the first table, regardless of name */
-/* keep until we are sure ohana code does not use it  */
-int gfits_read_table (char *filename, FTable *table) {
-
-  FILE *f;
-  Header header;
-  int status, i, nbytes, Nbytes, matrix_size;
-
-  if (!gfits_read_header (filename, &header)) {
-    fprintf (stderr, "error reading header of FITS file %s\n", filename);
-    return (FALSE);
-  }
-
-  if (!gfits_read_Theader (filename, &table[0].header)) {
-    fprintf (stderr, "error reading Theader of FITS file %s\n", filename);
-    return (FALSE);
-  }
-
-  if ((f = fopen (filename, "r")) == NULL) {
-    gfits_free_header (&header);
-    gfits_free_header (&table[0].header);
-    return (FALSE);
-  }
-
-  matrix_size = gfits_matrix_size (&header);
-
-  Nbytes = header.size + matrix_size + table[0].header.size;
-  fseek (f, Nbytes, 0);
-  gfits_free_header (&header);
- 
-  gfits_scan (&table[0].header, "TFIELDS", "%d", 1, &table[0].Nfields);
-
-  /* place the field sizes in the structure? */
-  table[0].bitpix = table[0].header.bitpix;
-  table[0].Naxes  = table[0].header.Naxes;
-  for (i = 0; i < FT_MAX_NAXES; i++)
-    table[0].Naxis[i] = table[0].header.Naxis[i];
-
-  Nbytes = gfits_matrix_size (&table[0].header);
-  ALLOCATE (table[0].buffer, char, Nbytes);
-  nbytes = fread (table[0].buffer, sizeof(char), Nbytes, f);
-  if (nbytes != Nbytes) {
-    fprintf (stderr, "error reading in table data from FITS file %s\n", filename);
-    fclose (f);
-    return (FALSE);
-  }
-  table[0].size = Nbytes;
-  fclose (f);
-  return (TRUE);
-}
-# endif
-
 
 int gfits_fread_header_extname (FILE *f, Header *header, char *extname) {
@@ -223,5 +168,5 @@
   if (!strcasecmp (extname, "PHU")) return (TRUE);
 
-  Nbytes = gfits_matrix_size (header);
+  Nbytes = gfits_data_size (header);
   fseek (f, Nbytes, SEEK_CUR);
 
@@ -229,5 +174,5 @@
     gfits_scan (header, "EXTNAME", "%s", 1, current);
     if (!strcmp (current, extname)) return (TRUE);
-    Nbytes = gfits_matrix_size (header);
+    Nbytes = gfits_data_size (header);
     fseek (f, Nbytes, SEEK_CUR);
   }
Index: /branches/eam_branch_20071015/Ohana/src/libfits/table/F_read_TH.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/table/F_read_TH.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/table/F_read_TH.c	(revision 15312)
@@ -22,5 +22,5 @@
   }
 
-  Nbytes = gfits_matrix_size (&header);
+  Nbytes = gfits_data_size (&header);
   fseek (f, Nbytes, SEEK_SET);
   gfits_free_header (&header);
Index: /branches/eam_branch_20071015/Ohana/src/libfits/table/F_set_column.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/table/F_set_column.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/table/F_set_column.c	(revision 15312)
@@ -52,5 +52,5 @@
     gfits_modify (header, "NAXIS2",  "%d", 1, Ny);
 
-    nbytes = gfits_matrix_size (header);
+    nbytes = gfits_data_size (header);
     REALLOCATE (table[0].buffer, char, MAX (nbytes, 1));
     bzero (table[0].buffer, nbytes);
@@ -187,5 +187,5 @@
     gfits_modify (header, "NAXIS2",  "%d", 1, Ny);
 
-    nbytes = gfits_matrix_size (header);
+    nbytes = gfits_data_size (header);
     REALLOCATE (table[0].buffer, char, MAX (nbytes, 1));
     bzero (table[0].buffer, nbytes);
Index: /branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_format.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_format.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_format.c	(revision 15312)
@@ -25,5 +25,5 @@
   if (*Fchar == 'E') { *Nbytes = 4;  strcpy (type, "float");  *Nval = Nv;               }
   if (*Fchar == 'D') { *Nbytes = 8;  strcpy (type, "double"); *Nval = Nv;               }
-  if (*Fchar == 'P') { *Nbytes = 8;  strcpy (type, "float");  *Nval = 2*Nv;             }
+  if (*Fchar == 'P') { *Nbytes = 8;  strcpy (type, "var");    *Nval = 2*Nv;             }
   if (*Fchar == 'C') { *Nbytes = 8;  strcpy (type, "float");  *Nval = 2*Nv;             }
   if (*Fchar == 'M') { *Nbytes = 16; strcpy (type, "double"); *Nval = 2*Nv;             }
Index: /branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_row.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_row.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_row.c	(revision 15312)
@@ -25,5 +25,5 @@
   gfits_modify (header, "NAXIS2",  "%d", 1, Ny);
 
-  nbytes = gfits_matrix_size (header);
+  nbytes = gfits_data_size (header);
   REALLOCATE (table[0].buffer, char, MAX (nbytes, 1));
   table[0].size = nbytes;
@@ -66,5 +66,5 @@
   gfits_modify (header, "NAXIS2",  "%d", 1, Ny);
 
-  table[0].size   = gfits_matrix_size (table[0].header);
+  table[0].size   = gfits_data_size (table[0].header);
   table[0].pad    = table[0].size - Nx*Ny;
 
@@ -99,5 +99,5 @@
   gfits_modify (header, "NAXIS2",  "%d", 1, Ny);
 
-  nbytes = gfits_matrix_size (header);
+  nbytes = gfits_data_size (header);
   REALLOCATE (table[0].buffer, char, MAX (nbytes, 1));
   table[0].size = nbytes;
Index: /branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_varlength.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_varlength.c	(revision 15312)
+++ /branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_varlength.c	(revision 15312)
@@ -0,0 +1,61 @@
+# include <ohana.h>
+# include <gfitsio.h>
+
+int gfits_varlength_column_define (FTable *ftable, VarLengthColumn *def, int column) {
+
+  char field[80];
+  char format[80];
+
+  // grab the value of TFORMn for this column
+  snprintf (field, 80, "TFORM%d", column);
+  if (!gfits_scan (&ftable[0].header, field, "%s", 1, format)) return (FALSE);
+
+  // find and remove the max field length element
+  p1 = strchr (format, '(');
+  p2 = strchr (format, ')');
+
+  if (!p1 || !p2) return (FALSE); // not a valid varlength column -- missing (e_max)
+  if (p2 - p1 < 2) return (FALSE); // not a valid varlength column -- contains ()
+
+  def->maxlen = strtol (p1 + 1, &p3, 10);
+
+  if (p3 != p2) return (FALSE); // not a valid varlength column -- (e_max) contains extra chars
+  *p1 = 0; // make the format string end here for the rest of the function
+
+  // first char may optionally be 0, 1
+  p1 = format;
+  if ((*p1 == '0') || (*p1 == '1')) p1 ++;
+
+  // now p1 must be 'P';
+  if (*p1 == 0) return (FALSE);
+  if (*p1 != 'P') return (FALSE);
+
+  // next value is the actual varlength column format
+  p1 ++;
+  if (*p1 == 0) return (FALSE);
+  if (*p1 == 'P') { return (FALSE); }
+
+  def[0].nbytes = 0;
+  if (*p1 == 'X') { def[0].nbytes = 1;  def[0].format = *p1; }
+  if (*p1 == 'L') { def[0].nbytes = 1;  def[0].format = *p1; }
+  if (*p1 == 'A') { def[0].nbytes = 1;  def[0].format = *p1; }
+  if (*p1 == 'B') { def[0].nbytes = 1;  def[0].format = *p1; }
+  if (*p1 == 'I') { def[0].nbytes = 2;  def[0].format = *p1; }
+  if (*p1 == 'J') { def[0].nbytes = 4;  def[0].format = *p1; }
+  if (*p1 == 'E') { def[0].nbytes = 4;  def[0].format = *p1; }
+  if (*p1 == 'D') { def[0].nbytes = 8;  def[0].format = *p1; }
+  if (*p1 == 'C') { def[0].nbytes = 8;  def[0].format = *p1; }
+  if (*p1 == 'M') { def[0].nbytes = 16; def[0].format = *p1; }
+  if (!def[0].nbytes) { return (FALSE); }
+  
+  return TRUE;
+}
+
+void *gfits_varlength_column_pointer (FTable *ftable, VarLengthColumn *column, int row) {
+
+  // find the values for the specified row
+
+  
+
+}
+
Index: /branches/eam_branch_20071015/Ohana/src/opihi/cmd.data/read_vectors.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 15312)
@@ -172,5 +172,5 @@
     for (i = 0; i <= Nextend; i++) {
       if (!gfits_load_header (f, &header)) return (FALSE);
-      Nbytes = gfits_matrix_size (&header);
+      Nbytes = gfits_data_size (&header);
       /* skip the prior data buffers */
       if (i < Nextend) { 
Index: /branches/eam_branch_20071015/Ohana/src/opihi/dvo/cmpread.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/opihi/dvo/cmpread.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/opihi/dvo/cmpread.c	(revision 15312)
@@ -83,5 +83,5 @@
   } else {
     gprint (GP_ERR, "reading from FITS cmp file %s\n", argv[2]);
-    Nbytes = gfits_matrix_size (&header);
+    Nbytes = gfits_data_size (&header);
     fseek (f, Nbytes, SEEK_CUR); 
     stars = cmpReadFits (f, &Nstars);
Index: /branches/eam_branch_20071015/Ohana/src/opihi/dvo/imbox.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/opihi/dvo/imbox.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/opihi/dvo/imbox.c	(revision 15312)
@@ -79,5 +79,5 @@
     }
   skip:
-    Nskip = gfits_matrix_size (&header);
+    Nskip = gfits_data_size (&header);
     fseek (f, Nskip, SEEK_CUR); 
     gfits_free_header (&header);
Index: /branches/eam_branch_20071015/Ohana/src/opihi/pantasks/task_trange.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/opihi/pantasks/task_trange.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/opihi/pantasks/task_trange.c	(revision 15312)
@@ -57,4 +57,7 @@
   }
 
+  /* allow a syntax which means something like "every hour at MM:SS"
+     this could by something like *:MM:SS ? */
+
   /* test for HH:MM:SS */
   if (hms_to_sec (argv[1], &range.start)) {
Index: /branches/eam_branch_20071015/Ohana/src/tools/src/ckfits.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/tools/src/ckfits.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/tools/src/ckfits.c	(revision 15312)
@@ -20,5 +20,5 @@
   }
 
-  Ntotal = gfits_matrix_size (&header);
+  Ntotal = gfits_data_size (&header);
 
   Ndata = abs(header.bitpix / 8);
Index: /branches/eam_branch_20071015/Ohana/src/tools/src/fields.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/tools/src/fields.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/tools/src/fields.c	(revision 15312)
@@ -85,5 +85,5 @@
 	}   
     
-	Nbytes = gfits_matrix_size (&header);
+	Nbytes = gfits_data_size (&header);
 	fseek (f, Nbytes, SEEK_CUR);
 	Nextend ++;
Index: /branches/eam_branch_20071015/Ohana/src/tools/src/ftable.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/tools/src/ftable.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/tools/src/ftable.c	(revision 15312)
@@ -87,5 +87,5 @@
 
   /* load table data array */
-  Nbytes = gfits_matrix_size (table.header);
+  Nbytes = gfits_data_size (table.header);
   ALLOCATE (table.buffer, char, Nbytes);
   Nread = fread (table.buffer, sizeof (char), Nbytes, f);
@@ -175,5 +175,5 @@
      exit (1);
      }
-     Nbytes = gfits_matrix_size (&header);
+     Nbytes = gfits_data_size (&header);
      fseek (f, Nbytes, SEEK_CUR);
   */
@@ -234,5 +234,5 @@
     }
 
-    Nbytes = gfits_matrix_size (&header);
+    Nbytes = gfits_data_size (&header);
     fseek (f, Nbytes, SEEK_CUR);
 
@@ -270,5 +270,5 @@
 
   /* skip first data array */
-  Nbytes = gfits_matrix_size (header);
+  Nbytes = gfits_data_size (header);
   fseek (f, Nbytes, SEEK_CUR);
 
@@ -280,5 +280,5 @@
     if ((Extname != NULL) && (!strcmp (Extname, extname))) return (f);
 
-    Nbytes = gfits_matrix_size (header);
+    Nbytes = gfits_data_size (header);
     fseek (f, Nbytes, SEEK_CUR);
     gfits_free_header (header);
Index: /branches/eam_branch_20071015/Ohana/src/tools/src/mefhead.c
===================================================================
--- /branches/eam_branch_20071015/Ohana/src/tools/src/mefhead.c	(revision 15311)
+++ /branches/eam_branch_20071015/Ohana/src/tools/src/mefhead.c	(revision 15312)
@@ -42,5 +42,5 @@
   }
   /* skip matrix */
-  Nmatrix = gfits_matrix_size (&header);
+  Nmatrix = gfits_data_size (&header);
   fseek (g, Nmatrix, SEEK_CUR);
 
@@ -64,5 +64,5 @@
 
     /* skip matrix */
-    Nmatrix = gfits_matrix_size (&header);
+    Nmatrix = gfits_data_size (&header);
     fseek (g, Nmatrix, SEEK_CUR);
     
