Index: trunk/Ohana/src/libfits/include/gfitsio.h
===================================================================
--- trunk/Ohana/src/libfits/include/gfitsio.h	(revision 38255)
+++ trunk/Ohana/src/libfits/include/gfitsio.h	(revision 38441)
@@ -73,4 +73,5 @@
   off_t                   datasize; // size of the buffer (including block padding at the end)
   off_t                   validsize;  // size of the valid portion of the table (< validsize if file is short)
+  off_t                   heap_start; // byte offset to start of HEAP
 } FTable;
 
@@ -85,12 +86,32 @@
 } VTable;
 
-typedef struct {
-  int   maxlen; 	      // max size of all table rows
-  int   nbytes;		      // number of bytes per column element
-  int   Nstart;		      // byte offset of this column relative to first column
-  off_t heap_start;	      // byte offset to start of HEAP
-  char  format;		      // data format character (one of: XLABIJEDCM)
-  char  mode;		      // access data pointer type (one of P or Q)
+// description / metadata needed for a single varlength column.  A varlength column has a
+// 2-element array giving the (length,offset) of data in the heap.  Below, 'real data' are
+// the values in the heap; 'metadata' are the values in the main table.
+typedef struct {
+  int   column;		      // field number (of the metadata)
+  char  format;		      // format character for real data (one of: XLABIJKEDCM)
+  char  mode;		      // format character for metadata (one of P [float] or Q [double])
+  int   maxlen; 	      // max size of all table rows for this column
+  int   nbytes;		      // number of bytes per real data column element 
+  int   offset;		      // byte offset of the metadata column relative to first column
 } VarLengthColumn;
+
+typedef struct {
+  char ttype[16]; 	      // TTYPE field of original table
+  char ttype_cmt[80];	      // comment associated with TTYPE
+  char tunit[16];	      // TUNIT field of original table
+  char tunit_cmt[80];	      // comment associated with TUNIT
+  char tformat[16];	      // TFORM field of original table
+  char tformat_cmt[80];	      // comment associated with TFORM
+  char zctype[80];	      // compression type for this field
+  VarLengthColumn zdef;	      // description of the output variable length column
+
+  char datatype[80];	      // named data type associated with ttype (eg, 18J -> int, 18D -> double)
+  int Nvalues;		      // number of values per row (eg 18J -> 18 int values)
+  int pixsize;		      // number of bytes per value of this row (eg, 18J -> 4 bytes)
+  int rowsize;		      // number of bytes for a full row (Nvalues * pixsize)
+  int offset;		      // byte offset of the real data column relative to first column
+} TableField;
 
 # ifndef PROTO
@@ -106,4 +127,5 @@
 char   *gfits_keyword_end              PROTO((char *line));
 int     gfits_copy_header              PROTO((Header *in, Header *out)); 
+int     gfits_copy_header_ptr          PROTO((Header *in, Header *out)); 
 int     gfits_create_header            PROTO((Header *header)); 
 int     gfits_delete                   PROTO((Header *header, char *field, int N)); 
@@ -117,6 +139,6 @@
 int     gfits_modify                   PROTO((Header *header, char *field, char *mode, int N,...)) OHANA_FORMAT(printf, 3, 5); 
 int     gfits_print                    PROTO((Header *header, char *field, char *mode, int N,...)) OHANA_FORMAT(printf, 3, 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_modify_alt               PROTO((Header *header, char *field, char *mode, int N,...)); // do not use a FORMAT: non-standard fmt chars
+int     gfits_print_alt                PROTO((Header *header, char *field, char *mode, int N,...)); // do not use a FORMAT: non-standard fmt chars
 int     gfits_find_Xheader             PROTO((FILE *f, Header *header, char *extname));
 int     gfits_read_Xheader             PROTO((char *filename, Header *header, int N));
@@ -124,5 +146,5 @@
 int     gfits_save_header              PROTO((FILE *f, Header *header));
 int     gfits_scan                     PROTO((Header *header, char *field, char *mode, int N,...)) OHANA_FORMAT(scanf, 3, 5);
-int     gfits_scan_alt                 PROTO((Header *header, char *field, char *mode, int N,...));
+int     gfits_scan_alt                 PROTO((Header *header, char *field, char *mode, int N,...)); // do not use a FORMAT: non-standard fmt chars
 int     gfits_set_unsign_mode          PROTO((int mode));
 int     gfits_stripwhite               PROTO((char *string));
@@ -133,4 +155,5 @@
 off_t   gfits_data_min_size            PROTO((Header *header));
 off_t   gfits_data_pad_size            PROTO((off_t rawsize));
+off_t   gfits_heap_start               PROTO((Header *header));
 int 	gfits_extended_to_primary      PROTO((Header *header, int simple, char *comment));
 int 	gfits_primary_to_extended      PROTO((Header *header, char *exttype, char *comment));
@@ -166,13 +189,36 @@
 void   	gfits_set_matrix_value         PROTO((Matrix *matrix, off_t x, off_t y, double value)); 
 int     gfits_write_matrix             PROTO((char *filename, Matrix *matrix)); 
+
 int     gfits_uncompress_image 	       PROTO((Header *header, Matrix *matrix, FTable *ftable));
-int     gfits_uncompress_data  	       PROTO((char *zdata, int Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *outdata, int *Nout, int out_pixsize));
-int     gfits_distribute_data  	       PROTO((Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int oblank, int *ztile, int zblank, float zscale, float zzero));
-int     gfits_byteswap_zdata   	       PROTO((char *zdata, int Nzdata, int bitpix));
+int     gfits_uncompress_data  	       PROTO((char *zdata, int Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *outdata, int *Nout, int Nout_alloc, int out_pixsize));
+int     gfits_distribute_data  	       PROTO((Matrix *matrix, char *data, int Ndata, int bitpix, int *otile, int oblank, int *ztile, int zblank, float zscale, float zzero));
+
+int     gfits_compress_data  	       PROTO((char *zdata, int *Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *rawdata, int Nraw, int raw_pixsize, int Nx, int Ny));
+int     gfits_compress_image 	       PROTO((Header *header, Matrix *matrix, FTable *ftable, int *Ztile, char *zcmptype));
+int     gfits_collect_data   	       PROTO((Matrix *matrix, char *raw, int Nraw, int raw_pixsize, int *otile, int oblank, int *ztile, int zblank, float zscale, float zzero));
+
+int     gfits_copy_keywords_compress   PROTO((Header *srchead, Header *tgthead));
 int     gfits_swap_raw   	       PROTO((Matrix *matrix));
-int     gfits_extension_is_compressed  PROTO((Header *header));
+
 off_t   gfits_tile_size                PROTO((Matrix *matrix, int *otile, int *ztile));
+int 	gfits_imtile_maxsize           PROTO((Matrix *matrix, int *ztile));
+int 	gfits_imtile_count             PROTO((Matrix *matrix, int *ztile, int *ntile));
+int 	gfits_imtile_start             PROTO((Matrix *matrix, int *otile));
+int 	gfits_imtile_next              PROTO((Matrix *matrix, int *ztile, int *ntile, int *otile));
+
+int     gfits_extension_is_compressed_image  PROTO((Header *header));
+int     gfits_extension_is_compressed_table  PROTO((Header *header));
+int     gfits_byteswap_zdata   	        PROTO((char *zdata, int Nzdata, int pixsize));
+int     gfits_compressed_data_pixsize   PROTO((char *cmptype, int out_bitpix, char **optname, char **optvalue, int Noptions));
 int     gfits_uncompressed_data_pixsize PROTO((char *cmptype, int out_bitpix, char **optname, char **optvalue, int Noptions));
-int     gfits_vartable_heap_pixsize    PROTO((char format));
+int     gfits_uncompressed_data_bitpix  PROTO((char *cmptype, int out_bitpix, char **optname, char **optvalue, int Noptions));
+int     gfits_vartable_heap_pixsize     PROTO((char format));
+int     gfits_cmptype_valid             PROTO((char *cmptype));
+
+int     gfits_varlength_column_add_data PROTO((FTable *table, char *data, off_t Ndata, int row, VarLengthColumn *column));
+void   *gfits_varlength_column_pointer  PROTO((FTable *ftable, VarLengthColumn *column, off_t row, off_t *length));
+int     gfits_varlength_column_define   PROTO((FTable *ftable, VarLengthColumn *def, int column));
+int     gfits_varlength_column_finish   PROTO((FTable *ftable, VarLengthColumn *def));
+int     gfits_byteswap_varlength_column PROTO((FTable *ftable, int column));
 
 /******************************* Table functions *************/
@@ -183,4 +229,5 @@
 char   *gfits_table_print              PROTO((FTable *ftable,...));
 int     gfits_add_rows                 PROTO((FTable *ftable, char *data, off_t Nrow, off_t Nbytes));
+int     gfits_set_table_rows           PROTO((Header *header, FTable *table, off_t Nrows));
 int     gfits_bintable_format          PROTO((char *format, char *type, int *Nval, int *Nbytes));
 int     gfits_create_table             PROTO((Header *header, FTable *ftable));
@@ -199,7 +246,9 @@
 int     gfits_fwrite_ftable_range      PROTO((FILE *f, FTable *table, off_t start, off_t Nrows, off_t Ndisk, off_t Ntotal));
 int     gfits_get_bintable_column      PROTO((Header *header, FTable *table, char *label, void **data));
+int     gfits_get_bintable_column_raw  PROTO((Header *header, FTable *table, char *label, void **data, char nativeOrder));
 int     gfits_get_bintable_column_type PROTO((Header *header, char *label, char *type, int *Nval));
+void   *gfits_get_bintable_column_data PROTO((Header *header, FTable *table, char *label, char *type, off_t *Nrow, int *Ncol));
 int     gfits_get_bintable_column_type_by_N  PROTO((Header *header, int N, char *type, int *Nval));
-void   *gfits_get_bintable_column_data PROTO((Header *header, FTable *table, char *label, char *type, off_t *Nrow, int *Ncol));
+void   *gfits_get_bintable_column_data_raw   PROTO((Header *header, FTable *table, char *label, char *type, off_t *Nrow, int *Ncol, char nativeOrder));
 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));
