Index: trunk/psLib/src/dataManip/psMatrix.c
===================================================================
--- trunk/psLib/src/dataManip/psMatrix.c	(revision 3290)
+++ trunk/psLib/src/dataManip/psMatrix.c	(revision 3313)
@@ -21,6 +21,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-02-19 00:30:07 $
+ *  @version $Revision: 1.25 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-24 00:19:51 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -50,28 +50,28 @@
 
 /** Preprocessor macro to generate error for image dimensionality not set to PS_DIMEN_IMAGE */
-#define PS_CHECK_DIMEN_AND_TYPE(NAME, PS_DIMEN, RETURN)                                             \
+#define PS_CHECK_DIMEN_AND_TYPE(NAME, PS_DIMEN, CLEANUP)                                             \
 if (NAME->type.dimen != PS_DIMEN) {                                                                 \
     psError(PS_ERR_BAD_PARAMETER_TYPE, true,                                                        \
             "Invalid operation. %s has incorrect dimensionality %d.", #NAME, PS_DIMEN);             \
-    return RETURN;                                                                                  \
+    CLEANUP;                                                                                  \
 } else if(NAME->type.type!=PS_TYPE_F64 && NAME->type.type!=PS_TYPE_F32) {                           \
     psError(PS_ERR_BAD_PARAMETER_TYPE, true,                                                        \
             "Invalid operation. %s not PS_TYPE_F64.", #NAME);                                       \
-    return RETURN;                                                                                  \
+    CLEANUP;                                                                                  \
 }
 
 /** Preprocessor macro to check that input is not equal to output */
-#define PS_CHECK_POINTERS(NAME1, NAME2, RETURN)                                                     \
+#define PS_CHECK_POINTERS(NAME1, NAME2, CLEANUP)                                                     \
 if (NAME1 == NAME2) {                                                                               \
     psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                       \
             "Invalid operation: Pointer to %s is same as %s.", #NAME1, #NAME2);                     \
-    return RETURN;                                                                                  \
+    CLEANUP;                                                                                  \
 }
 
 /** Preprocessor macro to check that an image is square */
-#define PS_CHECK_SQUARE(NAME, RETURN)                                                               \
+#define PS_CHECK_SQUARE(NAME, CLEANUP)                                                               \
 if (NAME->numCols != NAME->numRows) {                                                               \
     psError(PS_ERR_BAD_PARAMETER_SIZE, true, "Invalid operation: %s not square array.", #NAME);     \
-    return RETURN;                                                                                  \
+    CLEANUP;                                                                                  \
 }
 
@@ -189,12 +189,12 @@
     // Error checks
     PS_IMAGE_CHECK_NULL_GENERAL(inImage, psMatrixLUD_EXIT);
-    PS_CHECK_POINTERS(inImage, outImage, outImage);
-    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outImage);
+    PS_CHECK_POINTERS(inImage, outImage, psMatrixLUD_EXIT);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, psMatrixLUD_EXIT);
     PS_PTR_CHECK_NULL_GENERAL(outPerm, psMatrixLUD_EXIT);
 
     outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
 
-    PS_CHECK_SQUARE(inImage, outImage);
-    PS_CHECK_SQUARE(outImage, outImage);
+    PS_CHECK_SQUARE(inImage, psMatrixLUD_EXIT);
+    PS_CHECK_SQUARE(outImage, psMatrixLUD_EXIT);
 
     // Initialize data
@@ -244,17 +244,19 @@
     gsl_vector *x = NULL;
 
-    // Error checks
-    PS_CHECK_POINTERS(outVector, inVector, outVector);
-    PS_CHECK_POINTERS(inVector, inPerm, outVector);
-    PS_CHECK_POINTERS(outVector, inPerm, outVector);
-    PS_IMAGE_CHECK_NULL(inImage, outVector);
-    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outVector);
-    PS_IMAGE_CHECK_EMPTY(inImage, outVector);
-    PS_VECTOR_CHECK_NULL(outVector, outVector);
-    PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_VECTOR, outVector);
-    PS_VECTOR_CHECK_NULL(inVector, outVector);
-    PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, outVector);
-    PS_VECTOR_CHECK_NULL(inPerm, outVector);
-    psVectorRecycle(outVector, inImage->numRows, inImage->type.type);
+    #define LUSOLVE_CLEANUP {psFree(outVector); return NULL;}
+
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, LUSOLVE_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, LUSOLVE_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, LUSOLVE_CLEANUP);
+    PS_VECTOR_CHECK_NULL_GENERAL(inVector, LUSOLVE_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, LUSOLVE_CLEANUP);
+    PS_VECTOR_CHECK_NULL_GENERAL(inPerm, LUSOLVE_CLEANUP);
+
+    outVector = psVectorRecycle(outVector, inImage->numRows, inImage->type.type);
+
+    PS_CHECK_POINTERS(outVector, inVector, LUSOLVE_CLEANUP);
+    PS_CHECK_POINTERS(inVector, inPerm, LUSOLVE_CLEANUP);
+    PS_CHECK_POINTERS(outVector, inPerm, LUSOLVE_CLEANUP);
 
     // Initialize data
