Index: /branches/rel10_ifa/psLib/src/fits/psFitsHeader.c
===================================================================
--- /branches/rel10_ifa/psLib/src/fits/psFitsHeader.c	(revision 6788)
+++ /branches/rel10_ifa/psLib/src/fits/psFitsHeader.c	(revision 6789)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.2.4.3 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-03-30 00:31:04 $
+ *  @version $Revision: 1.2.4.4 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-04-05 02:36:46 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -174,13 +174,16 @@
 }
 
-psMetadata* psFitsReadHeaderSet(const psFits* fits)
+psMetadata* psFitsReadHeaderSet(psMetadata* out, const psFits* fits)
 {
     if (fits == NULL) {
         psError(PS_ERR_BAD_PARAMETER_NULL, true,
                 PS_ERRORTEXT_psFits_NULL);
+        psFree(out);
         return NULL;
     }
 
-    psMetadata* out = psMetadataAlloc();
+    if (out == NULL) {
+        out = psMetadataAlloc();
+    }
 
     int size = psFitsGetSize(fits);
@@ -251,4 +254,20 @@
                 break;
             }
+        case PS_DATA_S8:
+            fits_update_key(fits->fd,
+                            TBYTE,
+                            item->name,
+                            &item->data.S8,
+                            item->comment,
+                            &status);
+            break;
+        case PS_DATA_S16:
+            fits_update_key(fits->fd,
+                            TSHORT,
+                            item->name,
+                            &item->data.S16,
+                            item->comment,
+                            &status);
+            break;
         case PS_DATA_S32:
             fits_update_key(fits->fd,
@@ -259,4 +278,30 @@
                             &status);
             break;
+        case PS_DATA_U8: {
+                unsigned short int temp = item->data.U8;
+                fits_update_key(fits->fd,
+                                TUSHORT,
+                                item->name,
+                                &temp,
+                                item->comment,
+                                &status);
+            }
+            break;
+        case PS_DATA_U16:
+            fits_update_key(fits->fd,
+                            TUSHORT,
+                            item->name,
+                            &item->data.U16,
+                            item->comment,
+                            &status);
+            break;
+        case PS_DATA_U32:
+            fits_update_key(fits->fd,
+                            TUINT,
+                            item->name,
+                            &item->data.U32,
+                            item->comment,
+                            &status);
+            break;
         case PS_DATA_F32:
             fits_update_key(fits->fd,
@@ -276,12 +321,4 @@
             break;
         case PS_DATA_STRING:
-            if (!strcmp (item->name, "COMMENT")) {
-                fits_write_comment(fits->fd, item->comment, &status);
-                break;
-            }
-            if (!strcmp (item->name, "HISTORY")) {
-                fits_write_history(fits->fd, item->comment, &status);
-                break;
-            }
             fits_update_key(fits->fd,
                             TSTRING,
@@ -305,5 +342,46 @@
     }
 
+    psFree(iter);
+
     return true;
 }
 
+bool psFitsHeaderValidate(psMetadata *header)
+{
+    bool valid = true;
+    int status;
+
+    if (header == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_METADATA_NULL);
+        return false;
+    }
+
+    //transverse the metadata list and inspect at each key
+
+    psListIterator* iter = psListIteratorAlloc(header->list,PS_LIST_HEAD,true);
+    psMetadataItem* item;
+    while ( (item=psListGetAndIncrement(iter)) != NULL ) {
+        psDataType type = item->type;
+
+        if (type > PS_DATA_STRING) { // i.e., a non-primitive type
+            valid = false;
+        }
+
+        if (strlen(item->name) > 8) {
+            item->name[8] = '\0'; // truncate to 8 characters
+        }
+
+        fits_uppercase(item->name); // make uppercase
+
+        // now, let's see if CFITSIO thinks this is a good keyword...
+        status = 0;
+        if (fits_test_keyword(item->name,&status) != 0) {
+            valid = false;
+        }
+    }
+
+    psFree(iter);
+
+    return valid;
+}
