Index: trunk/psLib/src/fits/psFitsHeader.c
===================================================================
--- trunk/psLib/src/fits/psFitsHeader.c	(revision 21027)
+++ trunk/psLib/src/fits/psFitsHeader.c	(revision 21028)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.50 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2008-12-17 20:00:30 $
+ *  @version $Revision: 1.51 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2008-12-17 20:23:02 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -341,6 +341,9 @@
                 break;
 
-              case 'K': // long int. can't all fit in a psS32, put in psF64
-              case 'F':
+              case 'K': // long long (64-bit) integer
+                success = psMetadataAddS64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
+                                           atoll(keyValue));
+                break;
+              case 'F': // float/double
                 success = psMetadataAddF64(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment,
                                            atof(keyValue));
@@ -370,5 +373,5 @@
                   break;
               }
-              case 'L': {
+              case 'L': {               // Logical (boolean)
                   bool temp = (keyValue[0] == 'T') ? 1 : 0;
                   success = psMetadataAddBool(header, PS_LIST_TAIL, keyNameTrans, dupFlag, keyComment, temp);
@@ -589,66 +592,80 @@
             // A regular FITS header
             switch (item->type) {
-            case PS_DATA_BOOL: {
-                    int value = item->data.B;
-                    fits_update_key(fits->fd, TLOGICAL, name, &value, item->comment, &status);
+              case PS_DATA_BOOL: {
+                  int value = item->data.B;
+                  fits_update_key(fits->fd, TLOGICAL, name, &value, item->comment, &status);
+                  break;
+              }
+              case PS_DATA_S8:
+                fits_update_key(fits->fd, TBYTE, name, &item->data.S8, item->comment, &status);
+                break;
+              case PS_DATA_S16:
+                fits_update_key(fits->fd, TSHORT, name, &item->data.S16, item->comment, &status);
+                break;
+              case PS_DATA_S32:
+                fits_update_key(fits->fd, TINT, name, &item->data.S32, item->comment, &status);
+                break;
+              case PS_DATA_S64:
+                fits_update_key(fits->fd, TLONGLONG, name, &item->data.S64, item->comment, &status);
+                break;
+              case PS_DATA_U8: {
+                  unsigned short int temp = item->data.U8;
+                  fits_update_key(fits->fd, TUSHORT, name, &temp, item->comment, &status);
+                  break;
+              }
+              case PS_DATA_U16:
+                fits_update_key(fits->fd, TUSHORT, name, &item->data.U16, item->comment, &status);
+                break;
+              case PS_DATA_U32:
+                fits_update_key(fits->fd, TUINT, name, &item->data.U32, item->comment, &status);
+                break;
+              case PS_DATA_U64:
+                // CFITSIO doesn't support unsigned 64-bit integers; attempt to write as signed
+                if (item->data.U64 > PS_MAX_S64) {
+                    psWarning("Unable to write 64-bit unsigned integer for item %s to header: "
+                              "value %" PRIu64 " out of range", name, item->data.U64);
                     break;
                 }
-            case PS_DATA_S8:
-                fits_update_key(fits->fd, TBYTE, name, &item->data.S8, item->comment, &status);
-                break;
-            case PS_DATA_S16:
-                fits_update_key(fits->fd, TSHORT, name, &item->data.S16, item->comment, &status);
-                break;
-            case PS_DATA_S32:
-                fits_update_key(fits->fd, TINT, 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, name, &temp, item->comment, &status);
-                }
-                break;
-            case PS_DATA_U16:
-                fits_update_key(fits->fd, TUSHORT, name, &item->data.U16, item->comment, &status);
-                break;
-            case PS_DATA_U32:
-                fits_update_key(fits->fd, TUINT, name, &item->data.U32, 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, name, "NaN", item->comment, &status);
-                    } else if ((infCheck = isinf(item->data.F32)) != 0) {
-                        if (infCheck == 1) {
-                            fits_update_key(fits->fd, TSTRING, name, "Inf", item->comment, &status);
-                        } else {
-                            fits_update_key(fits->fd, TSTRING, name, "-Inf", item->comment, &status);
-                        }
-                    } else {
-                        fits_update_key(fits->fd, TFLOAT, 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, name, "NaN", item->comment, &status);
-                    } else if ((infCheck = isinf(item->data.F64)) != 0) {
-                        if (infCheck == 1) {
-                            fits_update_key(fits->fd, TSTRING, name, "Inf", item->comment, &status);
-                        } else {
-                            fits_update_key(fits->fd, TSTRING, name, "-Inf", item->comment, &status);
-                        }
-                    } else {
-                        fits_update_key(fits->fd, TDOUBLE, name, &item->data.F64, item->comment,
-                                        &status);
-                    }
-                    break;
-                }
-            case PS_DATA_STRING:
+                psS64 temp = item->data.U64; // Signed version
+                fits_update_key(fits->fd, TLONGLONG, name, &temp, 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, name, "NaN", item->comment, &status);
+                  } else if ((infCheck = isinf(item->data.F32)) != 0) {
+                      if (infCheck == 1) {
+                          fits_update_key(fits->fd, TSTRING, name, "Inf", item->comment, &status);
+                      } else {
+                          fits_update_key(fits->fd, TSTRING, name, "-Inf", item->comment, &status);
+                      }
+                  } else {
+                      fits_update_key(fits->fd, TFLOAT, 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, name, "NaN", item->comment, &status);
+                  } else if ((infCheck = isinf(item->data.F64)) != 0) {
+                      if (infCheck == 1) {
+                          fits_update_key(fits->fd, TSTRING, name, "Inf", item->comment, &status);
+                      } else {
+                          fits_update_key(fits->fd, TSTRING, name, "-Inf", item->comment, &status);
+                      }
+                  } else {
+                      fits_update_key(fits->fd, TDOUBLE, name, &item->data.F64, item->comment,
+                                      &status);
+                  }
+                  break;
+              }
+              case PS_DATA_STRING:
                 fits_update_key(fits->fd, TSTRING, name, item->data.V, item->comment, &status);
                 break;
-            default:  // all other META types are ignored
-                psWarning("Attempt to write metadata type %x to FITS header ignored.\n", item->type);
+              default:  // all other META types are ignored
+                psWarning("Attempt to write metadata %s of type %x to FITS header ignored.\n",
+item->name, item->type);
                 break;
             }
