Index: /trunk/psLib/src/fits/psFits.c
===================================================================
--- /trunk/psLib/src/fits/psFits.c	(revision 19034)
+++ /trunk/psLib/src/fits/psFits.c	(revision 19035)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.80 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2008-05-13 22:03:21 $
+ *  @version $Revision: 1.81 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2008-08-12 22:54:53 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -19,4 +19,5 @@
 #include <unistd.h>
 #include <string.h>
+#include <errno.h>
 
 #include "psFits.h"
@@ -36,4 +37,39 @@
 static char *defaultExtword = "EXTNAME";
 
+bool p_psFitsDumpErrors (const char* filename, unsigned int lineno, const char* func, 
+			 psErrorCode code, const char *message, ...) {
+
+    char fitsErr[MAX_STRING_LENGTH];
+
+    va_list ap;
+    va_start(ap, message);
+    p_psErrorV (filename, lineno, func, PS_ERR_BAD_FITS, true, message, ap);
+    va_end(ap);
+
+    while (fits_read_errmsg(fitsErr)) {
+	p_psError(filename, lineno, func, PS_ERR_BAD_FITS, false, "CFITSIO error: %s", fitsErr);
+    }
+
+    return true;
+}
+
+psErrorCode p_psFitsError(const char* filename, unsigned int lineno, const char* func, 
+			  int status, bool new, const char *errorMsg, ...)
+{
+    char fitsErr[MAX_STRING_LENGTH];
+
+    if (status == 0) return PS_ERR_NONE;
+
+    va_list ap;                         // Variable arguments
+    va_start(ap, errorMsg);
+    psErrorV (PS_ERR_IO, new, errorMsg, ap);
+    va_end(ap);
+
+    while (fits_read_errmsg(fitsErr)) {
+	psError(PS_ERR_IO, false, "[CFITSIO error: %s]", fitsErr);
+    }
+    return PS_ERR_IO;
+}
+
 static bool isHDUEmpty(const psFits* fits)
 {
@@ -60,9 +96,5 @@
     if (fits != NULL) {
         if (fits_close_file(fits->fd, &status)) {
-            char fitsErr[MAX_STRING_LENGTH];
-            fits_get_errstatus(status, fitsErr);
-            psError(PS_ERR_BAD_FITS, true,
-                    "Error while closing psFits object. CFITSIO error: %s",
-                    fitsErr);
+	    psFitsDumpErrors (PS_ERR_IO, "Error while closing psFits object");
             return false;
         }
@@ -125,6 +157,22 @@
         if (access(name, F_OK) == 0) {
             // file exists, delete old one first
-            remove(name);
-        }
+            if (remove(name)) {
+		int thisErrno = errno;
+		char errorBuf[64], *errorMsg;
+# if ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE)
+		errorMsg = strerror_r (errno, errorBuf, 64);
+# else
+		strerror_r (errno, errorBuf, 64);
+		errorMsg = errorBuf;		
+# endif
+		psError (PS_ERR_IO, true, "Failed to delete a previously-existing file: %s", errorMsg);
+		fprintf (stderr, "errno: %d, %s, %s : %lx, %lx\n", thisErrno, errorMsg, errorBuf, (long int) errorMsg, (long int) errorBuf);
+		return NULL;
+	    }
+        }
+        if (!access(name, F_OK)) {
+	    psError (PS_ERR_IO, true, "deleted file still exists!");
+	    return NULL;
+	}
 
         #if ( CFITSIO_DISKFILE == 1 )
@@ -135,9 +183,5 @@
         (&fptr, name, &status);
         if (fptr == NULL || status != 0) {
-            char fitsErr[MAX_STRING_LENGTH];
-            fits_get_errstatus(status, fitsErr);
-            psError(PS_ERR_IO, true,
-                    _("Could not create file,'%s'. CFITSIO Error: %s"),
-                    name, fitsErr);
+	    psFitsDumpErrors (PS_ERR_IO, _("Could not create file,'%s'"), name);
             return NULL;
         }
@@ -150,9 +194,5 @@
         (&fptr, name, iomode, &status);
         if (fptr == NULL || status != 0) {
-            char fitsErr[MAX_STRING_LENGTH];
-            fits_get_errstatus(status, fitsErr);
-            psError(PS_ERR_IO, true,
-                    _("Could not open file,'%s'. CFITSIO Error: %s"),
-                    name, fitsErr);
+	    psFitsDumpErrors(PS_ERR_IO, _("Could not open file,'%s'"), name);
             return NULL;
         }
@@ -203,27 +243,4 @@
 }
 
