Index: trunk/psLib/src/fits/psFitsHeader.c
===================================================================
--- trunk/psLib/src/fits/psFitsHeader.c	(revision 15179)
+++ trunk/psLib/src/fits/psFitsHeader.c	(revision 15191)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.35 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-10-03 21:27:21 $
+ *  @version $Revision: 1.36 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-10-04 01:16:33 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -54,7 +54,30 @@
                                    NULL };
 
+// How to translate between keywords
+typedef struct {
+    const char *from;                   // Translate from this keyword
+    const char *to;                     // Translate to this keyword
+} keywordTranslation;
+
+// Translation for compressed image headers           FROM        TO
+static keywordTranslation compressTranslation[] = { { "ZSIMPLE",  "SIMPLE" },
+                                                    { "ZTENSION", "XTENSION" },
+                                                    { "ZBITPIX",  "BITPIX" },
+                                                    { "ZNAXIS",   "NAXIS"  },
+                                                    { "ZNAXIS1",  "NAXIS1" },
+                                                    { "ZNAXIS2",  "NAXIS2" },
+                                                    { "ZNAXIS3",  "NAXIS3" },
+                                                    { "ZEXTEND",  "EXTEND" },
+                                                    { "ZBLOCKED", "BLOCKED"},
+                                                    { "ZPCOUNT",  "PCOUNT" },
+                                                    { "ZGCOUNT",  "GCOUNT" },
+                                                    { "ZHECKSUM", "CHECKSUM"},
+                                                    { "ZDATASUM", "DATASUM" },
+                                                    { NULL,       NULL } };
+
+
 // Compare a keyword with a list of keywords; return true if it's in the list
 static bool keywordInList(const char *keyword, // Keyword to check
-                          const char **list // List of keywords
+                          const char *list[] // List of keywords
     )
 {
@@ -65,4 +88,21 @@
     }
     return false;
+}
+
+static const char *keywordTranslate(const char *keyword, // Keyword to check
+                                    keywordTranslation translation[] // Translation list
+                                    )
+{
+    for (keywordTranslation *trans = translation; (*trans).from; ++trans) {
+        if (strcmp(keyword, (*trans).from) == 0) {
+            // Translate it
+            return (*trans).to;
+        } else if (strcmp(keyword, (*trans).to) == 0) {
+            // Ignore it completely --- something else will translate to it
+            return NULL;
+        }
+    }
+    // It translates to itself
+    return keyword;
 }
 
@@ -179,4 +219,9 @@
     fits_get_hdrpos(fits->fd, &numKeys, &keyNum, &status);
 
+    bool compressed = false;            // Is this a compressed image?
+    if (fits->conventions.compression && fits_is_compressed_image(fits->fd, &status)) {
+        compressed = true;
+    }
+
     // Get each key name. Keywords start at one.
     for (int i = 1; i <= numKeys; i++) {
@@ -192,4 +237,13 @@
         }
 
+        const char *keyNameTrans = keyName;   // Translated name of keyword
+        if (compressed) {
+            keyNameTrans = keywordTranslate(keyName, compressTranslation);
+            if (!keyNameTrans) {
+                // It's to be ignored (it will be replaced by something else)
+                continue;
+            }
+        }
+
         // Check to see if the keyword should be duplicated
         int dupFlag = 0;                // Duplicate flag
@@ -212,5 +266,6 @@
         case 'X': // bit
         case 'B': // byte
-            success = psMetadataAddS8(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atoi(keyValue));
+            success = psMetadataAddS8(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                      atoi(keyValue));
             break;
         case 'I': // short int.
@@ -218,24 +273,29 @@
             // Trap NAN, INF and -INF, which cfitsio doesn't handle.
             if (strncasecmp(keyValue, "NAN", 3) == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, NAN);
+                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN);
             } else if (strncasecmp(keyValue, "INF", 3) == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, INFINITY);
+                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                           INFINITY);
             } else if (strncasecmp(keyValue, "-INF", 4) == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, -INFINITY);
+                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                           -INFINITY);
             } else {
-                success = psMetadataAddS32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment,
+                success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
                                            atoi(keyValue));
             }
             break;
         case 'J': // int.
-            success = psMetadataAddS32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atoi(keyValue));
+            success = psMetadataAddS32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                       atoi(keyValue));
             break;
         case 'U': // unsigned int.
-            success = psMetadataAddU32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, atol(keyValue));
+            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, keyName, dupFlag, keyComment, atof(keyValue));
+            success = psMetadataAddF64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                       atof(keyValue));
             break;
         case 'C': {
@@ -245,13 +305,17 @@
             // 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, keyName, dupFlag, keyComment, NAN);
+                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, NAN);
             } else if (strcasecmp(keyValueFixed, "INF") == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, INFINITY);
+                success = psMetadataAddF32(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                           INFINITY);
             } else if (strcasecmp(keyValueFixed, "-INF") == 0) {
-                success = psMetadataAddF32(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, -INFINITY);
-            } else if (!fits->conventions.compression ||
-                       (strcmp(keyName, "EXTNAME") != 0 || strcmp(keyValueFixed, "COMPRESSED_IMAGE") != 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 = psMetadataAddStr(header, PS_LIST_TAIL, keyName, dupFlag, keyComment,
+                success = true;
+            } else {
+                success = psMetadataAddStr(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
                                            keyValueFixed);
             }
@@ -260,5 +324,5 @@
         case 'L': {
             bool temp = (keyValue[0] == 'T') ? 1 : 0;
-            success = psMetadataAddBool(header, PS_LIST_TAIL, keyName, dupFlag, keyComment, temp);
+            success = psMetadataAddBool(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, temp);
             break;
         }
@@ -270,5 +334,6 @@
 
         if (!success) {
-            psError(PS_ERR_UNKNOWN, false, _("Failed to add metadata item, %s."), keyName);
+            psError(PS_ERR_UNKNOWN, false, _("Failed to add metadata item, %s --> %s."),
+                    keyName, keyNameTrans);
             psFree(header);
             return NULL;
@@ -278,7 +343,5 @@
 
     if (status != 0) {
-        char fitsErr[MAX_STRING_LENGTH];
-        (void)fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_IO, true, _("Failed to add metadata item, %s."), fitsErr);
+        psFitsError(status, true, _("Failed to add metadata item."));
         psFree(header);
         return false;
