Index: /trunk/psLib/src/types/psMetadataConfig.c
===================================================================
--- /trunk/psLib/src/types/psMetadataConfig.c	(revision 9916)
+++ /trunk/psLib/src/types/psMetadataConfig.c	(revision 9917)
@@ -10,6 +10,6 @@
 *  @author Eric Van Alst, MHPCC
 *
-*  @version $Revision: 1.113 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2006-11-09 01:58:52 $
+*  @version $Revision: 1.114 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2006-11-09 03:06:56 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -373,93 +373,74 @@
                              psS32 *status)
 {
-    char*      end       = NULL;
-    char*      saveValue = NULL;
-    psS32      i         = 0;
-    psS32      numValues = 0;
-    double     value     = 0.0;
-    psVector*  vec       = NULL;
-
-    // Cycle through string and count entries
-    saveValue = inString;
-    while(*inString!='\0') {
-        double check = strtod(inString, &end);
-        if (isnan(check) || check < DBL_EPSILON) {  //make sure inString contains valid #'s
-            if ( strncmp(inString, "0", 1) != 0 || strncmp(inString, " 0", 2) != 0
-                    || isnan(check)) {
-                *status = 1;
-                return NULL;
-            }
-        }
-        /*        if(inString==end) {
-                    *status = 1;
-                    return NULL;
-                }
-        */
-        // Commas or spaces may be used as delimiters for vector values
-        while(*end==' ' || *end==',') {
-            end++;
-        }
-        inString=end;
-        numValues++;
-    }
-
-    // Cycle through string and convert string values to values
-    if(numValues) {
-        inString = saveValue;
-        end = NULL;
-        vec = psVectorAllocEmpty(numValues, elemType);
-
-        while(*inString!='\0') {
-            value = strtod(inString, &end);
-            /*            if(inString==end) {
-                            *status = 1;
-                            return vec;
-                        }
-                        */
-            switch(elemType) {
-            case PS_TYPE_U8:
-                vec->data.U8[i++] = (psU8)value;
-                break;
-            case PS_TYPE_U16:
-                vec->data.U16[i++] = (psU16)value;
-                break;
-            case PS_TYPE_U32:
-                vec->data.U32[i++] = (psU32)value;
-                break;
-            case PS_TYPE_U64:
-                vec->data.U64[i++] = (psU64)value;
-                break;
-            case PS_TYPE_S8:
-                vec->data.S8[i++] = (psS8)value;
-                break;
-            case PS_TYPE_S16:
-                vec->data.S16[i++] = (psS16)value;
-                break;
-            case PS_TYPE_S32:
-                vec->data.S32[i++] = (psS32)value;
-                break;
-            case PS_TYPE_S64:
-                vec->data.S64[i++] = (psS64)value;
-                break;
-            case PS_TYPE_F32:
-                vec->data.F32[i++] = (psF32)value;
-                break;
-            case PS_TYPE_F64:
-            default:
-                vec->data.F64[i++] = (psF64)value;
-                break;
-                /*                *status = 1;
-                                psError(PS_ERR_BAD_PARAMETER_VALUE,true,
-                                        _("Specified type, %d, is not supported."),
-                                        elemType);
-                                */
-            }
-            vec->n++;
-            while(*end==' ' || *end==',') {
-                end++;
-            }
-            inString=end;
-        }
-    }
+    PS_ASSERT_PTR_NON_NULL(inString, NULL);
+
+    // split string into multiple values on " " and ","
+    psList *tokens = psStringSplit(inString, ", ", false);
+
+    // allocate a large enough vector to hold all of the tokens
+    psVector *vec = psVectorAlloc(psListLength(tokens), elemType);
+
+    // iterate through the list of tokens and concert them to numeric values
+    // one by one
+    for (long i = 0; i < psListLength(tokens); i ++) {
+        psString tok = psListGet(tokens, i);
+        char *ptr = NULL;
+        double value = strtod(tok, &ptr);
+
+        // ptr will be set to tok if the parse failed
+        if (tok == ptr) {
+            *status = 1;
+            psError(PS_ERR_IO, true,
+                    _("failed to parse %s as a vector element."), tok);
+            psFree(vec);
+            psFree(tokens);
+            return NULL;
+        }
+
+        // XXX this switch statement and cases should be turned inside out but
+        // this optimization isn't a priority
+        switch(elemType) {
+        case PS_TYPE_U8:
+            vec->data.U8[i] = (psU8)value;
+            break;
+        case PS_TYPE_U16:
+            vec->data.U16[i] = (psU16)value;
+            break;
+        case PS_TYPE_U32:
+            vec->data.U32[i] = (psU32)value;
+            break;
+        case PS_TYPE_U64:
+            vec->data.U64[i] = (psU64)value;
+            break;
+        case PS_TYPE_S8:
+            vec->data.S8[i] = (psS8)value;
+            break;
+        case PS_TYPE_S16:
+            vec->data.S16[i] = (psS16)value;
+            break;
+        case PS_TYPE_S32:
+            vec->data.S32[i] = (psS32)value;
+            break;
+        case PS_TYPE_S64:
+            vec->data.S64[i] = (psS64)value;
+            break;
+        case PS_TYPE_F32:
+            vec->data.F32[i] = (psF32)value;
+            break;
+        case PS_TYPE_F64:
+            vec->data.F64[i] = (psF64)value;
+            break;
+        default:
+            *status = 1;
+            psError(PS_ERR_BAD_PARAMETER_VALUE,true,
+                    _("Specified type, %d, is not supported."), elemType);
+            psFree(vec);
+            psFree(tokens);
+            return NULL;
+            break;                          // unreachable
+        }
+    }
+
+    psFree(tokens);
 
     return vec;
