Changeset 9917
- Timestamp:
- Nov 8, 2006, 5:06:56 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/types/psMetadataConfig.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/types/psMetadataConfig.c
r9916 r9917 10 10 * @author Eric Van Alst, MHPCC 11 11 * 12 * @version $Revision: 1.11 3$ $Name: not supported by cvs2svn $13 * @date $Date: 2006-11-09 0 1:58:52$12 * @version $Revision: 1.114 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2006-11-09 03:06:56 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 373 373 psS32 *status) 374 374 { 375 char* end = NULL; 376 char* saveValue = NULL; 377 psS32 i = 0; 378 psS32 numValues = 0; 379 double value = 0.0; 380 psVector* vec = NULL; 381 382 // Cycle through string and count entries 383 saveValue = inString; 384 while(*inString!='\0') { 385 double check = strtod(inString, &end); 386 if (isnan(check) || check < DBL_EPSILON) { //make sure inString contains valid #'s 387 if ( strncmp(inString, "0", 1) != 0 || strncmp(inString, " 0", 2) != 0 388 || isnan(check)) { 389 *status = 1; 390 return NULL; 391 } 392 } 393 /* if(inString==end) { 394 *status = 1; 395 return NULL; 396 } 397 */ 398 // Commas or spaces may be used as delimiters for vector values 399 while(*end==' ' || *end==',') { 400 end++; 401 } 402 inString=end; 403 numValues++; 404 } 405 406 // Cycle through string and convert string values to values 407 if(numValues) { 408 inString = saveValue; 409 end = NULL; 410 vec = psVectorAllocEmpty(numValues, elemType); 411 412 while(*inString!='\0') { 413 value = strtod(inString, &end); 414 /* if(inString==end) { 415 *status = 1; 416 return vec; 417 } 418 */ 419 switch(elemType) { 420 case PS_TYPE_U8: 421 vec->data.U8[i++] = (psU8)value; 422 break; 423 case PS_TYPE_U16: 424 vec->data.U16[i++] = (psU16)value; 425 break; 426 case PS_TYPE_U32: 427 vec->data.U32[i++] = (psU32)value; 428 break; 429 case PS_TYPE_U64: 430 vec->data.U64[i++] = (psU64)value; 431 break; 432 case PS_TYPE_S8: 433 vec->data.S8[i++] = (psS8)value; 434 break; 435 case PS_TYPE_S16: 436 vec->data.S16[i++] = (psS16)value; 437 break; 438 case PS_TYPE_S32: 439 vec->data.S32[i++] = (psS32)value; 440 break; 441 case PS_TYPE_S64: 442 vec->data.S64[i++] = (psS64)value; 443 break; 444 case PS_TYPE_F32: 445 vec->data.F32[i++] = (psF32)value; 446 break; 447 case PS_TYPE_F64: 448 default: 449 vec->data.F64[i++] = (psF64)value; 450 break; 451 /* *status = 1; 452 psError(PS_ERR_BAD_PARAMETER_VALUE,true, 453 _("Specified type, %d, is not supported."), 454 elemType); 455 */ 456 } 457 vec->n++; 458 while(*end==' ' || *end==',') { 459 end++; 460 } 461 inString=end; 462 } 463 } 375 PS_ASSERT_PTR_NON_NULL(inString, NULL); 376 377 // split string into multiple values on " " and "," 378 psList *tokens = psStringSplit(inString, ", ", false); 379 380 // allocate a large enough vector to hold all of the tokens 381 psVector *vec = psVectorAlloc(psListLength(tokens), elemType); 382 383 // iterate through the list of tokens and concert them to numeric values 384 // one by one 385 for (long i = 0; i < psListLength(tokens); i ++) { 386 psString tok = psListGet(tokens, i); 387 char *ptr = NULL; 388 double value = strtod(tok, &ptr); 389 390 // ptr will be set to tok if the parse failed 391 if (tok == ptr) { 392 *status = 1; 393 psError(PS_ERR_IO, true, 394 _("failed to parse %s as a vector element."), tok); 395 psFree(vec); 396 psFree(tokens); 397 return NULL; 398 } 399 400 // XXX this switch statement and cases should be turned inside out but 401 // this optimization isn't a priority 402 switch(elemType) { 403 case PS_TYPE_U8: 404 vec->data.U8[i] = (psU8)value; 405 break; 406 case PS_TYPE_U16: 407 vec->data.U16[i] = (psU16)value; 408 break; 409 case PS_TYPE_U32: 410 vec->data.U32[i] = (psU32)value; 411 break; 412 case PS_TYPE_U64: 413 vec->data.U64[i] = (psU64)value; 414 break; 415 case PS_TYPE_S8: 416 vec->data.S8[i] = (psS8)value; 417 break; 418 case PS_TYPE_S16: 419 vec->data.S16[i] = (psS16)value; 420 break; 421 case PS_TYPE_S32: 422 vec->data.S32[i] = (psS32)value; 423 break; 424 case PS_TYPE_S64: 425 vec->data.S64[i] = (psS64)value; 426 break; 427 case PS_TYPE_F32: 428 vec->data.F32[i] = (psF32)value; 429 break; 430 case PS_TYPE_F64: 431 vec->data.F64[i] = (psF64)value; 432 break; 433 default: 434 *status = 1; 435 psError(PS_ERR_BAD_PARAMETER_VALUE,true, 436 _("Specified type, %d, is not supported."), elemType); 437 psFree(vec); 438 psFree(tokens); 439 return NULL; 440 break; // unreachable 441 } 442 } 443 444 psFree(tokens); 464 445 465 446 return vec;
Note:
See TracChangeset
for help on using the changeset viewer.