@@ -296,13 +298,16 @@
     gsl_permutation *perm = NULL;
 
-    // Error checks
-    PS_PTR_CHECK_NULL(det, outImage);
-    PS_CHECK_POINTERS(inImage, outImage, outImage);
-    PS_IMAGE_CHECK_NULL(inImage, outImage);
-    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outImage);
-    PS_IMAGE_CHECK_EMPTY(inImage, outImage);
+    #define INVERT_CLEANUP { psFree(outImage); return NULL; }
+    // Error checks
+    PS_PTR_CHECK_NULL_GENERAL(det, INVERT_CLEANUP);
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, INVERT_CLEANUP);
+    PS_CHECK_POINTERS(inImage, outImage, INVERT_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, INVERT_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, INVERT_CLEANUP);
+
     outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
-    PS_CHECK_SQUARE(inImage, outImage);
-    PS_CHECK_SQUARE(outImage, outImage);
+
+    PS_CHECK_SQUARE(inImage, INVERT_CLEANUP);
+    PS_CHECK_SQUARE(outImage, INVERT_CLEANUP);
 
     // Initialize data
@@ -341,9 +346,10 @@
     gsl_permutation *perm = NULL;
 
-    // Error checks
-    PS_IMAGE_CHECK_NULL(inImage, NULL);
-    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, NULL);
-    PS_IMAGE_CHECK_EMPTY(inImage, NULL);
-    PS_CHECK_SQUARE(inImage, 0);
+    #define DETERMINANT_EXIT { return NULL; }
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, DETERMINANT_EXIT);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, DETERMINANT_EXIT);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, DETERMINANT_EXIT);
+    PS_CHECK_SQUARE(inImage, DETERMINANT_EXIT);
 
     // Initialize data
@@ -376,20 +382,21 @@
     gsl_matrix *m3 = NULL;
 
-    // Error checks
-    PS_CHECK_POINTERS(inImage1, outImage, outImage);
-    PS_CHECK_POINTERS(inImage1, inImage2, outImage);
-    PS_IMAGE_CHECK_NULL(inImage1, outImage);
-    PS_CHECK_DIMEN_AND_TYPE(inImage1, PS_DIMEN_IMAGE, outImage);
-    PS_IMAGE_CHECK_EMPTY(inImage1, outImage);
-    PS_IMAGE_CHECK_NULL(inImage2, outImage);
-    PS_CHECK_DIMEN_AND_TYPE(inImage2, PS_DIMEN_IMAGE, outImage);
-    PS_IMAGE_CHECK_EMPTY(inImage2, outImage);
-    PS_CHECK_DIMEN_AND_TYPE(inImage1, PS_DIMEN_IMAGE, outImage);
+    #define MULTIPLY_CLEANUP { psFree(outImage); return NULL; }
+
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage1, MULTIPLY_CLEANUP);
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage2, MULTIPLY_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage1, MULTIPLY_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage2, MULTIPLY_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage1, PS_DIMEN_IMAGE, MULTIPLY_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage2, PS_DIMEN_IMAGE, MULTIPLY_CLEANUP);
+    PS_CHECK_POINTERS(inImage1, outImage, MULTIPLY_CLEANUP);
+    PS_CHECK_POINTERS(inImage1, inImage2, MULTIPLY_CLEANUP);
 
     outImage = psImageRecycle(outImage, inImage2->numCols, inImage2->numRows, inImage2->type.type);
 
-    PS_CHECK_SQUARE(inImage1, outImage);
-    PS_CHECK_SQUARE(inImage2, outImage);
-    PS_CHECK_SQUARE(outImage, outImage);
+    PS_CHECK_SQUARE(inImage1, MULTIPLY_CLEANUP);
+    PS_CHECK_SQUARE(inImage2, MULTIPLY_CLEANUP);
+    PS_CHECK_SQUARE(outImage, MULTIPLY_CLEANUP);
 
     // Initialize data
@@ -428,10 +435,11 @@
     psS32 numColsOut = 0;
 
-
-    // Error checks
-    PS_CHECK_POINTERS(inImage, outImage, outImage);
-    PS_IMAGE_CHECK_NULL(inImage, outImage);
-    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outImage);
-    PS_IMAGE_CHECK_EMPTY(inImage, outImage);
+    #define TRANSPOSE_CLEANUP { psFree(outImage); return NULL; }
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, TRANSPOSE_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, TRANSPOSE_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, TRANSPOSE_CLEANUP);
+    PS_CHECK_POINTERS(inImage, outImage, TRANSPOSE_CLEANUP);
+
     outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
 
