Index: trunk/psLib/src/fits/psFitsHeader.c
===================================================================
--- trunk/psLib/src/fits/psFitsHeader.c	(revision 16645)
+++ trunk/psLib/src/fits/psFitsHeader.c	(revision 16665)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2008-01-23 03:08:03 $
+ *  @version $Revision: 1.40 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2008-02-26 23:42:21 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -32,25 +32,28 @@
 #include "psVector.h"
 
-#define MAX_STRING_LENGTH 256  // maximum length string for FITS routines
+#define MAX_STRING_LENGTH 256           // maximum length string for FITS routines
 #define NUM_EMPTY_KEYS 8                // Number of keywords before header is considered practically empty
 
 // list of FITS header keys to ignore; NULL-terminated
-static const char* ignoreFitsKeys[] = { "", NULL};
+static const char* ignoreFitsKeys[] = { "", NULL };
 
 // List of FITS header keys that may be duplicated; NULL-terminated
-static const char *duplicateFitsKeys[] = { "COMMENT", "HIERARCH", "HISTORY", NULL};
+static const char *duplicateFitsKeys[] = { "COMMENT", "HIERARCH", "HISTORY", NULL };
+
+// List of FITS header keys that are put in the comment by cfitsio; but we want them in the value.
+static const char *commentFitsKeys[] = { "COMMENT", "HISTORY", NULL };
 
 // List of FITS header keys not to write (handled by cfitsio); NULL-terminated
 static const char *noWriteFitsKeys[] = { "SIMPLE", "XTENSION", "BITPIX", "NAXIS", "EXTNAME", "BSCALE",
                                          "BZERO", "TFIELDS", "PCOUNT", "GCOUNT", "ZIMAGE", "ZBITPIX",
-                                         "ZCMPTYPE", "PSBITPIX", NULL};
+                                         "ZCMPTYPE", "PSBITPIX", NULL };
 
 // List of the start of FITS header keys not to write (handled by cfitsio); NULL-terminated
 static const char *noWriteFitsKeyStarts[] = { "NAXIS", "TTYPE", "TFORM", "ZNAXIS", "ZTILE", "ZNAME", "ZVAL",
-                                              NULL};
+                                              NULL };
 
 // List of FITS header keys that may be present if the header is considered "empty"; NULL-terminated
 static const char *emptyKeys[] = { "SIMPLE", "BITPIX", "NAXIS", "EXTEND", "COMMENT", "CHECKSUM", "DATASUM",
-                                   NULL };
+                                   NULL  };
 
 // How to translate between keywords
@@ -253,83 +256,90 @@
         }
 
-        char keyType;                   // Type of key; from cfitsio
-        if (keyValue[0] != 0) { // blank values are not handled by fits_get_keytype
-            fits_get_keytype(keyValue, &keyType, &status);
+        bool success;                   // Was the add to the metadata successful?
+
+        // Certain keywords (COMMENT and HISTORY) are put in the comment rather than value by cfitsio.
+        if (keywordInList(keyName, commentFitsKeys)) {
+            success = psMetadataAddStr(header, PS_LIST_TAIL, keyNameTrans, dupFlag, NULL, keyComment);
         } else {
-            keyType = 'C';
-        }
-        if (status != 0) {
-            break;
-        }
-
-        bool success;                 // Was the add to the metadata successful?
-        switch (keyType) {
-        case 'X': // bit
-        case 'B': // byte
-            success = psMetadataAddS8(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
-                                      atoi(keyValue));
-            break;
-        case 'I': // short int.
-            // This is the default type that cfitsio reports whenever it doesn't know what it is.
-            // Trap NAN, INF and -INF, which cfitsio doesn't handle.
-            if (strncasecmp(keyValue, "NAN", 3) == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN);
-            } else if (strncasecmp(keyValue, "INF", 3) == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
-                                           INFINITY);
-            } else if (strncasecmp(keyValue, "-INF", 4) == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
-                                           -INFINITY);
+            char keyType;                   // Type of key; from cfitsio
+            if (keyValue[0] != 0) { // blank values are not handled by fits_get_keytype
+                fits_get_keytype(keyValue, &keyType, &status);
             } else {
+                keyType = 'C';
+            }
+            if (status != 0) {
+                break;
+            }
+
+            switch (keyType) {
+              case 'X': // bit
+              case 'B': // byte
+                success = psMetadataAddS8(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                          atoi(keyValue));
+                break;
+              case 'I': // short int.
+                // This is the default type that cfitsio reports whenever it doesn't know what it is.
+                // Trap NAN, INF and -INF, which cfitsio doesn't handle.
+                if (strncasecmp(keyValue, "NAN", 3) == 0) {
+                    success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN);
+                } else if (strncasecmp(keyValue, "INF", 3) == 0) {
+                    success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                               INFINITY);
+                } else if (strncasecmp(keyValue, "-INF", 4) == 0) {
+                    success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                               -INFINITY);
+                } else {
+                    success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                               atoi(keyValue));
+                }
+                break;
+              case 'J': // int.
                 success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
                                            atoi(keyValue));