-psErrorCode p_psFitsError(const char* filename, unsigned int lineno, const char* func, int status,
-                          bool new, const char *errorMsg, ...)
-{
-    if (status == 0) {
-        return PS_ERR_NONE;
-    }
-
-    va_list ap;                         // Variable arguments
-    va_start(ap, errorMsg);
-    psString msg = NULL;                // Message to pass to psError
-    psStringAppendV(&msg, errorMsg, ap);
-    va_end(ap);
-
-    char cfitsioMsg[MAX_STRING_LENGTH];   // Error message from cfitsio
-    (void)fits_get_errstatus(status, cfitsioMsg);
-
-    psStringAppend(&msg, "[CFITSIO error: %s]", cfitsioMsg);
-
-    psErrorCode code = p_psError(filename, lineno, func, PS_ERR_IO, new, msg); // Error code
-    psFree(msg);
-    return code;
-}
-
 static void psFitsCompressionFree(psFitsCompression *comp)
 {
@@ -354,9 +371,5 @@
         fits_movrel_hdu(fits->fd, extnum, &hdutype, &status);
         if (status != 0) {
-            char fitsErr[MAX_STRING_LENGTH];
-            fits_get_errstatus(status, fitsErr);
-            psError(PS_ERR_LOCATION_INVALID, true,
-                    _("Could not move %d HDUs from current position. CFITSIO Error: %s"),
-                    extnum, fitsErr);
+	    psFitsDumpErrors (PS_ERR_LOCATION_INVALID, _("Could not move %d HDUs from current position"), extnum);
             return false;
         }
@@ -364,9 +377,5 @@
         fits_movabs_hdu(fits->fd, extnum+1, &hdutype, &status);
         if (status != 0) {
-            char fitsErr[MAX_STRING_LENGTH];
-            fits_get_errstatus(status, fitsErr);
-            psError(PS_ERR_LOCATION_INVALID, true,
-                    _("Could not move to specified HDU #%d. CFITSIO Error: %s"),
-                    extnum, fitsErr);
+	    psFitsDumpErrors (PS_ERR_LOCATION_INVALID, _("Could not move to specified HDU #%d."), extnum);
             return false;
         }
@@ -423,7 +432,5 @@
 
     if (fits_update_key_str(fits->fd, extword, (char*)name, NULL, &status) != 0) {
-        char fitsErr[MAX_STRING_LENGTH];
-        (void)fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_IO, true, _("Could not write data to file. CFITSIO Error: %s"), fitsErr);
+	psFitsDumpErrors (PS_ERR_IO, _("Could not write data to file %s"), name);
         return false;
     }
@@ -449,7 +456,5 @@
     // OK, now let's delete the HDU
     if (fits_delete_hdu(fits->fd, NULL, &status) != 0) {
-        char fitsErr[MAX_STRING_LENGTH];
-        (void)fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_IO, true, _("Could not write data to file. CFITSIO Error: %s"), fitsErr);
+        psFitsDumpErrors(PS_ERR_IO, _("Could not write data to file extnum %d"), extnum);
         return false;
     }
@@ -478,9 +483,5 @@
     // OK, now let's delete the HDU
     if (fits_delete_hdu(fits->fd, NULL, &status) != 0) {
-        char fitsErr[MAX_STRING_LENGTH];
-        (void)fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_IO, true,
-                _("Could not write data to file. CFITSIO Error: %s"),
-                fitsErr);
+        psFitsDumpErrors(PS_ERR_IO, _("Could not write data to file extname %s"), extname);
         return false;
     }
@@ -497,9 +498,5 @@
 
     if (fits_get_num_hdus(fits->fd, &num, &status) != 0) {
-        char fitsErr[MAX_STRING_LENGTH];
-        fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_LOCATION_INVALID, true,
-                _("Failed to determine the number of HDUs. CFITSIO Error: %s"),
-                fitsErr);
+        psFitsDumpErrors(PS_ERR_LOCATION_INVALID, _("Failed to determine the number of HDUs"));
         return 0;
     }
