Index: trunk/psLib/src/dataManip/psFunctions.c
===================================================================
--- trunk/psLib/src/dataManip/psFunctions.c	(revision 2204)
+++ trunk/psLib/src/dataManip/psFunctions.c	(revision 2217)
@@ -7,8 +7,12 @@
  *  polynomials.  It also contains a Gaussian functions.
  *
- *  @version $Revision: 1.54 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-27 00:57:31 $
+ *  @version $Revision: 1.55 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-27 21:06:30 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
+ *
+ *  XXX: What happens if the polyEVal functions are called with dat of the wrong
+ *       type?
+ *
  */
 /*****************************************************************************/
@@ -30,53 +34,9 @@
 #include "psAbort.h"
 #include "psLogMsg.h"
-
 #include "psFunctions.h"
+#include "psConstants.h"
 /*****************************************************************************/
 /* DEFINE STATEMENTS                                                         */
 /*****************************************************************************/
-/*
- * The following macros take the vector IN as input.  If IN is not of
- * the correct type, then a new vector OUT is created of the correct
- * type, and the elements of IN and converted to OUT.
- *
- * If vector IN is the correct type, then OUT is simply set to IN.
- */
-#define PS_CONVERT_VECTOR_F32(IN, OUT) \
-if (IN->type.type != PS_TYPE_F32) { \
-    psLogMsg(__func__, PS_LOG_WARN, \
-             "Input vector has incorrect type (%d).\n", \
-             IN->type); \
-    OUT = psVectorAlloc(IN->n, PS_TYPE_F32); \
-    \
-    if (IN->type.type == PS_TYPE_F64) { \
-        for (psS32 i=0;i<IN->n;i++) { \
-            OUT->data.F32[i] = (float) (IN->data.F64[i]); \
-        } \
-    }\
-    else { \
-        psAbort(__func__, "Wrong type.\n"); \
-    } \
-} else { \
-    OUT = (psVector *) IN; \
-}
-
-#define PS_CONVERT_VECTOR_F64(IN, OUT) \
-if (IN->type.type != PS_TYPE_F64) { \
-    psLogMsg(__func__, PS_LOG_WARN, \
-             "Input vector has incorrect type (%d).\n", \
-             IN->type); \
-    OUT = psVectorAlloc(IN->n, PS_TYPE_F64); \
-    \
-    if (IN->type.type == PS_TYPE_F32) { \
-        for (psS32 i=0;i<IN->n;i++) { \
-            OUT->data.F64[i] = (float) (IN->data.F32[i]); \
-        } \
-    }\
-    else { \
-        psAbort(__func__, "Wrong type.\n"); \
-    } \
-} else { \
-    OUT = (psVector *) IN; \
-}
 
 /*****************************************************************************/