-            }
-            break;
-        case 'J': // int.
-            success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
-                                       atoi(keyValue));
-            break;
-        case 'U': // unsigned int.
-            success = psMetadataAddU32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
-                                       atol(keyValue));
-            break;
-
-        case 'K': // long int. can't all fit in a psS32, put in psF64
-        case 'F':
-            success = psMetadataAddF64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
-                                       atof(keyValue));
-            break;
-        case 'C': {
-            char *keyValueFixed = p_psFitsHeaderParseString(keyValue); // Fixed version of the string
-
-            // Need to trap NAN, INF and -INF written by psFitsWriteHeader.
-            // cfitsio won't write these, so we write them as strings, and then have to trap them on read.
-            if (strcasecmp(keyValueFixed, "NAN") == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN);
-            } else if (strcasecmp(keyValueFixed, "INF") == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
-                                           INFINITY);
-            } else if (strcasecmp(keyValueFixed, "-INF") == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
-                                           -INFINITY);
-            } else if (compressed && strcmp(keyName, "EXTNAME") == 0 &&
-                       strcmp(keyValueFixed, "COMPRESSED_IMAGE") == 0) {
-                // Ignore EXTNAME=COMPRESSED_IMAGE if compression convention is to be respected
-                success = true;
-            } else {
-                success = psMetadataAddStr(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
-                                           keyValueFixed);
-            }
-            break;
-        }
-        case 'L': {
-            bool temp = (keyValue[0] == 'T') ? 1 : 0;
-            success = psMetadataAddBool(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, temp);
-            break;
-        }
-        default:
-            psError(PS_ERR_IO, true, _("Specified FITS metadata type, %c, is not supported."), keyType);
-            psFree(header);
-            return NULL;
+                break;
+              case 'U': // unsigned int.
+                success = psMetadataAddU32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                           atol(keyValue));
+                break;
+
+              case 'K': // long int. can't all fit in a psS32, put in psF64
+              case 'F':
+                success = psMetadataAddF64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                           atof(keyValue));
+                break;
+              case 'C': {
+                  char *keyValueFixed = p_psFitsHeaderParseString(keyValue); // Fixed version of the string
+
+                  // Need to trap NAN, INF and -INF written by psFitsWriteHeader: cfitsio won't write these,
+                  // so we write them as strings, and then have to trap them on read.
+                  if (strcasecmp(keyValueFixed, "NAN") == 0) {
+                      success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                                 NAN);
+                  } else if (strcasecmp(keyValueFixed, "INF") == 0) {
+                      success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                                 INFINITY);
+                  } else if (strcasecmp(keyValueFixed, "-INF") == 0) {
+                      success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                                 -INFINITY);
+                  } else if (compressed && strcmp(keyName, "EXTNAME") == 0 &&
+                             strcmp(keyValueFixed, "COMPRESSED_IMAGE") == 0) {
+                      // Ignore EXTNAME=COMPRESSED_IMAGE if compression convention is to be respected
+                      success = true;
+                  } else {
+                      success = psMetadataAddStr(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                                 keyValueFixed);
+                  }
+                  break;
+              }
+              case 'L': {
+                  bool temp = (keyValue[0] == 'T') ? 1 : 0;
+                  success = psMetadataAddBool(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, temp);
+                  break;
+              }
+              default:
+                psError(PS_ERR_IO, true, _("Specified FITS metadata type, %c, is not supported."), keyType);
+                psFree(header);
+                return NULL;
+            }
         }
 
@@ -503,7 +513,15 @@
 
         if (strcmp(item->name, "COMMENT") == 0) {
-            fits_write_comment(fits->fd, item->comment, &status);
+            if (item->type != PS_DATA_STRING) {
+                psWarning("COMMENT header is not of type STRING (%x) --- ignored.", item->type);
+            } else {
+                fits_write_comment(fits->fd, item->data.str, &status);
+            }
         } else if (strcmp(item->name,  "HISTORY") == 0) {
-            fits_write_history(fits->fd, item->comment, &status);
+            if (item->type != PS_DATA_STRING) {
+                psWarning("COMMENT header is not of type STRING (%x) --- ignored.", item->type);
+            } else {
+                fits_write_history(fits->fd, item->data.str, &status);
+            }
         } else {
             // A regular FITS header
