Index: trunk/Ohana/src/libfits/Makefile
===================================================================
--- trunk/Ohana/src/libfits/Makefile	(revision 31371)
+++ trunk/Ohana/src/libfits/Makefile	(revision 31663)
@@ -54,5 +54,5 @@
 $(TABL)/F_set_column.$(ARCH).o			$(TABL)/F_get_column.$(ARCH).o   \
 $(TABL)/F_table_row.$(ARCH).o			$(TABL)/F_free_T.$(ARCH).o       \
-$(TABL)/F_table_varlength.$(ARCH).o
+$(TABL)/F_table_varlength.$(ARCH).o		$(TABL)/F_copy_T.$(ARCH).o
 
 EXTERN_OBJ = \
Index: trunk/Ohana/src/libfits/include/gfitsio.h
===================================================================
--- trunk/Ohana/src/libfits/include/gfitsio.h	(revision 31371)
+++ trunk/Ohana/src/libfits/include/gfitsio.h	(revision 31663)
@@ -63,6 +63,6 @@
   Header                 *header;
   char                   *buffer;
-  off_t                   datasize;
-  off_t                   validsize;
+  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)
 } FTable;
 
@@ -199,4 +199,6 @@
 int     gfits_vtable_from_ftable       PROTO((FTable *ftable, VTable *vtable, off_t *row, off_t Nrow));
 int     gfits_write_table              PROTO((char *filename, FTable *ftable)); 
+int     gfits_copy_ftable              PROTO((FTable *in, FTable *out));
+int     gfits_copy_vtable              PROTO((VTable *in, VTable *out));
 
 int     gfits_create_Theader           PROTO((Header *header, char *type));
Index: trunk/Ohana/src/libfits/matrix/F_copy_M.c
===================================================================
--- trunk/Ohana/src/libfits/matrix/F_copy_M.c	(revision 31371)
+++ trunk/Ohana/src/libfits/matrix/F_copy_M.c	(revision 31663)
@@ -3,21 +3,21 @@
 
 /*********************** fits copy header ***********************************/
-int gfits_copy_matrix (Matrix *matrix1, Matrix *matrix2) {
+int gfits_copy_matrix (Matrix *in, Matrix *out) {
 
   int i;
 
-  matrix2[0].unsign   = matrix1[0].unsign;
-  matrix2[0].bitpix   = matrix1[0].bitpix;
-  matrix2[0].datasize = matrix1[0].datasize;
-  matrix2[0].bzero    = matrix1[0].bzero;
-  matrix2[0].bscale   = matrix1[0].bscale;
-  matrix2[0].Naxes    = matrix1[0].Naxes;
+  out[0].unsign   = in[0].unsign;
+  out[0].bitpix   = in[0].bitpix;
+  out[0].datasize = in[0].datasize;
+  out[0].bzero    = in[0].bzero;
+  out[0].bscale   = in[0].bscale;
+  out[0].Naxes    = in[0].Naxes;
   for (i = 0; i < FT_MAX_NAXES; i++) 
-    matrix2[0].Naxis[i] = matrix1[0].Naxis[i];
+    out[0].Naxis[i] = in[0].Naxis[i];
 
-  if (matrix2[0].buffer != NULL) free (matrix2[0].buffer);
-  ALLOCATE (matrix2[0].buffer, char, matrix2[0].datasize);
+  if (out[0].buffer != NULL) free (out[0].buffer);
+  ALLOCATE (out[0].buffer, char, out[0].datasize);
   
-  memcpy (matrix2[0].buffer, matrix1[0].buffer, matrix2[0].datasize);
+  memcpy (out[0].buffer, in[0].buffer, out[0].datasize);
 
   return (TRUE);
Index: trunk/Ohana/src/libfits/table/F_copy_T.c
===================================================================
--- trunk/Ohana/src/libfits/table/F_copy_T.c	(revision 31663)
+++ trunk/Ohana/src/libfits/table/F_copy_T.c	(revision 31663)
@@ -0,0 +1,45 @@
+# include <ohana.h>
+# include <gfitsio.h>
+
+/*********************** copy ftable (does not copy the header pointer) ***********************************/
+int gfits_copy_ftable (FTable *in, FTable *out) {
+
+  /* find buffer size */
+  out[0].validsize = in[0].validsize;
+  out[0].datasize  = in[0].datasize;
+
+  ALLOCATE (out[0].buffer, char, out[0].datasize);
+  memcpy (out[0].buffer, in[0].buffer, out[0].datasize);
+  return (TRUE);
+}	
+
+/*********************** copy ftable (does not copy the header pointer) ***********************************/
+int gfits_copy_vtable (VTable *in, VTable *out) {
+
+  off_t i, Nx, Ny, Nrows;
+
+  /* find buffer size */
+  Nx = in[0].header[0].Naxis[0];
+  Ny = in[0].header[0].Naxis[1];
+
+  // validate these two?
+  // table[0].datasize = gfits_data_size (table[0].header);
+  // table[0].pad = table[0].datasize - Nx*Ny;
+
+  /* find buffer size */
+  out[0].datasize = in[0].datasize;
+  out[0].pad      = in[0].pad;
+  out[0].Nrow     = in[0].Nrow;
+
+  Nrows = out[0].Nrow;
+
+  ALLOCATE (out[0].row, off_t, MAX (Nrows, 1));
+  ALLOCATE (out[0].buffer, char *, MAX (Nrows, 1));
+  for (i = 0; i < Nrows; i++) {
+    out[0].row[i] = in[0].row[i];
+    ALLOCATE (out[0].buffer[i], char, MAX (Nx, 1));
+    memcpy (out[0].buffer[i], in[0].buffer[i], Nx);
+  }
+  return (TRUE);
+}	
+
