Index: /trunk/psLib/src/fits/psFits.c
===================================================================
--- /trunk/psLib/src/fits/psFits.c	(revision 5163)
+++ /trunk/psLib/src/fits/psFits.c	(revision 5164)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.48 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-09-27 19:55:32 $
+ *  @version $Revision: 1.49 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-09-28 02:37:58 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -24,4 +24,5 @@
 #include "psLogMsg.h"
 #include "psTrace.h"
+#include "psVector.h"
 
 #define MAX_STRING_LENGTH 256  // maximum length string for FITS routines
@@ -165,23 +166,77 @@
 }
 
-static bool convertMetadataTypeToBinaryTForm(psDataType type, char** fitsType)
+static char getTForm(int type)
 {
     switch (type) {
-    case PS_DATA_BOOL:
-        *fitsType = psStringCopy("1L");
-        break;
-    case PS_DATA_S32:
-        *fitsType = psStringCopy("1J");
-        break;
-    case PS_DATA_F32:
-        *fitsType = psStringCopy("1E");
-        break;
-    case PS_DATA_F64:
-        *fitsType = psStringCopy("1D");
-        break;
+    case PS_TYPE_U8:
+    case PS_TYPE_S8:
+        return 'B';
+    case PS_TYPE_S16:
+        return 'I';
+    case PS_TYPE_S32:
+        return 'J';
+    case PS_TYPE_U64:
+    case PS_TYPE_S64:
+        return 'K';
+    case PS_TYPE_U16:
+        return 'U';
+    case PS_TYPE_U32:
+        return 'V';
+    case PS_TYPE_F32:
+        return 'E';
+    case PS_TYPE_F64:
+        return 'D';
+    case PS_TYPE_C32:
+        return 'C';
+    case PS_TYPE_C64:
+        return 'M';
+    case PS_TYPE_BOOL:
+        return 'L';
     case PS_DATA_STRING:
-        *fitsType = psStringCopy("A");
-        break;
-        // XXX: Handle other types, e.g., Vectors, etc.
+        return 'A';
+    default:
+        return '?';
+    }
+}
+
+
+static bool getMetadataTForm(psMetadataItem* item, char** fitsType, int repeat)
+{
+    if (item == NULL) {
+        return false;
+    }
+
+    *fitsType = NULL;
+    char tform = getTForm(item->type);
+
+    switch (item->type) {
+    case PS_TYPE_U8:
+    case PS_TYPE_S8:
+    case PS_TYPE_S16:
+    case PS_TYPE_S32:
+    case PS_TYPE_U64:
+    case PS_TYPE_S64:
+    case PS_TYPE_U16:
+    case PS_TYPE_U32:
+    case PS_TYPE_F32:
+    case PS_TYPE_F64:
+    case PS_TYPE_C32:
+    case PS_TYPE_C64:
+    case PS_TYPE_BOOL:
+        psStringAppend(fitsType, "%d%c",repeat,tform);
+        break;
+
+    case PS_DATA_STRING:
+        psStringAppend(fitsType,"%dA",
+                       strlen(item->data.V)*repeat);
+        break;
+
+    case PS_DATA_VECTOR: {
+            psVector* vec = item->data.V;
+            tform = getTForm(vec->type.type);
+            psStringAppend(fitsType,"%d%c",repeat*vec->n,tform);
+        }
+        break;
+
     default:
         return false;
@@ -1503,5 +1558,7 @@
                                    PS_LIST_HEAD,true);
             while ( (item=psListGetAndIncrement(iter)) != NULL) {
-                if (PS_DATA_IS_PRIMITIVE(item->type) || item->type == PS_DATA_STRING) {
+                if (PS_DATA_IS_PRIMITIVE(item->type) ||
+                        item->type == PS_DATA_STRING ||
+                        item->type == PS_DATA_VECTOR) {
                     bool found = false;
                     psMetadataItem* fItem = NULL;
@@ -1522,6 +1579,9 @@
                         columns->data[n] = psMemIncrRefCounter(item);
 
+                    } else if (item->type == PS_DATA_VECTOR &&
+                               ((psVector*)(fItem->data.V))->n < ((psVector*)(item->data.V))->n) {
+                        psMemDecrRefCounter(fItem);
+                        columns->data[n] = psMemIncrRefCounter(item);
                     }
-
                 }
             }
@@ -1541,12 +1601,8 @@
         char* fitsType;
         columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name);
