Index: trunk/Ohana/src/libfits/include/gfitsio.h
===================================================================
--- trunk/Ohana/src/libfits/include/gfitsio.h	(revision 15038)
+++ trunk/Ohana/src/libfits/include/gfitsio.h	(revision 15487)
@@ -1,3 +1,5 @@
 /* FITS specific macros and structures */
+
+# include <assert.h>
 
 # ifndef GFITSIO
@@ -48,4 +50,6 @@
   int                     Naxis[FT_MAX_NAXES];
   int                     size;
+  int                     pcount;
+  int                     gcount;
   double                  bzero;
   double                  bscale;
@@ -84,108 +88,118 @@
 } 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
+  int  heap_start;	      // byte offset to start of HEAP
+  char format;		      // data format character (one of: XLABIJEDCM)
+} 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                   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_data_size                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));
+int 	gfits_modify_extended          PROTO((Header *header, char *exttype, char *comment));
+
 
 /******************************* 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)); 
+int     gfits_uncompress_image 	       PROTO((Header *header, Matrix *matrix, FTable *ftable, int primary));
+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 *ztile, float zscale, float zzero));
+int     gfits_byteswap_zdata   	       PROTO((char *zdata, int Nzdata, int bitpix));
+int     gfits_extension_is_compressed  PROTO((Header *header));
+int     gfits_tile_size                PROTO((Matrix *matrix, int *otile, int *ztile));
 
 /******************************* 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));
-
-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));
+
+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_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));
+
+int     gfits_varlength_column_define  PROTO((FTable *ftable, VarLengthColumn *def, int column));
+void   *gfits_varlength_column_pointer PROTO((FTable *ftable, VarLengthColumn *column, int row, int *length));
 
 #endif /* FITSIO */
