Index: /trunk/psLib/src/fits/psFitsHeader.c
===================================================================
--- /trunk/psLib/src/fits/psFitsHeader.c	(revision 7220)
+++ /trunk/psLib/src/fits/psFitsHeader.c	(revision 7221)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-05-22 22:39:07 $
+ *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-05-25 23:41:18 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -28,8 +28,9 @@
 #define MAX_STRING_LENGTH 256  // maximum length string for FITS routines
 
-// list of FITS header keys to ignore.
-static char* standardFitsKeys[] = {
-                                      NULL
-                                  };
+// list of FITS header keys to ignore; NULL-terminated
+static char* ignoreFitsKeys[] = {NULL};
+
+// List of FITS header keys that may be duplicated; NULL-terminated
+static char *duplicateFitsKeys[] = {"COMMENT", "HIERARCH", "HISTORY", "", NULL};
 
 psMetadata* psFitsReadHeader(psMetadata* out,
@@ -52,30 +53,37 @@
 
     // Get number of key names
-    int numKeys = 0;
-    int keyNum = 0;
-    int status = 0;
+    int numKeys = 0;                    // Number of keywords
+    int keyNum = 0;                     // Current key number
+    int status = 0;                     // Status of cfitsio calls
     fits_get_hdrpos(fits->fd, &numKeys, &keyNum, &status);
 
     // Get each key name. Keywords start at one.
-    char keyType;
-    char keyName[MAX_STRING_LENGTH];
-    char keyValue[MAX_STRING_LENGTH];
-    char keyComment[MAX_STRING_LENGTH];
-    psBool tempBool;
-    psBool success;
-    psBool stdKey;
     for (int i = 1; i <= numKeys; i++) {
-
+        char keyName[MAX_STRING_LENGTH];// Keyword name
+        char keyValue[MAX_STRING_LENGTH]; // Corresponding value
+        char keyComment[MAX_STRING_LENGTH]; // Corresponding comment
         fits_read_keyn(fits->fd, i, keyName, keyValue, keyComment, &status);
 
-        stdKey = false;
-
-        int stdKeyIdx = 0;
-        while (standardFitsKeys[stdKeyIdx] != NULL && ! stdKey) {
-            if (strcmp(keyName,standardFitsKeys[stdKeyIdx++]) == 0) {
-                stdKey = true;
-            }
-        }
-
+        // Check to see if the keyword should be ignored
+        bool ignoreKey = false;         // Ignore this keyword?
+        for (int i = 0; ignoreFitsKeys[i] && !ignoreKey; i++) {
+            if (strcmp(keyName, ignoreFitsKeys[i]) == 0) {
+                ignoreKey = true;
+            }
+        }
+        if (ignoreKey) {
+            // We're done here; skip to the next key
+            continue;
+        }
+
+        // Check to see if the keyword should be duplicated
+        int dupFlag = 0;                // Duplicate flag
+        for (int i = 0; duplicateFitsKeys[i] && !dupFlag; i++) {
+            if (strcmp(keyName, duplicateFitsKeys[i]) == 0) {
+                dupFlag = PS_META_DUPLICATE_OK;
+            }
+        }
+
+        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);
@@ -87,105 +95,70 @@
         }
 
-        if (! stdKey) {
-            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));
+        psBool success;                 // Was the add to the metadata successful?
+        switch (keyType) {
+        case 'X': // bit
+        case 'B': // byte
+            success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_S8 | dupFlag, keyComment,
+                                    atoi(keyValue));
+            break;
+        case 'I': // short int.
+            success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_S16 | dupFlag, keyComment,
+                                    (psS16)atoi(keyValue));
+            break;
+        case 'J': // int.
+            success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_S32 | dupFlag, keyComment,
+                                    atoi(keyValue));
+            break;
+        case 'U': // unsigned int.
+            success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_U32 | dupFlag, keyComment,
+                                    atol(keyValue));
+            break;
+
+        case 'K': // long int. can't all fit in a psS32, put in psF64
+        case 'F':
+            success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F64 | dupFlag, keyComment,
+                                    atof(keyValue));
+            break;
+        case 'C': {
+                char *keyValueFixed = keyValue; // Fixed version of the string
+                // remove the single-quotes at front/end
+                if (keyValueFixed[0] == '\'' && keyValueFixed[strlen(keyValue)-1] == '\'') {
+                    keyValue[strlen(keyValue)-1] = '\0'; // Remove the trailing quote
+                    keyValueFixed += 1; // Advance past the leading quote
+                }
+                // Remove trailing spaces, which are not significant, according to the FITS standard
+                // http://archive.stsci.edu/fits/fits_standard/node31.html
+                char *lastSpace = NULL; // The last space in the string
+                while (strlen(keyValueFixed) > 1 && (lastSpace = strrchr(keyValueFixed, ' ')) &&
+                        lastSpace[1] == '\0') {
+                    // This is a trailing space, not a leading space.
+                    lastSpace[0] = '\0'; // Truncate the string here
+                }
+
+                success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_STRING | dupFlag, keyComment,
+                                        keyValueFixed);
                 break;
