Index: trunk/psLib/src/fileUtils/psFits.c
===================================================================
--- trunk/psLib/src/fileUtils/psFits.c	(revision 2994)
+++ trunk/psLib/src/fileUtils/psFits.c	(revision 3025)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-01-14 19:40:33 $
+ *  @version $Revision: 1.11 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-01-17 20:58:21 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -165,14 +165,14 @@
     switch (type) {
     case PS_TYPE_BOOL:
-        *fitsType = "1L";
+        *fitsType = psStringCopy("1L");
         break;
     case PS_TYPE_S32:
-        *fitsType = "1J";
+        *fitsType = psStringCopy("1J");
         break;
     case PS_TYPE_F32:
-        *fitsType = "1E";
+        *fitsType = psStringCopy("1E");
         break;
     case PS_TYPE_F64:
-        *fitsType = "1D";
+        *fitsType = psStringCopy("1D");
         break;
         // XXX: Handle other types, e.g., Vectors, etc.
@@ -1028,5 +1028,5 @@
 
     // the row parameter in the proper range?
-    if (row < 1 || row > numRows) {
+    if (row < 0 || row >= numRows) {
         psError(PS_ERR_BAD_PARAMETER_VALUE, true,
                 PS_ERRORTEXT_psFits_ROW_INVALID,
@@ -1056,7 +1056,7 @@
         if (status == 0) {
 
-            #define READ_TABLE_ROW_CASE(FITSTYPE, TYPE) \
+            #define READ_TABLE_ROW_CASE(FITSTYPE, NATIVETYPE, TYPE) \
         case FITSTYPE: { \
-                ps##TYPE value; \
+                NATIVETYPE value; \
                 int anynul = 0; \
                 fits_read_col(fits->p_fd, FITSTYPE, col,row+1, \
@@ -1064,16 +1064,30 @@
                 if (anynul == 0) { \
                     psMetadataAdd(data,PS_LIST_TAIL, name, \
-                                  PS_TYPE_S32, PS_META_PRIMITIVE, \
-                                  "", value); \
+                                  PS_TYPE_##TYPE, PS_META_PRIMITIVE, \
+                                  "", (ps##TYPE)value); \
                 } \
-            } \
-            break;
+                break; \
+            }
 
             switch (typecode) {
             case TBYTE:
             case TSHORT:
-                READ_TABLE_ROW_CASE(TLONG, S32)
-                READ_TABLE_ROW_CASE(TFLOAT, F32)
-                READ_TABLE_ROW_CASE(TDOUBLE, F64)
+            case TLONGLONG:
+                READ_TABLE_ROW_CASE(TLONG, long, S32)
+                READ_TABLE_ROW_CASE(TFLOAT, float, F32)
+                READ_TABLE_ROW_CASE(TDOUBLE, double, F64)
+                READ_TABLE_ROW_CASE(TLOGICAL, bool, BOOL);
+            case TSTRING: {
+                    char* value;
+                    int anynul = 0;
+                    fits_read_col(fits->p_fd, TSTRING, col,row+1,
+                                  1, 1, NULL, &value, &anynul, &status);
+                    if (anynul == 0) {
+                        psMetadataAdd(data,PS_LIST_TAIL, name,
+                                      PS_TYPE_PTR, PS_META_STR,
+                                      "", value);
+                    }
+                    break;
+                }
             default:
                 psTrace("psFits.psFitsReadTableRow", 2,
@@ -1266,7 +1280,5 @@
     // get the size of the FITS table
     long numRows = 0;
-    int numCols = 0;
     fits_get_num_rows(fits->p_fd, &numRows, &status);
-    fits_get_num_cols(fits->p_fd, &numCols, &status);
     if ( status != 0) {
         char fitsErr[MAX_STRING_LENGTH];
@@ -1278,5 +1290,5 @@
     }
 
-    psArray* table = psArrayAlloc(numCols);
+    psArray* table = psArrayAlloc(numRows);
 
     for (int row = 0; row < numRows; row++) {
@@ -1293,4 +1305,5 @@
 {
     int status = 0;
+    psMetadataItem* item;
 
     if (fits == NULL) {
@@ -1307,11 +1320,16 @@
 
     int rows = table->n;
+    if (rows < 1) {
+        // no table data, what can I do?
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psFits_TABLE_EMPTY);
+        return false;
+    }
 
     // find all the columns needed
-    psArray* columns = psArrayAlloc(16);
+    psArray* columns = psArrayAlloc(((psMetadata*)table->data[0])->list->size);
     columns->n=0;
 
     // find the unique items in the array of metadata 'rows'
-    psMetadataItem* item;
     for (int row=0; row < rows; row++) {
         psMetadata* rowMeta = table->data[row];
@@ -1329,5 +1347,5 @@
                     }
                     if (! found) {
-                        psArrayAdd(columns, columns->nalloc, item);
+                        psArrayAdd(columns, columns->nalloc, psMemIncrRefCounter(item));
                     }
                 }
@@ -1347,5 +1365,5 @@
     for (int n=0; n < columns->n; n++) {
         char* fitsType;
-        columnNames->data[n] = ((psMetadataItem*)columns->data[n])->name;
+        columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name);
         if ( ! convertPsTypeToBinaryTForm(((psMetadataItem*)columns->data[n])->pType,
                                           &fitsType)) {
@@ -1366,12 +1384,11 @@
                     &status);
 
+    psFree(columnNames);
+    psFree(columnTypes);
+
     // fill in the table elements with data
     for (int n = 0; n < columns->n; n++) {
         int row;
         item = columns->data[n];
-        psArray* columnItems = psArrayAlloc(table->n);
-        for (row = 0; row < table->n; row++) {
-            columnItems->data[row] = psMetadataLookup(table->data[row],item->name);
-        }
 
         if (item->type == PS_META_PRIMITIVE) {
@@ -1380,8 +1397,9 @@
             case PS_TYPE_S32:
                 for (row = 0; row < table->n; row++) {
-                    col->data.S32[row] = item->data.S32;
+                    col->data.S32[row] = psMetadataLookupS32(
+                                             table->data[row],item->name,NULL);
                 }
                 fits_write_col_int(fits->p_fd,
-                                   n, // column number
+                                   n+1, // column number
                                    1, // firstrow
                                    1, // firstelem
@@ -1392,8 +1410,9 @@
             case PS_TYPE_F32:
                 for (row = 0; row < table->n; row++) {
-                    col->data.F32[row] = item->data.F32;
+                    col->data.F32[row] = psMetadataLookupF32(
+                                             table->data[row],item->name,NULL);
                 }
                 fits_write_col_flt(fits->p_fd,
-                                   n, // column number
+                                   n+1, // column number
                                    1, // firstrow
                                    1, // firstelem
@@ -1402,10 +1421,11 @@
                                    &status);
                 break;
-            case PS_TYPE_S64:
+            case PS_TYPE_F64:
                 for (row = 0; row < table->n; row++) {
-                    col->data.F64[row] = item->data.F64;
+                    col->data.F64[row] = psMetadataLookupF64(
+                                             table->data[row],item->name,NULL);
                 }
                 fits_write_col_dbl(fits->p_fd,
-                                   n, // column number
+                                   n+1, // column number
                                    1, // firstrow
                                    1, // firstelem
@@ -1414,14 +1434,22 @@
                                    &status);
                 break;
+            case PS_TYPE_BOOL:
+                for (row = 0; row < table->n; row++) {
+                    col->data.S8[row] = psMetadataLookupBool(
+                                            table->data[row],item->name,NULL);
+                }
+                fits_write_col_log(fits->p_fd,
+                                   n+1, // column number
+                                   1, // firstrow
+                                   1, // firstelem
+                                   table->n, // nelements
+                                   col->data.S8,
+                                   &status);
+                break;
             default:
                 // XXX: error message
-                psFree(col);
-                psFree(columnItems);
-                psFree(columnNames);
-                psFree(columnTypes);
-                psFree(columns);
-                return false;
+                break;
             }
-
+            psFree(col);
         } else if (item->type == PS_META_STR) {
             psArray* col = psArrayAlloc(table->n);
@@ -1436,6 +1464,9 @@
                                (char**)col->data,
                                &status);
-        }
-    }
+            psFree(col);
+        }
+    }
+
+    psFree(columns);
 
     return true;
