IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 7, 2005, 10:58:51 AM (21 years ago)
Author:
desonia
Message:

modified psMetadata to use a special psMetadataType to signify duplicate
entries and added a flag to signify that duplicate entries are OK.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/astronomy/psMetadataIO.c

    r3341 r3381  
    99*  @author Ross Harman, MHPCC
    1010*
    11 *  @version $Revision: 1.21 $ $Name: not supported by cvs2svn $
    12 *  @date $Date: 2005-02-28 23:34:10 $
     11*  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
     12*  @date $Date: 2005-03-07 20:58:50 $
    1313*
    1414*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    410410        switch (keyType) {
    411411        case 'I':
    412             success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_S32,
     412            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
     413                                    PS_META_S32 | PS_META_DUPLICATE_OK,
    413414                                    keyComment, atoi(keyValue));
    414415            break;
    415416        case 'F':
    416             success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_F64,
     417            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
     418                                    PS_META_F64 | PS_META_DUPLICATE_OK,
    417419                                    keyComment, atof(keyValue));
    418420            break;
    419421        case 'C':
    420             success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_STR,
     422            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
     423                                    PS_META_STR | PS_META_DUPLICATE_OK,
    421424                                    keyComment, keyValue);
    422425            break;
    423426        case 'L':
    424427            tempBool = (keyValue[0] == 'T') ? 1 : 0;
    425             success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_BOOL,
     428            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
     429                                    PS_META_BOOL | PS_META_DUPLICATE_OK,
    426430                                    keyComment, tempBool);
    427431            break;
     
    456460    psF64 tempDbl = 0.0;
    457461    psS32 tempInt = 0.0;
    458     psMetadataItem *metadataItem = NULL;
    459462    psVector *tempVec = NULL;
    460463    FILE *fp = NULL;
    461464    psMetadataType mdType;
    462 
     465    psMetadataFlags flags;
     466    psBool addStatus;
    463467
    464468    // Check for nulls
     
    516520            }
    517521
     522            flags = (overwrite) ? PS_META_REPLACE : PS_META_DEFAULT;
     523
    518524            // Get the metadata item type
    519525            strType = getToken(&linePtr, " ", &status);
     
    524530                        fileName);
    525531                continue;
    526             } else if(!strncmp(strType, "*", 1)) {
    527                 mdType = PS_META_LIST;
    528             } else if(!strncmp(strType, "STR", 3)) {
    529                 mdType = PS_META_STR;
    530             } else if(!strncmp(strType, "BOOL", 4)) {
    531                 mdType = PS_META_BOOL;
    532             } else if(!strncmp(strType, "S32", 3)) {
    533                 mdType = PS_META_S32;
    534             } else if(!strncmp(strType, "F32", 3)) {
    535                 mdType = PS_META_F32;
    536             } else if(!strncmp(strType, "F64", 3)) {
    537                 mdType = PS_META_F64;
    538532            } else {
    539                 (*nFail)++;
    540                 psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineCount,
    541                         fileName);
    542                 continue;
     533                char* tempStrType = strType;
     534                if(*strType == '*') {
     535                    flags = PS_META_DUPLICATE_OK;
     536                    tempStrType = strType+1;
     537                }
     538
     539                if(!strncmp(tempStrType, "STR", 3)) {
     540                    mdType = PS_META_STR;
     541                } else if(!strncmp(tempStrType, "BOOL", 4)) {
     542                    mdType = PS_META_BOOL;
     543                } else if(!strncmp(tempStrType, "S32", 3)) {
     544                    mdType = PS_META_S32;
     545                } else if(!strncmp(tempStrType, "F32", 3)) {
     546                    mdType = PS_META_F32;
     547                } else if(!strncmp(tempStrType, "F64", 3)) {
     548                    mdType = PS_META_F64;
     549                } else {
     550                    (*nFail)++;
     551                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineCount,
     552                            fileName);
     553                    continue;
     554                }
    543555            }
    544556
     
    548560            }
    549561
    550             // Get the metadata item value if there is one. Lines with * don't have values.
    551             if(mdType != PS_META_LIST) {
    552                 strValue = getToken(&linePtr, "#", &status);
    553                 if(strValue==NULL) {
    554                     (*nFail)++;
    555                     status = 0;
    556                     psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "value", lineCount,
    557                             fileName);
    558                     continue;
    559                 }
    560             }
    561 
    562             // Get the metadata item value if there is one. Not all lines will have comments, so NULL is ok.
     562            // Get the metadata item value if there is one.
     563            strValue = getToken(&linePtr, "#", &status);
     564            if(status) {
     565                (*nFail)++;
     566                status = 0;
     567                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "comment", lineCount,
     568                        fileName);
     569                continue;
     570            }
     571            if(strValue==NULL) {
     572                (*nFail)++;
     573                status = 0;
     574                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "value", lineCount,
     575                        fileName);
     576                continue;
     577            }
     578
     579            // Not all lines will have comments, so NULL is ok.
    563580            strComment = getToken(&linePtr,"~", &status);
    564581            if(status) {
     
    570587            }
    571588
    572             /* If metadata item is found, is not a folder node, and overwrite is allowed, then remove existing
    573             and allow switch/case below to add new item. If overwrite is false, then report error. If found
    574             item is folder node, then psMetadataAdd will automatically add a new child. */
    575             metadataItem = psMetadataLookup(md, strName);
    576             if(metadataItem != NULL) {
    577                 if(metadataItem->type!=PS_META_LIST) {
    578                     if(overwrite) {
    579                         psMetadataRemove(md, INT_MIN, strName);
    580                     } else {
    581                         (*nFail)++;
    582                         psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineCount,
    583                                 fileName);
    584                         continue;
    585                     }
    586                 }
    587             }
    588 
    589589            // Create and add metadata item to metadata and parse values
    590590            switch (mdType) {
    591             case PS_META_LIST:
    592                 psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, NULL);
    593                 break;
    594591            case PS_META_STR:
    595                 psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, strValue);
     592                addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
     593                                          mdType | flags,
     594                                          strComment, strValue);
    596595                break;
    597596            case PS_META_VEC:
    598597                tempVec = parseVector(strValue, vecType, &status);
    599598                if(!status) {
    600                     psMetadataAdd(md, PS_LIST_TAIL, strName+1, mdType, strComment, tempVec);
     599                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName+1,
     600                                              mdType | flags,
     601                                              strComment, tempVec);
    601602                } else {
    602603                    status = 0;
     
    611612                tempBool = parseBool(strValue, &status);
    612613                if(!status) {
    613                     psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, tempBool);
     614                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
     615                                              mdType | flags,
     616                                              strComment, tempBool);
    614617                } else {
    615618                    status = 0;
     
    623626                tempInt = (psS32)parseValue(strValue, &status);
    624627                if(!status) {
    625                     psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, tempInt);
     628                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
     629                                              mdType | flags,
     630                                              strComment, tempInt);
    626631                } else {
    627632                    status = 0;
     
    636641                tempDbl = parseValue(strValue, &status);
    637642                if(!status) {
    638                     psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, tempDbl);
     643                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
     644                                              mdType | flags,
     645                                              strComment, tempDbl);
    639646                } else {
    640647                    status = 0;
     
    652659                continue;
    653660            } // switch
     661            if (! addStatus) {
     662                (*nFail)++;
     663                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineCount,
     664                        fileName);
     665            }
     666
    654667        } // if ignoreLine
    655668    } // while loop
     
    725738    // Add attributes to metadata
    726739
    727     psMetadataAdd(md, PS_LIST_TAIL, "htAtts", PS_META_HASH, NULL, htAtts);
     740    psMetadataAdd(md, PS_LIST_TAIL, "htAtts",
     741                  PS_META_HASH | PS_META_DUPLICATE_OK,
     742                  NULL, htAtts);
    728743
    729744    psFree(psTagName);
     
    828843    switch(mdType) {
    829844    case PS_META_LIST:
    830         psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, NULL);
     845        psMetadataAdd(md, PS_LIST_TAIL, strName,
     846                      mdType | PS_META_DUPLICATE_OK,
     847                      NULL, NULL);
    831848        break;
    832849    case PS_META_STR:
    833         psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, strValue);
     850        psMetadataAdd(md, PS_LIST_TAIL, strName,
     851                      mdType | PS_META_DUPLICATE_OK,
     852                      NULL, strValue);
    834853        break;
    835854    case PS_META_BOOL:
    836855        tempBool = parseBool((char*)strValue, &status);
    837856        if(!status) {
    838             psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, tempBool);
     857            psMetadataAdd(md, PS_LIST_TAIL, strName,
     858                          mdType | PS_META_DUPLICATE_OK,
     859                          NULL, tempBool);
    839860        } else {
    840861            status = 0;
     
    846867        tempInt = (psS32)parseValue((char*)strValue, &status);
    847868        if(!status) {
    848             psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, tempInt);
     869            psMetadataAdd(md, PS_LIST_TAIL, strName,
     870                          mdType | PS_META_DUPLICATE_OK,
     871                          NULL, tempInt);
    849872        } else {
    850873            status = 0;
     
    857880        tempDbl = parseValue((char*)strValue, &status);
    858881        if(!status) {
    859             psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, tempDbl);
     882            psMetadataAdd(md, PS_LIST_TAIL, strName,
     883                          mdType | PS_META_DUPLICATE_OK,
     884                          NULL, tempDbl);
    860885        } else {
    861886            status = 0;
     
    966991    vec = parseVector((char*)strValue, pType, &status);
    967992    if(!status) {
    968         psMetadataAdd(md, PS_LIST_TAIL, strName+1, PS_META_VEC, NULL, vec);
     993        psMetadataAdd(md, PS_LIST_TAIL, strName+1,
     994                      PS_META_VEC | PS_META_DUPLICATE_OK,
     995                      NULL, vec);
    969996    } else {
    970997        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
Note: See TracChangeset for help on using the changeset viewer.