Index: /trunk/psLib/src/fits/psFitsHeader.c
===================================================================
--- /trunk/psLib/src/fits/psFitsHeader.c	(revision 7223)
+++ /trunk/psLib/src/fits/psFitsHeader.c	(revision 7224)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-05-25 23:41:18 $
+ *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-05-26 00:48:20 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -33,4 +33,9 @@
 // List of FITS header keys that may be duplicated; NULL-terminated
 static char *duplicateFitsKeys[] = {"COMMENT", "HIERARCH", "HISTORY", "", NULL};
+
+// List of FITS header keys not to write (handled by cfitsio); NULL-terminated
+// XXX: Need to add table-related keywords here.
+static char *noWriteFitsKeys[] = {"SIMPLE", "BITPIX", "NAXIS", "NAXIS1", "NAXIS2", "NAXIS3", "EXTNAME",
+                                  "BSCALE", "BZERO", NULL};
 
 psMetadata* psFitsReadHeader(psMetadata* out,
@@ -216,115 +221,83 @@
 {
 
-    if (fits == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true,
-                PS_ERRORTEXT_psFits_NULL);
+    if (!fits) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_NULL);
         return false;
     }
 
-    if (output == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true,
-                PS_ERRORTEXT_psFits_METADATA_NULL);
+    if (!output) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_METADATA_NULL);
         return false;
     }
 
-    int status = 0;
-
-    // Add required header keywords
-    int chdu = psFitsGetExtNum(fits);
-    if (chdu == 0) {
-        psMetadataAddBool(output, PS_LIST_HEAD, "SIMPLE", PS_META_NO_REPLACE, "Simple FITS file?", true);
-    }
-    psMetadataAddS32(output, PS_LIST_HEAD + 1, "BITPIX", PS_META_NO_REPLACE, "Bits per pixel (default)", 16);
-    psMetadataAddS32(output, PS_LIST_HEAD + 2, "NAXIS", PS_META_NO_REPLACE, "Number of axes (default)", 0);
-
-    //transverse the metadata list and add each key.
-
-    psListIterator* iter = psListIteratorAlloc(output->list,PS_LIST_HEAD,true);
-    psMetadataItem* item;
-    while ( (item=psListGetAndIncrement(iter)) != NULL ) {
+    int status = 0;                     // Status of cfitsio calls
+
+    // Check to see if there are any extant HDUs
+    int hdus = psFitsGetSize(fits);     // Number of HDUs
+    if (hdus == 0) {
+        // Need to create a dummy image HDU for the primary HDU
+        fits_create_img(fits->fd, 16, 0, NULL, &status);
+        if (status) {
+            char fitsErr[MAX_STRING_LENGTH];
+            (void)fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_IO, true, "Unable to create primary header.\n%s\n", fitsErr);
+            return false;
+        }
+    }
+
+    // Traverse the metadata list and add each key.
+    psListIterator* iter = psListIteratorAlloc(output->list, PS_LIST_HEAD, true); // Iterator
+    psMetadataItem* item;               // Item from iteration
+    while ((item = psListGetAndIncrement(iter))) {
+        // Check to see if the item should be ignored
+        // We ignore particular (required) keywords, because these are written by CFITSIO
+        // Furthermore, users tend to supply FITS headers that are wrong (e.g., after binning down the
+        // image, the NAXISn haven't been changed; or after converting to F32, the BITPIX hasn't been changed)
+        // so we'll take care of that for them.
+        bool writeKey = true;           // Should we write this keyword?
+        for (int i = 0; noWriteFitsKeys[i] && writeKey; i++) {
+            if (strcmp(item->name, noWriteFitsKeys[i]) == 0) {
+                writeKey = false;
+            }
+        }
+        if (!writeKey) {
+            // Don't write it; skip to the next key
+            continue;
+        }
+
         switch (item->type) {
         case PS_DATA_BOOL: {
                 int value = item->data.B;
-                fits_update_key(fits->fd,
-                                TLOGICAL,
-                                item->name,
-                                &value,
-                                item->comment,
-                                &status);
+                fits_update_key(fits->fd, TLOGICAL, item->name, &value, item->comment, &status);
                 break;
             }
         case PS_DATA_S8:
-            fits_update_key(fits->fd,
-                            TBYTE,
-                            item->name,
-                            &item->data.S8,
-                            item->comment,
-                            &status);
+            fits_update_key(fits->fd, TBYTE, item->name, &item->data.S8, item->comment, &status);
             break;
         case PS_DATA_S16:
-            fits_update_key(fits->fd,
-                            TSHORT,
-                            item->name,
-                            &item->data.S16,
-                            item->comment,
-                            &status);
+            fits_update_key(fits->fd, TSHORT, item->name, &item->data.S16, item->comment, &status);
             break;
         case PS_DATA_S32:
-            fits_update_key(fits->fd,
-                            TINT,
-                            item->name,
-                            &item->data.S32,
-                            item->comment,
-                            &status);
+            fits_update_key(fits->fd, TINT, item->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,
-                                item->name,
-                                &temp,
-                                item->comment,
-                                &status);
+                fits_update_key(fits->fd, TUSHORT, item->name, &temp, item->comment, &status);
             }
             break;
         case PS_DATA_U16:
-            fits_update_key(fits->fd,
-                            TUSHORT,
-                            item->name,
-                            &item->data.U16,
-                            item->comment,
-                            &status);
+            fits_update_key(fits->fd, TUSHORT, item->name, &item->data.U16, item->comment, &status);
             break;
         case PS_DATA_U32:
-            fits_update_key(fits->fd,
-                            TUINT,
-                            item->name,
-                            &item->data.U32,
-                            item->comment,
-                            &status);
+            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);
+            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);
+            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);
+            fits_update_key(fits->fd, TSTRING, item->name, item->data.V, item->comment, &status);
             break;
         default:  // all other META types are ignored