-        if ( ! convertMetadataTypeToBinaryTForm(((psMetadataItem*)columns->data[n])->type,
-                                                &fitsType)) {
+        if ( ! getMetadataTForm((psMetadataItem*)columns->data[n],
+                                &fitsType,1) ) {
             // XXX: error message
             return false;
-        }
-        if (fitsType[strlen(fitsType)-1] == 'A') {
-            // string type -- append length to the type.
-            psStringPrepend(&fitsType,"%d",strlen(((psMetadataItem*)columns->data[n])->data.V));
         }
         columnTypes->data[n] = fitsType;
@@ -1578,73 +1634,26 @@
         int row;
         item = columns->data[n];
-        psVector* col = NULL;
-        psArray* colArray = NULL;
-        switch (item->type) {
-        case PS_DATA_S32:
-            col = psVectorAlloc(table->n, PS_TYPE_S32);
+        if (PS_DATA_IS_PRIMITIVE(item->type) ) {
+            psVector* col = psVectorAlloc(table->n, item->type);
+            int dataSize = PSELEMTYPE_SIZEOF(item->type);
+            int dataType;
+            convertPsTypeToFits(item->type, NULL,NULL,&dataType);
             for (row = 0; row < table->n; row++) {
-                col->data.S32[row] = psMetadataLookupS32(NULL,
-                                     table->data[row],
-                                     item->name);
+                psMetadataItem* dataItem = psMetadataLookup(
+                                               table->data[row],
+                                               item->name);
+                memcpy(&col->data.U8[row*dataSize],&dataItem->data,dataSize);
             }
-            fits_write_col_int(fits->fd,
-                               n+1, // column number
-                               1, // firstrow
-                               1, // firstelem
-                               table->n, // nelements
-                               col->data.S32,
-                               &status);
-            break;
-
-        case PS_DATA_F32:
-            col = psVectorAlloc(table->n, PS_TYPE_F32);
-            for (row = 0; row < table->n; row++) {
-                col->data.F32[row] = psMetadataLookupF32(NULL,
-                                     table->data[row],
-                                     item->name);
-            }
-            fits_write_col_flt(fits->fd,
-                               n+1, // column number
-                               1, // firstrow
-                               1, // firstelem
-                               table->n, // nelements
-                               col->data.F32,
-                               &status);
-            break;
-
-        case PS_DATA_F64:
-            col = psVectorAlloc(table->n, PS_TYPE_F64);
-            for (row = 0; row < table->n; row++) {
-                col->data.F64[row] = psMetadataLookupF64(NULL,
-                                     table->data[row],
-                                     item->name);
-            }
-            fits_write_col_dbl(fits->fd,
-                               n+1, // column number
-                               1, // firstrow
-                               1, // firstelem
-                               table->n, // nelements
-                               col->data.F64,
-                               &status);
-            break;
-
-        case PS_DATA_BOOL:
-            col = psVectorAlloc(table->n, PS_TYPE_BOOL);
-            for (row = 0; row < table->n; row++) {
-                col->data.S8[row] = psMetadataLookupBool(NULL,
-                                    table->data[row],
-                                    item->name);
-            }
-            fits_write_col_log(fits->fd,
-                               n+1, // column number
-                               1, // firstrow
-                               1, // firstelem
-                               table->n, // nelements
-                               (char*)col->data.S8,
-                               &status);
-            break;
-
-        case PS_DATA_STRING:
-            colArray = psArrayAlloc(table->n);
+            fits_write_col(fits->fd,
+                           dataType,
+                           n+1, // column number
+                           1, // firstrow
+                           1, // firstelem
+                           table->n, // nelements
+                           col->data.U8,
+                           &status);
+            psFree(col);
+        } else if (item->type == PS_DATA_STRING) {
+            psArray* colArray = psArrayAlloc(table->n);
             for (row = 0; row < table->n; row++) {
                 colArray->data[row] = psMemIncrRefCounter(
@@ -1661,11 +1670,28 @@
                                &status);
             psFree(colArray);
-            break;
-
-        default:
-            // XXX: error message?
-            break;
-        }
-        psFree(col);
+        } else if (item->type == PS_DATA_VECTOR) {
+            psVector* vec = (psVector*)(item->data.V);
+            psVector* col = psVectorAlloc(table->n*vec->n, vec->type.type);
+            int dataSize = PSELEMTYPE_SIZEOF(vec->type.type)*vec->n;
+            int dataType;
+            convertPsTypeToFits(vec->type.type, NULL,NULL,&dataType);
+            for (row = 0; row < table->n; row++) {
+                psMetadataItem* dataItem = psMetadataLookup(
+                                               table->data[row],
+                                               item->name);
+                memcpy(&col->data.U8[row*dataSize],
+                       ((psVector*)(dataItem->data.V))->data.U8,
+                       dataSize);
+            }
+            fits_write_col(fits->fd,
+                           dataType,
+                           n+1, // column number
+                           1, // firstrow
+                           1, // firstelem
+                           table->n*vec->n, // nelements
+                           col->data.U8,
+                           &status);
+            psFree(col);
+        }
         if (status != 0) {
             char fitsErr[MAX_STRING_LENGTH];
Index: /trunk/psLib/test/fits/tst_psFits.c
===================================================================
--- /trunk/psLib/test/fits/tst_psFits.c	(revision 5163)
+++ /trunk/psLib/test/fits/tst_psFits.c	(revision 5164)
@@ -6,6 +6,6 @@
 *  @author Robert DeSonia, MHPCC
 *
-*  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-09-27 19:54:52 $
+*  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-09-28 02:38:01 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -201,4 +201,14 @@
                       str);
         psFree(str);
+
+        psVector* vec = psVectorAlloc(5,PS_TYPE_S32);
+        for (int x=0; x < 5; x++) {
+            vec->data.S32[x] = x*2;
+        }
+        psMetadataAdd(header,PS_LIST_TAIL, "MYVEC",
+                      PS_DATA_VECTOR,
+                      "psVector Item",
+                      vec);
+        psFree(vec);
 
         table->data[row] = header;