@@ -207,5 +256,5 @@
 int     gfits_read_table               PROTO((char *filename, FTable *ftable)); 
 int     gfits_set_bintable_column      PROTO((Header *header, FTable *table, char *label, void *data, off_t Nrow));
-int     gfits_set_bintable_column_reformat PROTO((Header *header, FTable *table, char *label, char *intype, void *data, off_t Nrow));
+int     gfits_set_bintable_column_reformat PROTO((Header *header, FTable *table, char *label, char *intype, void *data, off_t Nrow, char nativeOrder));
 int     gfits_set_table_column         PROTO((Header *header, FTable *table, char *label, void *data, off_t Nrow));
 int     gfits_table_column             PROTO((FTable *ftable, char *field, char *mode,...)) OHANA_FORMAT(printf, 3, 4);
@@ -219,4 +268,5 @@
 int     gfits_copy_ftable              PROTO((FTable *in, FTable *out));
 int     gfits_copy_vtable              PROTO((VTable *in, VTable *out));
+int     gfits_copy_ftable_ptr          PROTO((FTable *in, FTable *out));
 
 int     gfits_create_Theader           PROTO((Header *header, char *type));
@@ -227,6 +277,11 @@
 int     gfits_write_Theader            PROTO((char *filename, Header *header));
 
-int     gfits_varlength_column_define  PROTO((FTable *ftable, VarLengthColumn *def, int column));
-void   *gfits_varlength_column_pointer PROTO((FTable *ftable, VarLengthColumn *column, off_t row, off_t *length));
+int     gfits_compress_table           PROTO((FTable *srctable, FTable *tgttable, int ztilelen, char *zcmptype));
+int     gfits_uncompress_table         PROTO((FTable *srctable, FTable *tgttable));
+
+// XXX EAM for testing
+int gfits_dump_raw_table (FTable *table, char *message);
+int gfits_dump_cmp_table (FTable *table, char *message);
+
 
 #endif /* FITSIO */