@@ -119,4 +79,6 @@
 static psPolynomial1D **CreateChebyshevPolys(psS32 maxChebyPoly)
 {
+    PS_INT_CHECK_NON_NEGATIVE(maxChebyPoly, NULL);
+
     psPolynomial1D **chebPolys = NULL;
     psS32 i = 0;
@@ -187,8 +149,11 @@
 psVector* psGaussianDev(float mean, float sigma, psS32 Npts)
 {
+    PS_INT_CHECK_NON_NEGATIVE(Npts, NULL);
+
     psVector* gauss = NULL;
     const gsl_rng_type *T = NULL;
     gsl_rng *r = NULL;
     psS32 i = 0;
+
 
     gauss = psVectorAlloc(Npts, PS_TYPE_F32);
@@ -212,4 +177,6 @@
                                     psPolynomialType type)
 {
+    PS_INT_CHECK_NON_NEGATIVE(n, NULL);
+
     psS32 i = 0;
     psPolynomial1D* newPoly = NULL;
@@ -235,4 +202,7 @@
                                     psPolynomialType type)
 {
+    PS_INT_CHECK_NON_NEGATIVE(nX, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nY, NULL);
+
     psS32 x = 0;
     psS32 y = 0;
@@ -268,4 +238,8 @@
                                     psPolynomialType type)
 {
+    PS_INT_CHECK_NON_NEGATIVE(nX, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nY, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nZ, NULL);
+
     psS32 x = 0;
     psS32 y = 0;
@@ -310,4 +284,9 @@
                                     psPolynomialType type)
 {
+    PS_INT_CHECK_NON_NEGATIVE(nW, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nX, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nY, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nZ, NULL);
+
     psS32 w = 0;
     psS32 x = 0;
@@ -522,4 +501,6 @@
 float psPolynomial1DEval(float x, const psPolynomial1D* myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
     if (myPoly->type == PS_POLYNOMIAL_ORD) {
         return(p_psOrdPolynomial1DEval(x, myPoly));
@@ -535,10 +516,12 @@
                                    const psPolynomial1D *myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+
     psVector *tmp;
     psVector *myX;
     psS32 i;
 
-    PS_CONVERT_VECTOR_F32(x, myX);
-
     tmp = psVectorAlloc(x->n, PS_TYPE_F32);
     for (i=0;i<x->n;i++) {
@@ -555,4 +538,6 @@
 float p_psOrdPolynomial2DEval(float x, float y, const psPolynomial2D* myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
     psS32 loop_x = 0;
     psS32 loop_y = 0;
@@ -577,4 +562,6 @@
 float p_psChebPolynomial2DEval(float x, float y, const psPolynomial2D* myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
     psS32 loop_x = 0;
     psS32 loop_y = 0;
@@ -610,4 +597,6 @@
 float psPolynomial2DEval(float x, float y, const psPolynomial2D* myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
     if (myPoly->type == PS_POLYNOMIAL_ORD) {
         return(p_psOrdPolynomial2DEval(x, y, myPoly));
@@ -625,4 +614,10 @@
                                    const psPolynomial2D *myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+
     psVector *tmp;
     psVector *myX;
@@ -631,6 +626,4 @@
     psS32 vecLen=x->n;
 
-    PS_CONVERT_VECTOR_F32(x, myX);
-    PS_CONVERT_VECTOR_F32(y, myY);
     vecLen=x->n;
     if (y->n < vecLen) {
@@ -727,4 +720,6 @@
 float psPolynomial3DEval(float x, float y, float z, const psPolynomial3D* myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
     if (myPoly->type == PS_POLYNOMIAL_ORD) {
         return(p_psOrdPolynomial3DEval(x, y, z, myPoly));
@@ -742,4 +737,12 @@
                                    const psPolynomial3D *myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F32, NULL);
+
     psVector *tmp;
     psVector *myX;
@@ -749,7 +752,4 @@
     psS32 vecLen=x->n;
 
-    PS_CONVERT_VECTOR_F32(x, myX);
-    PS_CONVERT_VECTOR_F32(y, myY);
-    PS_CONVERT_VECTOR_F32(z, myZ);
     vecLen=x->n;
     if (y->n < vecLen) {
@@ -869,4 +869,6 @@
 float psPolynomial4DEval(float w, float x, float y, float z, const psPolynomial4D* myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
     if (myPoly->type == PS_POLYNOMIAL_ORD) {
         return(p_psOrdPolynomial4DEval(w,x,y,z, myPoly));
@@ -885,4 +887,14 @@
                                    const psPolynomial4D *myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(w, NULL);
+    PS_VECTOR_CHECK_TYPE(w, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F32, NULL);
+
     psVector *tmp;
     psVector *myW;
@@ -893,8 +905,4 @@
     psS32 vecLen=x->n;
 
-    PS_CONVERT_VECTOR_F32(w, myW);
-    PS_CONVERT_VECTOR_F32(x, myX);
-    PS_CONVERT_VECTOR_F32(y, myY);
-    PS_CONVERT_VECTOR_F32(z, myZ);
     vecLen=w->n;
     if (y->n < vecLen) {
@@ -939,4 +947,6 @@
                                       psPolynomialType type)
 {
+    PS_INT_CHECK_NON_NEGATIVE(n, NULL);
+
     psS32 i = 0;
     psDPolynomial1D* newPoly = NULL;
@@ -962,4 +972,7 @@
                                       psPolynomialType type)
 {
+    PS_INT_CHECK_NON_NEGATIVE(nX, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nY, NULL);
+
     psS32 x = 0;
     psS32 y = 0;
@@ -995,4 +1008,8 @@
                                       psPolynomialType type)
 {
+    PS_INT_CHECK_NON_NEGATIVE(nX, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nY, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nZ, NULL);
+
     psS32 x = 0;
     psS32 y = 0;
@@ -1037,4 +1054,9 @@
                                       psPolynomialType type)
 {
+    PS_INT_CHECK_NON_NEGATIVE(nW, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nX, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nY, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(nZ, NULL);
+
     psS32 w = 0;
     psS32 x = 0;
@@ -1207,4 +1229,6 @@
 double psDPolynomial1DEval(double x, const psDPolynomial1D* myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
     if (myPoly->type == PS_POLYNOMIAL_ORD) {
         return(p_psDOrdPolynomial1DEval(x, myPoly));
@@ -1220,9 +1244,11 @@
                                     const psDPolynomial1D *myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+
     psVector *tmp;
     psVector *myX;
     psS32 i;
-
-    PS_CONVERT_VECTOR_F64(x, myX);
 
     tmp = psVectorAlloc(x->n, PS_TYPE_F64);
@@ -1297,4 +1323,6 @@
 double psDPolynomial2DEval(double x, double y, const psDPolynomial2D* myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
     if (myPoly->type == PS_POLYNOMIAL_ORD) {
         return(p_psDOrdPolynomial2DEval(x, y, myPoly));
@@ -1311,4 +1339,10 @@
                                     const psDPolynomial2D *myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+
     psVector *tmp;
     psVector *myX;
@@ -1317,6 +1351,4 @@
     psS32 vecLen=x->n;
 
-    PS_CONVERT_VECTOR_F64(x, myX);
-    PS_CONVERT_VECTOR_F64(y, myY);
     vecLen=x->n;
     if (y->n < vecLen) {
@@ -1413,4 +1445,6 @@
 double psDPolynomial3DEval(double x, double y, double z, const psDPolynomial3D* myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
     if (myPoly->type == PS_POLYNOMIAL_ORD) {
         return(p_psDOrdPolynomial3DEval(x, y, z, myPoly));
@@ -1428,4 +1462,12 @@
                                     const psDPolynomial3D *myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F64, NULL);
+
     psVector *tmp;
     psVector *myX;
@@ -1435,7 +1477,4 @@
     psS32 vecLen=x->n;
 
-    PS_CONVERT_VECTOR_F64(x, myX);
-    PS_CONVERT_VECTOR_F64(y, myY);
-    PS_CONVERT_VECTOR_F64(z, myZ);
     vecLen=x->n;
     if (y->n < vecLen) {
@@ -1557,4 +1596,6 @@
 double psDPolynomial4DEval(double w, double x, double y, double z, const psDPolynomial4D* myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
     if (myPoly->type == PS_POLYNOMIAL_ORD) {
         return(p_psDOrdPolynomial4DEval(w,x,y,z, myPoly));
@@ -1573,4 +1614,14 @@
                                     const psDPolynomial4D *myPoly)
 {
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(w, NULL);
+    PS_VECTOR_CHECK_TYPE(w, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F64, NULL);
+
     psVector *tmp;
     psVector *myW;
@@ -1581,8 +1632,4 @@
     psS32 vecLen=x->n;
 
-    PS_CONVERT_VECTOR_F64(w, myW);
-    PS_CONVERT_VECTOR_F64(x, myX);
-    PS_CONVERT_VECTOR_F64(y, myY);
-    PS_CONVERT_VECTOR_F64(z, myZ);
     vecLen=w->n;
     if (y->n < vecLen) {
