Index: trunk/psLib/src/fits/psFitsHeader.c
===================================================================
--- trunk/psLib/src/fits/psFitsHeader.c	(revision 6354)
+++ trunk/psLib/src/fits/psFitsHeader.c	(revision 6767)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-02-08 01:03:34 $
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-04-04 19:52:42 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -90,7 +90,21 @@
             switch (keyType) {
             case 'X': // bit
+            case 'B': // byte
+                success = psMetadataAdd(out,
+                                        PS_LIST_TAIL,
+                                        keyName,
+                                        PS_DATA_S8 | PS_META_DUPLICATE_OK,
+                                        keyComment,
+                                        atoi(keyValue));
+                break;
             case 'I': // short int.
+                success = psMetadataAdd(out,
+                                        PS_LIST_TAIL,
+                                        keyName,
+                                        PS_DATA_S16 | PS_META_DUPLICATE_OK,
+                                        keyComment,
+                                        (psS16)atoi(keyValue));
+                break;
             case 'J': // int.
-            case 'B': // byte
                 success = psMetadataAdd(out,
                                         PS_LIST_TAIL,
@@ -100,6 +114,14 @@
                                         atoi(keyValue));
                 break;
-            case 'U': // unsigned int. may not fit in a psS32
-            case 'K': // long int. can't all fit in a psS32
+            case 'U': // unsigned int.
+                success = psMetadataAdd(out,
+                                        PS_LIST_TAIL,
+                                        keyName,
+                                        PS_DATA_U32 | PS_META_DUPLICATE_OK,
+                                        keyComment,
+                                        atol(keyValue));
+                break;
+
+            case 'K': // long int. can't all fit in a psS32, put in psF64
             case 'F':
                 success = psMetadataAdd(out,
@@ -167,13 +189,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);
@@ -244,4 +269,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,
@@ -249,4 +290,30 @@
                             item->name,
                             &item->data.S32,
+                            item->comment,
+                            &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);
@@ -290,5 +357,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;
+}