@@ -516,9 +513,5 @@
 
     if (fits_get_hdu_type(fits->fd, &hdutype, &status) != 0) {
-        char fitsErr[MAX_STRING_LENGTH];
-        fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_LOCATION_INVALID, true,
-                _("Failed to determine an HDU type. CFITSIO Error: %s"),
-                fitsErr);
+        psFitsDumpErrors(PS_ERR_LOCATION_INVALID, _("Failed to determine an HDU type"));
         return PS_FITS_TYPE_NONE;
     }
@@ -595,8 +588,5 @@
     int status = 0;
     if (fits_set_compression_type(fits->fd, comptype, &status)) {
-        char fitsErr[MAX_STRING_LENGTH];
-        fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_BAD_FITS, true,
-            "Error while configuring compression. CFITSIO error: %s", fitsErr);
+        psFitsDumpErrors(PS_ERR_BAD_FITS, "Error while configuring compression");
         return false;
     }
@@ -624,8 +614,5 @@
     if (status) {
         fits_set_compression_type(fits->fd, 0x0, &status);
-        char fitsErr[MAX_STRING_LENGTH];
-        fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_BAD_FITS, true,
-            "Error while configuring compression. CFITSIO error: %s", fitsErr);
+        psFitsDumpErrors(PS_ERR_BAD_FITS, "Error while configuring compression");
         return false;
     }
@@ -636,8 +623,5 @@
         if (fits_set_noise_bits(fits->fd, noisebits, &status)) {
             fits_set_compression_type(fits->fd, 0x0, &status);
-            char fitsErr[MAX_STRING_LENGTH];
-            fits_get_errstatus(status, fitsErr);
-            psError(PS_ERR_BAD_FITS, true,
-                    "Error while configuring compression. CFITSIO error: %s", fitsErr);
+            psFitsDumpErrors(PS_ERR_BAD_FITS, "Error while configuring compression");
             return false;
         }
@@ -647,16 +631,10 @@
     if (fits_set_hcomp_scale(fits->fd, scale, &status)) {
         fits_set_compression_type(fits->fd, 0x0, &status);
-        char fitsErr[MAX_STRING_LENGTH];
-        fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_BAD_FITS, true,
-            "Error while configuring compression. CFITSIO error: %s", fitsErr);
+        psError(PS_ERR_BAD_FITS, status, "Error while configuring compression");
         return false;
     }
     if (fits_set_hcomp_smooth(fits->fd, smooth, &status)) {
         fits_set_compression_type(fits->fd, 0x0, &status);
-        char fitsErr[MAX_STRING_LENGTH];
-        fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_BAD_FITS, true,
-            "Error while configuring compression. CFITSIO error: %s", fitsErr);
+        psError(PS_ERR_BAD_FITS, status, "Error while configuring compression");
         return false;
     }
Index: /trunk/psLib/src/fits/psFits.h
===================================================================
--- /trunk/psLib/src/fits/psFits.h	(revision 19034)
+++ /trunk/psLib/src/fits/psFits.h	(revision 19035)
@@ -4,6 +4,6 @@
  * @author Robert DeSonia, MHPCC
  *
- * @version $Revision: 1.36 $ $Name: not supported by cvs2svn $
- * @date $Date: 2008-01-23 03:08:03 $
+ * @version $Revision: 1.37 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2008-08-12 22:54:53 $
  * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
  */
@@ -130,4 +130,25 @@
 #endif // ifdef DOXYGEN
 
+/// dump the full CFITSIO error stack
+#ifdef DOXYGEN
+bool psFitsDumpErrors(
+    psErrorCode code,                   ///< psLib code to use
+    const char *message,                ///< printf-style format of header line
+    ...                                 ///< any parameters required in format
+    );
+#else // ifdef DOXYGEN
+bool p_psFitsDumpErrors(
+    const char* filename,               ///< file name
+    unsigned int lineno,                ///< line number in file
+    const char* func,                   ///< function name
+    psErrorCode code,                   ///< psLib code to use
+    const char *message,                ///< printf-style format of header line
+    ...                                 ///< any parameters required in format
+    ) PS_ATTR_FORMAT(printf, 5, 6);
+#ifndef SWIG
+#define psFitsDumpErrors(CODE,...) \
+        p_psFitsDumpErrors(__FILE__,__LINE__,__func__,CODE,__VA_ARGS__)
+#endif // ifndef SWIG
+#endif // ifdef DOXYGEN
 
 /** Creates a new FITS options struct