@@ -332,10 +305,8 @@
         }
 
-        if ( status != 0) {
+        if (status != 0) {
             char fitsErr[MAX_STRING_LENGTH];
             (void)fits_get_errstatus(status, fitsErr);
-            psError(PS_ERR_IO, true,
-                    PS_ERRORTEXT_psFits_WRITE_FAILED,
-                    fitsErr);
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psFits_WRITE_FAILED, fitsErr);
             return false;
         }
@@ -349,21 +320,15 @@
 bool psFitsHeaderValidate(psMetadata *header)
 {
-    bool valid = true;
-    int status;
-
     if (header == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true,
-                PS_ERRORTEXT_psFits_METADATA_NULL);
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_METADATA_NULL);
         return false;
     }
 
-    //transverse the metadata list and inspect at each key
-
-    psListIterator* iter = psListIteratorAlloc(header->list,PS_LIST_HEAD,true);
-    psMetadataItem* item;
-    while ( (item=psListGetAndIncrement(iter)) != NULL ) {
-        psDataType type = item->type;
-
-        if (type > PS_DATA_STRING) { // i.e., a non-primitive type
+    // Traverse the metadata list and inspect at each key
+    psListIterator* iter = psListIteratorAlloc(header->list, PS_LIST_HEAD, true); // Iterator
+    psMetadataItem* item;               // Item from iteration
+    bool valid = true;                  // Are all items valid?
+    while ((item = psListGetAndIncrement(iter))) {
+        if (item->type > PS_DATA_STRING) { // i.e., a non-primitive type
             valid = false;
         }
@@ -376,10 +341,9 @@
 
         // now, let's see if CFITSIO thinks this is a good keyword...
-        status = 0;
+        int status = 0;                 // Status from cfitsio calls
         if (fits_test_keyword(item->name,&status) != 0) {
             valid = false;
         }
     }
-
     psFree(iter);
 
Index: /trunk/psLib/src/fits/psFitsImage.c
===================================================================
--- /trunk/psLib/src/fits/psFitsImage.c	(revision 7223)
+++ /trunk/psLib/src/fits/psFitsImage.c	(revision 7224)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-05-22 22:38:27 $
+ *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-05-26 00:48:20 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -331,6 +331,6 @@
     }
 
-    int chdu = psFitsGetExtNum(fits);
-    int hdus = psFitsGetSize(fits);
+    int chdu = psFitsGetExtNum(fits);   // Current HDU number
+    int hdus = psFitsGetSize(fits);     // Number of HDUs in file
     if (! after) {
         if (chdu == 0) {
@@ -346,5 +346,4 @@
         status = 0;
         fits_create_img(fits->fd, bitPix, naxis, naxes, &status);
-
     } else {
         fits_insert_img(fits->fd, bitPix, naxis, naxes, &status);
@@ -363,23 +362,6 @@
 
     if (header) {
-        // Update header with BITPIX, NAXIS[12], BSCALE, BZERO so we don't clobber the basic header
-        psMetadataAddS32(header, PS_LIST_TAIL, "BITPIX", PS_META_REPLACE, "Bits per pixel", bitPix);
-        psMetadataAddS32(header, PS_LIST_TAIL, "NAXIS",  PS_META_REPLACE, "Number of dimensions", naxis);
-        psMetadataAddS32(header, PS_LIST_TAIL, "NAXIS1", PS_META_REPLACE, "Number of columns", numCols);
-        psMetadataAddS32(header, PS_LIST_TAIL, "NAXIS2", PS_META_REPLACE, "Number of rows", numRows);
-        psMetadataAddF64(header, PS_LIST_TAIL, "BSCALE", PS_META_REPLACE, "Pixel value scale", 1.0);
-        psMetadataAddF64(header, PS_LIST_TAIL, "BZERO",  PS_META_REPLACE, "Pixel value offset", bZero);
-        if (extname && strlen(extname) > 0) {
-            psMetadataAddStr(header, PS_LIST_TAIL, "EXTNAME", PS_META_REPLACE, "Extenion Name", extname);
-        }
         psFitsWriteHeader(header, fits);
-    } else {
-        // Write the necessary headers manually
-        fits_write_key_dbl(fits->fd, "BZERO", bZero, 12, "Pixel Value Offset", &status);
-        fits_write_key_dbl(fits->fd, "BSCALE", 1.0, 12, "Pixel Value Scale", &status);
-        // Regrettably have to cast away "const" on extname, because CFITSIO is horrible
-        fits_write_key_str(fits->fd, "EXTNAME", (char *)extname, "Extension name", &status);
-    }
-
+    }
     if (input->parent == NULL) { // if no parent, assume that the image data is contiguous
         fits_write_img(fits->fd,
@@ -402,5 +384,5 @@
     }
 
-    if ( status != 0) {
+    if (status != 0) {
         char fitsErr[MAX_STRING_LENGTH];
         (void)fits_get_errstatus(status, fitsErr);