@@ -472,10 +480,10 @@
     gsl_matrix *in = NULL;
 
-
-    // Error checks
-    PS_CHECK_POINTERS(inImage, outImage, outImage);
-    PS_IMAGE_CHECK_NULL(inImage, outImage);
-    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outImage);
-    PS_IMAGE_CHECK_EMPTY(inImage, outImage);
+    #define EIGENVECTORS_CLEANUP { psFree(outImage); return NULL; }
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, EIGENVECTORS_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, EIGENVECTORS_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, EIGENVECTORS_CLEANUP);
+    PS_CHECK_POINTERS(inImage, outImage, EIGENVECTORS_CLEANUP);
 
     outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
@@ -494,6 +502,6 @@
 
     // Non-square matrices not allowed
-    PS_CHECK_SQUARE(inImage, outImage);
-    PS_CHECK_SQUARE(outImage, outImage);
+    PS_CHECK_SQUARE(inImage, EIGENVECTORS_CLEANUP);
+    PS_CHECK_SQUARE(outImage, EIGENVECTORS_CLEANUP);
 
     // Calculate Eigenvalues and Eigenvectors...Eigenvalues not currently used
@@ -520,14 +528,14 @@
     // Error checks
     PS_IMAGE_CHECK_NULL_GENERAL(inImage, psMatrixToVector_EXIT);
-    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outVector);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, psMatrixToVector_EXIT);
     PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, psMatrixToVector_EXIT);
 
     if (inImage->numRows == 1) {
         // Create transposed row vector
-        psVectorRecycle(outVector, inImage->numCols, inImage->type.type);
+        outVector = psVectorRecycle(outVector, inImage->numCols, inImage->type.type);
         outVector->type.dimen = PS_DIMEN_TRANSV;
     } else if (inImage->numCols == 1) {
         // Create non-transposed column vector
-        psVectorRecycle(outVector, inImage->numRows, inImage->type.type);
+        outVector = psVectorRecycle(outVector, inImage->numRows, inImage->type.type);
     } else {
         psError(PS_ERR_BAD_PARAMETER_SIZE, true,
@@ -537,9 +545,7 @@
     }
 
-    PS_VECTOR_CHECK_NULL(outVector, outVector);
-
     // More checks
     if (outVector->type.dimen == PS_DIMEN_VECTOR) {
-        PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_VECTOR, outVector);
+        PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_VECTOR, psMatrixToVector_EXIT);
 
         if (outVector->n == 0) {
@@ -557,5 +563,5 @@
 
     } else if (outVector->type.dimen == PS_DIMEN_TRANSV) {
-        PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_TRANSV, outVector);
+        PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_TRANSV, psMatrixToVector_EXIT);
 
         if (outVector->n == 0) {
@@ -582,11 +588,14 @@
     psS32 size = 0;
 
-    // Error checks
-    PS_VECTOR_CHECK_NULL(inVector, outImage);
+    #define VECTORTOMATRIX_CLEANUP {psFree(outImage); return NULL; }
+    // Error checks
+    PS_VECTOR_CHECK_NULL_GENERAL(inVector, VECTORTOMATRIX_CLEANUP);
 
     if (inVector->type.dimen == PS_DIMEN_VECTOR) {
-        PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, outImage);
-        PS_VECTOR_CHECK_EMPTY(inVector, outImage);
+        PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, VECTORTOMATRIX_CLEANUP);
+        PS_VECTOR_CHECK_EMPTY_GENERAL(inVector, VECTORTOMATRIX_CLEANUP);
+
         outImage = psImageRecycle(outImage, 1, inVector->n, inVector->type.type);
+
         // More checks for PS_DIMEN_VECTOR
         if (outImage->numCols > 1) {
@@ -605,6 +614,6 @@
 
     } else if (inVector->type.dimen == PS_DIMEN_TRANSV) {
-        PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_TRANSV, outImage);
-        PS_VECTOR_CHECK_EMPTY(inVector, outImage);
+        PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_TRANSV, VECTORTOMATRIX_CLEANUP);
+        PS_VECTOR_CHECK_EMPTY_GENERAL(inVector, VECTORTOMATRIX_CLEANUP);
         outImage = psImageRecycle(outImage, inVector->n, 1, inVector->type.type);
         // More checks for PS_DIMEN_TRANSV
@@ -624,6 +633,6 @@
     }
 
-    PS_IMAGE_CHECK_NULL(outImage, outImage);
-    PS_CHECK_DIMEN_AND_TYPE(outImage, PS_DIMEN_IMAGE, outImage);
+    PS_IMAGE_CHECK_NULL_GENERAL(outImage, VECTORTOMATRIX_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(outImage, PS_DIMEN_IMAGE, VECTORTOMATRIX_CLEANUP);
 
     memcpy(outImage->data.V[0], inVector->data.V, size);
