Index: /trunk/psLib/src/fits/psFitsHeader.c
===================================================================
--- /trunk/psLib/src/fits/psFitsHeader.c	(revision 7245)
+++ /trunk/psLib/src/fits/psFitsHeader.c	(revision 7246)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.16 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-05-30 22:11:51 $
+ *  @version $Revision: 1.17 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-05-30 22:44:37 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -112,11 +112,11 @@
             // 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) {
+            if (strncasecmp(keyValue, "NAN", 3) == 0) {
                 success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
                                         (psF32)NAN);
-            } else if (strncasecmp(keyValue, "inf", 3) == 0) {
+            } else if (strncasecmp(keyValue, "INF", 3) == 0) {
                 success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
                                         (psF32)INFINITY);
-            } else if (strncasecmp(keyValue, "-inf", 4) == 0) {
+            } else if (strncasecmp(keyValue, "-INF", 4) == 0) {
                 success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
                                         (psF32)-INFINITY);
@@ -156,6 +156,19 @@
                 }
 
-                success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_STRING | dupFlag, keyComment,
-                                        keyValueFixed);
+                // 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 = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
+                                            (psF32)NAN);
+                } else if (strcasecmp(keyValueFixed, "INF") == 0) {
+                    success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
+                                            (psF32)INFINITY);
+                } else if (strcasecmp(keyValueFixed, "-INF") == 0) {
+                    success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_F32 | dupFlag, keyComment,
+                                            (psF32)-INFINITY);
+                } else {
+                    success = psMetadataAdd(out, PS_LIST_TAIL, keyName, PS_DATA_STRING | dupFlag, keyComment,
+                                            keyValueFixed);
+                }
                 break;
             }
@@ -295,10 +308,34 @@
             fits_update_key(fits->fd, TUINT, item->name, &item->data.U32, item->comment, &status);
             break;
-        case PS_DATA_F32:
-            fits_update_key(fits->fd, TFLOAT, item->name, &item->data.F32, item->comment, &status);
-            break;
-        case PS_DATA_F64:
-            fits_update_key(fits->fd, TDOUBLE, item->name, &item->data.F64, item->comment, &status);
-            break;
+        case PS_DATA_F32: {
+                int infCheck = 0;         // Result of isinf()
+                if (isnan(item->data.F32)) {
+                    fits_update_key(fits->fd, TSTRING, item->name, "NaN", item->comment, &status);
+                } else if ((infCheck = isinf(item->data.F32)) != 0) {
+                    if (infCheck == 1) {
+                        fits_update_key(fits->fd, TSTRING, item->name, "Inf", item->comment, &status);
+                    } else {
+                        fits_update_key(fits->fd, TSTRING, item->name, "-Inf", item->comment, &status);
+                    }
+                } else {
+                    fits_update_key(fits->fd, TFLOAT, item->name, &item->data.F32, item->comment, &status);
+                }
+                break;
+            }
+        case PS_DATA_F64: {
+                int infCheck = 0;         // Result of isinf()
+                if (isnan(item->data.F64)) {
+                    fits_update_key(fits->fd, TSTRING, item->name, "NaN", item->comment, &status);
+                } else if ((infCheck = isinf(item->data.F64)) != 0) {
+                    if (infCheck == 1) {
+                        fits_update_key(fits->fd, TSTRING, item->name, "Inf", item->comment, &status);
+                    } else {
+                        fits_update_key(fits->fd, TSTRING, item->name, "-Inf", item->comment, &status);
+                    }
+                } else {
+                    fits_update_key(fits->fd, TDOUBLE, item->name, &item->data.F64, item->comment, &status);
+                }
+                break;
+            }
         case PS_DATA_STRING:
             fits_update_key(fits->fd, TSTRING, item->name, item->data.V, item->comment, &status);