-            case 'I': // short int.
-                success = psMetadataAdd(out,
-                                        PS_LIST_TAIL,
-                                        keyName,
-                                        PS_DATA_S16 | PS_META_DUPLICATE_OK,
-                                        keyComment,
-                                        (psS16)atoi(keyValue));
+            }
+        case 'L': {
+                bool temp = (keyValue[0] == 'T') ? 1 : 0;
+                success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_BOOL | dupFlag, keyComment, temp);
                 break;
-            case 'J': // int.
-                success = psMetadataAdd(out,
-                                        PS_LIST_TAIL,
-                                        keyName,
-                                        PS_DATA_S32 | PS_META_DUPLICATE_OK,
-                                        keyComment,
-                                        atoi(keyValue));
-                break;
-            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,
-                                        PS_LIST_TAIL,
-                                        keyName,
-                                        PS_DATA_F64 | PS_META_DUPLICATE_OK,
-                                        keyComment,
-                                        atof(keyValue));
-                break;
-            case 'C': {
-                    char *keyValueFixed = keyValue; // Fixed version of the string
-                    // remove the single-quotes at front/end
-                    if (keyValueFixed[0] == '\'' && keyValueFixed[strlen(keyValue)-1] == '\'') {
-                        keyValue[strlen(keyValue)-1] = '\0'; // Remove the trailing quote
-                        keyValueFixed += 1; // Advance past the leading quote
-                    }
-                    // Remove trailing spaces, which are not significant, according to the FITS standard
-                    // http://archive.stsci.edu/fits/fits_standard/node31.html
-                    char *lastSpace = NULL; // The last space in the string
-                    while (strlen(keyValueFixed) > 1 && (lastSpace = strrchr(keyValueFixed, ' ')) &&
-                            lastSpace[1] == '\0') {
-                        // This is a trailing space, not a leading space.
-                        lastSpace[0] = '\0'; // Truncate the string here
-                    }
-
-                    success = psMetadataAdd(out,
-                                            PS_LIST_TAIL,
-                                            keyName,
-                                            PS_DATA_STRING | PS_META_DUPLICATE_OK,
-                                            keyComment,
-                                            keyValueFixed);
-                    break;
-                }
-            case 'L':
-                tempBool = (keyValue[0] == 'T') ? 1 : 0;
-                success = psMetadataAdd(out,
-                                        PS_LIST_TAIL,
-                                        keyName,
-                                        PS_DATA_BOOL | PS_META_DUPLICATE_OK,
-                                        keyComment,
-                                        tempBool);
-                break;
-            default:
-                psError(PS_ERR_IO, true,
-                        PS_ERRORTEXT_psFits_METATYPE_INVALID,
-                        keyType);
-                return out;
-            }
-
-            if (!success) {
-                psError(PS_ERR_UNKNOWN, false,
-                        PS_ERRORTEXT_psFits_METADATA_ADD_FAILED,
-                        keyName);
-                return out;
-            }
-        }
-
-    }
-
-    if ( status != 0) {
+            }
+        default:
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psFits_METATYPE_INVALID, keyType);
+            return out;
+        }
+
+        if (!success) {
+            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psFits_METADATA_ADD_FAILED, keyName);
+            return out;
+        }
+
+    }
+
+    if (status != 0) {
         char fitsErr[MAX_STRING_LENGTH];
         (void)fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_IO, true,
-                PS_ERRORTEXT_psFits_METADATA_ADD_FAILED,
-                fitsErr);
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psFits_METADATA_ADD_FAILED, fitsErr);
         return false;
     }
@@ -197,6 +170,5 @@
 {
     if (fits == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true,
-                PS_ERRORTEXT_psFits_NULL);
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_NULL);
         psFree(out);
         return NULL;
