Index: trunk/Ohana/src/tools/src/ftable.c
===================================================================
--- trunk/Ohana/src/tools/src/ftable.c	(revision 39458)
+++ trunk/Ohana/src/tools/src/ftable.c	(revision 39459)
@@ -3,4 +3,5 @@
 # include "inttypes.h"
 
+void table_uncompress (int argc, char **argv);
 int print_table_rows (FTable *table, int start, int Nrows);
 FILE *load_extension (char *file, int Nextend, char *Extname, Header *header);
@@ -22,4 +23,13 @@
   if (get_argument (argc, argv, "-h")) usage ();
   if (get_argument (argc, argv, "--help")) usage ();
+
+  if ((N = get_argument (argc, argv, "-uncompress"))) {
+    remove_argument (N, &argc, argv);
+    table_uncompress (argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "-u"))) {
+    remove_argument (N, &argc, argv);
+    table_uncompress (argc, argv);
+  }
 
   Nextend = 0;
@@ -261,4 +271,5 @@
     fprintf (stderr, " -list:      print extension names\n");
     fprintf (stderr, " -layout:    describe extension\n");
+    fprintf (stderr, " -uncompress: uncompress file (requires output argument)\n");
     exit (2);
 }
@@ -535,2 +546,93 @@
   exit (0);
 }
+
+void myQuit (char *format,...) {
+
+  va_list argp;  
+  va_start (argp, format);
+  vfprintf (stderr, format, argp);
+  va_end (argp);
+  
+  exit (1);
+}
+
+void table_uncompress (int argc, char **argv) {
+
+  if (argc != 3) {
+    fprintf (stderr, "USAGE: ftable -u/-uncompress (input) (output)\n");
+    exit (2);
+  }
+
+  Header header;
+  FTable ftable;
+  Matrix matrix;
+  ftable.header = &header;
+
+  FILE *fi = fopen (argv[1], "r");
+  if (!fi) myQuit ("failed to open input file %s\n", argv[1]);
+  
+  FILE *fo = fopen (argv[2], "w");
+  if (!fo) myQuit ("failed to open output file %s\n", argv[2]);
+  
+  if (!gfits_fread_header (fi, &header)) myQuit ("failed to read PHU header from input file %s\n", argv[1]);
+  if (!gfits_fread_matrix (fi, &matrix, &header)) myQuit ("failed to read PHU data array from input file %s\n", argv[1]);
+  
+  if (!gfits_fwrite_header (fo, &header)) myQuit ("failed to write PHU header to output file %s\n", argv[2]);
+  if (!gfits_fwrite_matrix (fo, &matrix)) myQuit ("failed to write PHU data array to output file %s\n", argv[2]);
+  
+  gfits_free_header (&header);
+  gfits_free_table (&ftable);
+  
+  int Nextend = 0;
+  while (TRUE) {
+    if (!gfits_fread_header (fi, &header)) break;
+
+    if (!gfits_fread_ftable_data (fi, &ftable, FALSE)) {
+      myQuit ("failed to read table data for extension #%d from input file %s\n", Nextend, argv[1]);
+    }
+  
+    Header *outheader = &header;
+    FTable *outtable  = &ftable;
+    
+    Header rawheader;
+    FTable rawtable;
+    rawtable.header = &rawheader;
+    
+    int IsCompressed = gfits_extension_is_compressed_table (&header);
+
+    if (IsCompressed) {
+      int i, Nfields;
+      if (!gfits_scan (&header, "TFIELDS", "%d", 1, &Nfields)) 
+	myQuit ("cannot find TFIELDS in header for extension #%d from input file %s\n", Nextend, argv[1]);
+      for (i = 0; i < Nfields; i++) {
+	if (!gfits_byteswap_varlength_column (&ftable, i+1)) 
+	  myQuit ("cannot swap varlength column for extension #%d from input file %s\n", Nextend, argv[1]);
+      }
+      if (!gfits_uncompress_table (&ftable, &rawtable)) 
+	myQuit ("failed to uncompress table for extension #%d from input file %s\n", Nextend, argv[1]);
+      
+      outheader = &rawheader;
+      outtable  = &rawtable;
+      gfits_free_header (&header);
+      gfits_free_table (&ftable);
+    }
+
+    if (!gfits_fwrite_header (fo, outheader)) {
+      fprintf (stderr, "failed to write table header for extension #%d to output file %s\n", Nextend, argv[2]);
+      exit (1);
+    }
+    if (!gfits_fwrite_table (fo, outtable)) {
+      fprintf (stderr, "failed to write PHU data array for extension #%d to output file %s\n", Nextend, argv[2]);
+      exit (1);
+    }
+  
+    gfits_free_header (outheader);
+    gfits_free_table (outtable);
+
+    Nextend ++;
+  }
+
+  if (!fclose (fi)) myQuit ("error closing input file %s\n", argv[1]);
+  if (!fclose (fo)) myQuit ("error closing output file %s\n", argv[1]);
+  exit (0);
+}
