Index: /trunk/psLib/src/fits/psFitsHeader.c
===================================================================
--- /trunk/psLib/src/fits/psFitsHeader.c	(revision 7234)
+++ /trunk/psLib/src/fits/psFitsHeader.c	(revision 7235)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-05-27 02:01:23 $
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-05-27 02:09:18 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -218,19 +218,9 @@
 }
 
-
-bool psFitsWriteHeader(psFits *fits,     // The FITS file handle
-                       psMetadata *output // Metadata that is to be output into the FITS file
-                      )
+static bool fitsWriteHeader(psFits *fits, // The FITS file handle
+                            psMetadata *output, // Metadata that is to be output into the FITS file
+                            bool keyStarts // Write out the key starts?
+                           )
 {
-    if (!fits) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_NULL);
-        return false;
-    }
-
-    if (!output) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_METADATA_NULL);
-        return false;
-    }
-
     // Traverse the metadata list and add each key.
     psListIterator* iter = psListIteratorAlloc(output->list, PS_LIST_HEAD, true); // Iterator
@@ -249,13 +239,18 @@
             }
         }
-        // Also block out TTYPEn, NAXISn, etc --- keywords that start with a certain sequence
-        for (int i = 0; noWriteFitsKeyStarts[i] && writeKey; i++) {
-            if (strncmp(item->name, noWriteFitsKeyStarts[i], strlen(noWriteFitsKeyStarts[i])) == 0) {
-                writeKey = false;
-            }
-        }
-        if (!writeKey) {
-            // Don't write it; skip to the next key
-            continue;
+        if (keyStarts) {
+            // Also block out TTYPEn, NAXISn, etc --- keywords that start with a certain sequence.
+            // We want to do this when writing an image or table, since it guarantees that the NAXISn etc
+            // that go in are correct.  However, when we're writing a "blank" HDU (header only), we want to
+            // preserve NAXISn etc for reference, so we don't do this.
+            for (int i = 0; noWriteFitsKeyStarts[i] && writeKey; i++) {
+                if (strncmp(item->name, noWriteFitsKeyStarts[i], strlen(noWriteFitsKeyStarts[i])) == 0) {
+                    writeKey = false;
+                }
+            }
+            if (!writeKey) {
+                // Don't write it; skip to the next key
+                continue;
+            }
         }
 
@@ -312,7 +307,7 @@
 }
 
-bool psFitsWriteBlank(psFits* fits,
-                      psMetadata* output
-                     )
+bool psFitsWriteHeader(psFits *fits,
+                       psMetadata *output
+                      )
 {
     if (!fits) {
@@ -326,47 +321,62 @@
     }
 
-    // Create a dummy image HDU for the primary HDU
-    int status = 0;                 // Status of cfitsio
-    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;
-    }
-
-    return psFitsWriteHeader(fits, output);
-}
-
-bool psFitsHeaderValidate(psMetadata *header)
-{
-    if (header == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_METADATA_NULL);
-        return false;
-    }
-
-    // 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;
-        }
-
-        if (strlen(item->name) > 8) {
-            item->name[8] = '\0'; // truncate to 8 characters
-        }
-
-        fits_uppercase(item->name); // make uppercase
-
-        // now, let's see if CFITSIO thinks this is a good keyword...
-        int status = 0;                 // Status from cfitsio calls
-        if (fits_test_keyword(item->name,&status) != 0) {
-            valid = false;
-        }
-    }
-    psFree(iter);
-
-    return valid;
-}
+    return fitsWriteHeader(fits, output, true);
+
+
+    bool psFitsWriteBlank(psFits* fits,
+                          psMetadata* output
+                         ) {
+        if (!fits) {
+            psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_NULL);
+            return false;
+        }
+
+        if (!output) {
+            psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_METADATA_NULL);
+            return false;
+        }
+
+        // Create a dummy image HDU for the primary HDU
+        int status = 0;                 // Status of cfitsio
+        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;
+        }
+
+        return fitsWriteHeader(fits, output, false);
+    }
+
+    bool psFitsHeaderValidate(psMetadata *header) {
+        if (header == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psFits_METADATA_NULL);
+            return false;
+        }
+
+        // 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;
+            }
+
+            if (strlen(item->name) > 8) {
+                item->name[8] = '\0'; // truncate to 8 characters
+            }
+
+            fits_uppercase(item->name); // make uppercase
+
+            // now, let's see if CFITSIO thinks this is a good keyword...
+            int status = 0;                 // Status from cfitsio calls
+            if (fits_test_keyword(item->name,&status) != 0) {
+                valid = false;
+            }
+        }
+        psFree(iter);
+
+        return valid;
+    }
