IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 9917


Ignore:
Timestamp:
Nov 8, 2006, 5:06:56 PM (20 years ago)
Author:
jhoblitt
Message:

revamp parseVector()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/types/psMetadataConfig.c

    r9916 r9917  
    1010*  @author Eric Van Alst, MHPCC
    1111*
    12 *  @version $Revision: 1.113 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2006-11-09 01:58:52 $
     12*  @version $Revision: 1.114 $ $Name: not supported by cvs2svn $
     13*  @date $Date: 2006-11-09 03:06:56 $
    1414*
    1515*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    373373                             psS32 *status)
    374374{
    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);
    464445
    465446    return vec;
Note: See TracChangeset for help on using the changeset viewer.