IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 3381


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.

Location:
trunk/psLib
Files:
51 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/pslib.kdevses

    r3341 r3381  
    44 <DocsAndViews NumberOfDocuments="5" >
    55  <Doc0 NumberOfViews="1" URL="file:/home/desonia/panstarrs/psLib/src/astronomy/psMetadata.c" >
    6    <View0 line="129" Type="Source" />
     6   <View0 line="593" Type="Source" />
    77  </Doc0>
    88  <Doc1 NumberOfViews="1" URL="file:/home/desonia/panstarrs/psLib/src/astronomy/psMetadata.h" >
    9    <View0 line="164" Type="Source" />
     9   <View0 line="103" Type="Source" />
    1010  </Doc1>
    11   <Doc2 NumberOfViews="1" URL="file:/home/desonia/panstarrs/psLib/src/astronomy/astronomy.i" >
    12    <View0 line="16" Type="Source" />
     11  <Doc2 NumberOfViews="1" URL="file:/home/desonia/panstarrs/psLib/src/collections/psList.h" >
     12   <View0 line="79" Type="Source" />
    1313  </Doc2>
    14   <Doc3 NumberOfViews="1" URL="file:/home/desonia/panstarrs/psLib/src/astronomy/psMetadataIO.c" >
    15    <View0 line="965" Type="Source" />
     14  <Doc3 NumberOfViews="1" URL="file:/home/desonia/panstarrs/psLib/src/astronomy/psAstronomyErrors.dat" >
     15   <View0 line="50" Type="Source" />
    1616  </Doc3>
    17   <Doc4 NumberOfViews="1" URL="file:/home/desonia/panstarrs/psLib/src/sysUtils/psType.h" >
    18    <View0 line="0" Type="Source" />
     17  <Doc4 NumberOfViews="1" URL="file:/home/desonia/panstarrs/psLib/src/collections/psList.c" >
     18   <View0 line="216" Type="Source" />
    1919  </Doc4>
    2020 </DocsAndViews>
  • trunk/psLib/src/astronomy/psAstronomyErrors.dat

    r3325 r3381  
    4747psMetadata_FIND_FAILED                 Could not find metadata item, %s.
    4848psMetadata_FIND_INDEX_FAILED           Could not find metadata item at index %d.
     49psMetadata_DUPLICATE_NOT_ALLOWED       Duplicate metadata item name is not allowed.  Use a psMetadataFlags option to allow such action.
     50psMetadata_REGEX_INVALID               Specified regular expression is invalid.  %s.
     51psMetadata_LOCATION_INVALID            Specified location, %d, is invalid.
    4952#
    5053psMetadataIO_TYPE_INVALID              Specified type, %d, is not supported.
  • trunk/psLib/src/astronomy/psAstronomyErrors.h

    r3341 r3381  
    77 *  @author Robert DeSonia, MHPCC
    88 *
    9  *  @version $Revision: 1.12 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2005-02-28 23:34:10 $
     9 *  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2005-03-07 20:58:50 $
    1111 *
    1212 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    6565#define PS_ERRORTEXT_psMetadata_FIND_FAILED "Could not find metadata item, %s."
    6666#define PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED "Could not find metadata item at index %d."
     67#define PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED "Duplicate metadata item name is not allowed.  Use a psMetadataFlags option to allow such action."
     68#define PS_ERRORTEXT_psMetadata_REGEX_INVALID "Specified regular expression is invalid.  %s."
     69#define PS_ERRORTEXT_psMetadata_LOCATION_INVALID "Specified location, %d, is invalid."
    6770#define PS_ERRORTEXT_psMetadataIO_TYPE_INVALID "Specified type, %d, is not supported."
    6871#define PS_ERRORTEXT_psMetadataIO_EXTNUM_NOTPOSITIVE "Specified extension number, %d, is invalid.  Value must be positive if no extension name is given."
  • trunk/psLib/src/astronomy/psMetadata.c

    r3341 r3381  
    1212*  @author Ross Harman, MHPCC
    1313*
    14 *  @version $Revision: 1.53 $ $Name: not supported by cvs2svn $
    15 *  @date $Date: 2005-02-28 23:34:10 $
     14*  @version $Revision: 1.54 $ $Name: not supported by cvs2svn $
     15*  @date $Date: 2005-03-07 20:58:50 $
    1616*
    1717*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    8585}
    8686
     87static void metadataIteratorFree(psMetadataIterator* iter)
     88{
     89    if (iter == NULL) {
     90        return;
     91    }
     92    psFree(iter->iter);
     93    regfree(iter->preg);
     94}
     95
    8796static void metadataFree(psMetadata* metadata)
    8897{
     
    158167
    159168    // Set metadata item type
    160     metadataItem->type = type;
     169    metadataItem->type = type & PS_METADATA_TYPE_MASK;
    161170
    162171    // Allocate and set metadata item name
     
    165174
    166175    // Set metadata item value
    167     switch(type) {
     176    switch(metadataItem->type) {
    168177    case PS_META_BOOL:
    169178        metadataItem->data.B = (psBool)va_arg(argPtr, psS32);
     
    190199    case PS_META_ASTROM:
    191200    case PS_META_UNKNOWN:
     201    case PS_META_MULTI:
    192202        // Copy of input data not performed due to variability of data types
    193203        metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr));
     
    223233}
    224234
    225 psBool psMetadataAddItem(psMetadata *md, psMetadataItem *metadataItem, psS32 location)
     235psBool psMetadataAddItem(psMetadata *md, psMetadataItem *metadataItem, psS32 location, psS32 flags)
    226236{
    227237    char * key = NULL;
     
    229239    psList *mdList = NULL;
    230240    psMetadataItem *existingEntry = NULL;
    231     psMetadataItem *newFolderEntry = NULL;
    232     psMetadataType newType;
    233241
    234242    PS_PTR_CHECK_NULL(md,NULL);
     
    238246    PS_PTR_CHECK_NULL(metadataItem->name,NULL);
    239247
    240     newType = metadataItem->type;
    241248    mdTable = md->table;
    242249    mdList = md->list;
     
    245252    // See if key is already in table
    246253    existingEntry = (psMetadataItem*)psHashLookup(mdTable, key);
     254
     255    // how the item is added to the hash depends on flags & prior existence
    247256    if(existingEntry != NULL) {
    248 
    249         if(existingEntry->type == PS_META_LIST) {
    250 
    251             if(existingEntry->data.list == NULL) {
    252                 existingEntry->data.list = psListAlloc(NULL);
     257        if ((flags & PS_META_DUPLICATE_OK) != 0) {
     258            // duplicate entries allowed - add another entry.
     259            if (existingEntry->type != PS_META_MULTI) {
     260                // first duplicate, transfer the hash's old entry into a
     261                // list of entries with the type PS_META_MULTI.
     262
     263                // add entry to a list and dereference the local pointer
     264                psList* newList = psListAlloc(existingEntry);
     265
     266                existingEntry = psMetadataItemAlloc(key,
     267                                                    PS_META_MULTI,
     268                                                    "",
     269                                                    newList);
     270                psHashRemove(mdTable,key); // take out the old entry
     271                psHashAdd(mdTable, key, existingEntry); // put in the new entry
     272
     273                // free local references of newly allocated items.
     274                psFree(newList);
     275                psFree(existingEntry);
     276
    253277            }
    254278
    255             // Add leaf node to existing folder node
    256             if(!psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem)) {
    257                 psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED, metadataItem->name);
     279            // add to the hash's list of duplicate entries
     280            if (! psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem) ) {
     281                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
    258282                return false;
    259283            }
    260         } else if(existingEntry->type != PS_META_LIST && newType!= PS_META_LIST) {
    261 
    262             // Leaf node replaces another leaf. Make new folder node and add leaves.
    263             newFolderEntry = psMetadataItemAlloc(key, PS_META_LIST, NULL, NULL);
    264             newFolderEntry->data.list = psListAlloc(NULL);
    265 
    266             if(!psListAdd(newFolderEntry->data.list, PS_LIST_TAIL, existingEntry)) {
    267                 psError(PS_ERR_UNKNOWN,false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
    268                 psFree(newFolderEntry);
    269                 return false;
    270             }
    271 
    272             if(!psListAdd(newFolderEntry->data.list, PS_LIST_TAIL, metadataItem)) {
    273                 psError(PS_ERR_UNKNOWN,false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
    274                 psFree(newFolderEntry);
    275                 return false;
    276             }
    277 
    278             if(!psHashRemove(mdTable, key)) {
    279                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,key);
    280                 psFree(newFolderEntry);
    281                 return false;
    282             }
    283 
    284             if(!psHashAdd(mdTable, key, newFolderEntry)) {
    285                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
    286                 psFree(newFolderEntry);
    287                 return false;
    288             }
    289 
    290             // Remove local reference to new folder node
    291             psMemDecrRefCounter(newFolderEntry);
    292         } else {
    293 
    294             // Folder node replaces leaf or folder node - Put old node into new folder and remove from table
    295             if(metadataItem->data.list == NULL) {
    296                 metadataItem->data.list = psListAlloc(NULL);
    297             }
    298 
    299             if(!psListAdd(metadataItem->data.list, PS_LIST_TAIL, existingEntry)) {
    300                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
    301                 return false;
    302             }
    303 
    304             if(!psHashRemove(mdTable, key)) {
    305                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,key);
    306                 return false;
    307             }
    308 
     284            // (added to list below)
     285
     286        } else if ((flags & PS_META_REPLACE) != 0) {
     287            // replace entry instead of creating a duplicate entry.
     288
     289            // remove the existing entry from metadata
     290            psListRemoveData(mdList, existingEntry);
     291            psHashRemove(mdTable, key);
     292
     293            // treat as if new (added to list below)
    309294            if(!psHashAdd(mdTable, key, metadataItem)) {
    310295                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
    311296                return false;
    312297            }
     298        } else {
     299            // default is to error on duplicate entry.
     300            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
     301                    PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED);
     302            return false;
    313303        }
    314304    } else {
     305        // OK, this is a new item.
    315306
    316307        // Node doesn't exist - Add new metadata item to metadata collection's hash
     
    321312    }
    322313
    323     // Add items to metadata collection's list, even if they have the same metadata item names. Folder nodes
    324     // (PS_META_LIST metadata items) are not added, since the metadata list is flat.
    325     if(metadataItem->type != PS_META_LIST) {
    326         if(!psListAdd(mdList, location, metadataItem)) {
    327             psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
    328             return false;
    329         }
     314    if(!psListAdd(mdList, location, metadataItem)) {
     315        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
     316        return false;
    330317    }
    331318
     
    333320}
    334321
    335 psBool psMetadataAdd(psMetadata *md, psS32 where, const char *name,
    336                      psMetadataType type, const char *comment, ...)
     322psBool psMetadataAdd(psMetadata *md, psS32 location, const char *name,
     323                     psS32 type, const char *comment, ...)
    337324{
    338325    va_list argPtr;
     326
     327    va_start(argPtr, comment);
     328    psBool result = psMetadataAddV(md,location,name,type,comment,argPtr);
     329    va_end(argPtr);
     330
     331    return result;
     332}
     333
     334psBool psMetadataAddV(psMetadata *md, psS32 location, const char *name,
     335                      psS32 type, const char *comment, va_list list)
     336{
    339337    psMetadataItem* metadataItem = NULL;
    340338
    341     va_start(argPtr, comment);
    342     metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
    343     va_end(argPtr);
    344 
    345     if (!psMetadataAddItem(md, metadataItem, where)) {
     339    metadataItem = psMetadataItemAllocV(name, type & PS_METADATA_TYPE_MASK, comment, list);
     340
     341    if (!psMetadataAddItem(md, metadataItem, location, type & PS_METADATA_FLAGS_MASK)) {
    346342        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_FAILED);
    347343        psFree(metadataItem);
     
    373369psBool psMetadataRemove(psMetadata *md, psS32 where, const char *key)
    374370{
    375     psList* mdList = NULL;
    376     psHash* mdTable = NULL;
    377     psMetadataItem* entry = NULL;
    378 
    379 
    380371    PS_PTR_CHECK_NULL(md,NULL);
     372
     373    PS_PTR_CHECK_NULL(md->list,NULL);
     374    psList* mdList = md->list;
     375
    381376    PS_PTR_CHECK_NULL(md->table,NULL);
    382     PS_PTR_CHECK_NULL(md->list,NULL);
    383 
    384     mdList = md->list;
    385     mdTable = md->table;
     377    psHash* mdTable = md->table;
    386378
    387379    // Select removal by key or index
    388380    if (key != NULL) {
    389 
    390381        // Remove by key name
    391         entry = (psMetadataItem*)psHashLookup(mdTable, key);
     382        psMetadataItem* entry = psHashLookup(mdTable,key);
    392383        if (entry == NULL) {
    393             psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_FAILED, key);
     384            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
    394385            return false;
    395386        }
    396 
     387        if (entry->type == PS_META_MULTI) {
     388            psMetadataItem* listItem;
     389            psListIterator* iter = psListIteratorAlloc(
     390                                       entry->data.list,
     391                                       PS_LIST_HEAD,true);
     392            while ((listItem=psListGetAndIncrement(iter)) != NULL) {
     393                psListRemoveData(mdList, listItem);
     394            }
     395            psFree(iter);
     396            psHashRemove(mdTable,key);
     397
     398        } else {
     399            psListRemoveData(mdList, entry);
     400            psHashRemove(mdTable, key);
     401        }
    397402    } else {
    398 
    399403        // Remove by index
    400         entry = psListGet(mdList, where);
     404        psMetadataItem* entry = psListGet(mdList, where);
    401405        if (entry == NULL) {
    402406            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED, where);
    403407            return false;
    404408        }
    405 
    406409        key = entry->name;
    407         if(key == NULL) {
     410
     411        if (key == NULL) {
    408412            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_REMOVE_LIST_INDEX_FAILED, where);
    409413            return false;
    410414        }
    411     }
    412 
    413     if (!psListRemoveData(mdList, entry)) {
    414         psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_LIST_FAILED, key);
    415         return false;
    416     }
    417 
    418     // Remove entry from metadata collection's table
    419     if (!psHashRemove(mdTable, key)) {
    420         psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
    421         return false;
     415
     416        psMetadataItem* tableItem = psHashLookup(mdTable, key);
     417        if (tableItem == NULL) {
     418            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
     419            return false;
     420        }
     421
     422        if (tableItem->type == PS_META_MULTI) {
     423            // multiple entries with same key, remove just the specified one
     424            psListRemoveData(tableItem->data.list, entry);
     425            if (psListGet(tableItem->data.list,PS_LIST_HEAD) == NULL) {
     426                // list is empty, so let's clear the whole entry now.
     427                if (!psHashRemove(mdTable, key)) {
     428                    psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
     429                    return false;
     430                }
     431            }
     432        } else {
     433            if (!psHashRemove(mdTable, key)) {
     434                psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
     435                return false;
     436            }
     437        }
     438        psListRemove(mdList, where);
    422439    }
    423440
     
    455472        }
    456473        return NULL;
     474    }
     475    if (metadataItem->type == PS_META_MULTI) {
     476        // if multiple keys found, use the first.
     477        metadataItem = (psMetadataItem*)((metadataItem->data.list)->head);
    457478    }
    458479
     
    486507        } \
    487508        return 0; \
     509    } \
     510    if (metadataItem->type == PS_META_MULTI) { \
     511        /* if multiple keys found, use the first. */ \
     512        metadataItem = (psMetadataItem*)((metadataItem->data.list)->head); \
    488513    } \
    489514    \
     
    535560    return entry;
    536561}
     562
     563psMetadataIterator* psMetadataIteratorAlloc(psMetadata* md,
     564        int location,
     565        const char* regex)
     566{
     567    PS_PTR_CHECK_NULL(md,NULL);
     568    PS_PTR_CHECK_NULL(md->list,NULL);
     569
     570    psMetadataIterator* newIter = psAlloc(sizeof(psMetadataIterator));
     571    newIter->preg = NULL;
     572    newIter->iter = NULL;
     573
     574    // Set deallocator
     575    p_psMemSetDeallocator(newIter, (psFreeFcn) metadataIteratorFree);
     576
     577    if (regex == NULL) {
     578        newIter->iter = psListIteratorAlloc(md->list, location, false);
     579        return newIter;
     580    } else {
     581        int regRtn = regcomp(newIter->preg,regex,0);
     582        if (regRtn != 0) {
     583            char errMsg[256];
     584            regerror(regRtn, newIter->preg, errMsg, 256);
     585            regfree(newIter->preg);
     586            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
     587                    PS_ERRORTEXT_psMetadata_REGEX_INVALID,
     588                    errMsg);
     589            psFree(newIter);
     590            return NULL;
     591        }
     592    }
     593
     594    psMetadataIteratorSet(newIter, location); // XXX: do we error if no match is found?
     595
     596    return newIter;
     597}
     598
     599psBool psMetadataIteratorSet(psMetadataIterator* iterator,
     600                             int location)
     601{
     602    int match;
     603    psMetadataItem* cursor;
     604
     605    PS_PTR_CHECK_NULL(iterator,NULL);
     606
     607    psListIterator* iter = iterator->iter;
     608    PS_PTR_CHECK_NULL(iterator->iter,NULL);
     609
     610    regex_t* preg = iterator->preg;
     611
     612    // handle trivial case where no regex subsetting is required.
     613    if (preg == NULL) {
     614        return psListIteratorSet(iter,location);
     615    }
     616
     617    if (location < 0) {
     618        // match from the tail
     619        match = 0;
     620        psListIteratorSet(iter,PS_LIST_TAIL);
     621        while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
     622            if (regexec(preg, cursor->name, 0, NULL, 0) == 0) {
     623                // this key is a match
     624                match--;
     625                if (match == location) {
     626                    break;
     627                }
     628            }
     629            (void)psListGetAndDecrement(iter);
     630        }
     631        return (match == location);
     632    }
     633
     634    // find the n-th match from the head
     635    match = -1;
     636    psListIteratorSet(iter,PS_LIST_HEAD);
     637    while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
     638        if (regexec(preg, cursor->name, 0, NULL, 0) == 0) {
     639            // this key is a match
     640            match++;
     641            if (match == location) {
     642                break;
     643            }
     644        }
     645        (void)psListGetAndIncrement(iter);
     646    }
     647    return (match == location);
     648}
     649
     650psMetadataItem* psMetadataGetAndIncrement(psMetadataIterator* iterator)
     651{
     652    psMetadataItem* oldValue;
     653
     654    PS_PTR_CHECK_NULL(iterator,NULL);
     655
     656    psListIterator* iter = iterator->iter;
     657    PS_PTR_CHECK_NULL(iterator->iter,NULL);
     658
     659    regex_t* preg = iterator->preg;
     660
     661    // handle trivial case where no regex subsetting is required.
     662    if (preg == NULL) {
     663        return (psMetadataItem*)psListGetAndIncrement(iter);
     664    }
     665
     666    oldValue = (psMetadataItem*)iter->cursor;
     667
     668    while (psListGetAndIncrement(iter) != NULL) {
     669        if (iter->cursor != NULL &&
     670                regexec(preg, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
     671            // this key is a match
     672            break;
     673        }
     674    }
     675    return oldValue;
     676}
     677
     678psMetadataItem* psMetadataGetAndDecrement(psMetadataIterator* iterator)
     679{
     680    psMetadataItem* oldValue;
     681
     682    PS_PTR_CHECK_NULL(iterator,NULL);
     683
     684    psListIterator* iter = iterator->iter;
     685    PS_PTR_CHECK_NULL(iterator->iter,NULL);
     686
     687    regex_t* preg = iterator->preg;
     688
     689    // handle trivial case where no regex subsetting is required.
     690    if (preg == NULL) {
     691        return (psMetadataItem*)psListGetAndDecrement(iter);
     692    }
     693
     694    oldValue = (psMetadataItem*)iter->cursor;
     695
     696    while (psListGetAndDecrement(iter) != NULL) {
     697        if (iter->cursor != NULL &&
     698                regexec(preg, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
     699            // this key is a match
     700            break;
     701        }
     702    }
     703    return oldValue;
     704}
  • trunk/psLib/src/astronomy/psMetadata.h

    r3341 r3381  
    1111*  @author Ross Harman, MHPCC
    1212*
    13 *  @version $Revision: 1.38 $ $Name: not supported by cvs2svn $
    14 *  @date $Date: 2005-02-28 23:34:10 $
     13*  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
     14*  @date $Date: 2005-03-07 20:58:50 $
    1515*
    1616*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    2121#include <stdarg.h>
    2222#include <stdio.h>
     23#include <sys/types.h>
     24#include <regex.h>
    2325
    2426#include "psHash.h"
     
    3537 */
    3638typedef enum {
    37     PS_META_S32,                       ///< Primitive data.
    38     PS_META_F32,                       ///< Primitive data.
    39     PS_META_F64,                       ///< Primitive data.
    40     PS_META_BOOL,                       ///< Primitive data.
     39    PS_META_S32,                       ///< psS32 primitive data.
     40    PS_META_F32,                       ///< psF32 primitive data.
     41    PS_META_F64,                       ///< psF64 primitive data.
     42    PS_META_BOOL,                      ///< psBool primitive data.
    4143    PS_META_LIST,                      ///< List data (Stored as item.data.list).
    4244    PS_META_STR,                       ///< String data (Stored as item.data.V).
     
    4951    PS_META_ASTROM,                    ///< Astrometric coefficients (Stored as item.data.V).
    5052    PS_META_UNKNOWN,                   ///< Other data (Stored as item.data.V).
     53    PS_META_MULTI,                     ///< Used internally, do not create an metadata item of this type.
    5154    PS_META_NTYPE                      ///< Number of types. Must be last.
    5255} psMetadataType;
     
    7275typedef enum {
    7376    PS_META_DEFAULT = 0,               ///< default behaviour (duplicate entry is an error)
    74     PS_META_REPLACE = 0x10000          ///< allow entry to be replaced
     77    PS_META_REPLACE = 0x1000000,       ///< allow entry to be replaced
     78    PS_META_DUPLICATE_OK = 0x2000000   ///< allow duplicate entries
    7579} psMetadataFlags;
     80
     81#define PS_METADATA_FLAGS_MASK 0xFF000000
     82#define PS_METADATA_TYPE_MASK 0x00FFFFFF
    7683
    7784/** Metadata data structure.
     
    8895}
    8996psMetadata;
     97
     98/** Metadata iterator
     99 *
     100 *  Iterator for metadata.
     101 */
     102typedef struct
     103{
     104    psListIterator* iter;              ///< iterator for the psMetadata's psList
     105    regex_t* preg;                     ///< the subsetting regular expression
     106}
     107psMetadataIterator;
     108
    90109
    91110/** Metadata item data structure.
     
    134153);
    135154
     155/** Create a metadata item with specified string data.
     156 *
     157 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     158 *  struct.
     159 *
     160 * @return psMetadataItem* : Pointer metadata item.
     161 */
    136162psMetadataItem* psMetadataItemAllocStr(
    137     const char* name,
    138     const char* comment,
    139     const char* value
    140 );
    141 
     163    const char* name,                  ///< Name of metadata item.
     164    const char* comment,               ///< Comment for metadata item.
     165    const char* value                  ///< the value of the metadata item.
     166);
     167
     168/** Create a metadata item with specified psF32 data.
     169 *
     170 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     171 *  struct.
     172 *
     173 * @return psMetadataItem* : Pointer metadata item.
     174 */
    142175psMetadataItem* psMetadataItemAllocF32(
    143     const char* name,
    144     const char* comment,
    145     psF32 value
    146 );
    147 
     176    const char* name,                  ///< Name of metadata item.
     177    const char* comment,               ///< Comment for metadata item.
     178    psF32 value                        ///< the value of the metadata item.
     179);
     180
     181/** Create a metadata item with specified psF64 data.
     182 *
     183 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     184 *  struct.
     185 *
     186 * @return psMetadataItem* : Pointer metadata item.
     187 */
    148188psMetadataItem* psMetadataItemAllocF64(
    149     const char* name,
    150     const char* comment,
    151     psF64 value
    152 );
    153 
     189    const char* name,                  ///< Name of metadata item.
     190    const char* comment,               ///< Comment for metadata item.
     191    psF64 value                        ///< the value of the metadata item.
     192);
     193
     194/** Create a metadata item with specified psS32 data.
     195 *
     196 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     197 *  struct.
     198 *
     199 * @return psMetadataItem* : Pointer metadata item.
     200 */
    154201psMetadataItem* psMetadataItemAllocS32(
    155     const char* name,
    156     const char* comment,
    157     psS32 value
    158 );
    159 
     202    const char* name,                  ///< Name of metadata item.
     203    const char* comment,               ///< Comment for metadata item.
     204    psS32 value                        ///< the value of the metadata item.
     205);
     206
     207/** Create a metadata item with specified psBool data.
     208 *
     209 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     210 *  struct.
     211 *
     212 * @return psMetadataItem* : Pointer metadata item.
     213 */
    160214psMetadataItem* psMetadataItemAllocBool(
    161     const char* name,
    162     const char* comment,
    163     psBool value
     215    const char* name,                  ///< Name of metadata item.
     216    const char* comment,               ///< Comment for metadata item.
     217    psBool value                       ///< the value of the metadata item.
    164218);
    165219
     
    207261    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
    208262    psMetadataItem*  item,             ///< Metadata item to be added.
    209     psS32 location                     ///< Location to be added.
     263    psS32 location,                    ///< Location to be added.
     264    psS32 flags                        ///< Options flag mask, see psMetadataFlags enum
    210265);
    211266
     
    218273psBool psMetadataAdd(
    219274    psMetadata* md,                    ///< Metadata collection to insert metadat item.
    220     psS32 where,                       ///< Location to be added.
     275    psS32 location,                    ///< Location to be added.
    221276    const char *name,                  ///< Name of metadata item.
    222     psMetadataType type,               ///< Type of metadata item.
     277    int type,                          ///< Type of metadata item (psMetadataType) and options (psMetadataFlags)
    223278    const char *comment,               ///< Comment for metadata item.
    224279    ...                                ///< Arguments for name formatting and metadata item data.
    225280);
    226281
    227 psBool psMetadataAddS32(psMetadata* md, psS32 where, const char* name,
     282#ifndef SWIG
     283/** Create and add a metadata item to metadata collection.
     284 *
     285 * Creates a new metadata item add to the metadata collection.
     286 *
     287 * @return bool: True for success, false for failure.
     288 */
     289psBool psMetadataAddV(
     290    psMetadata* md,                    ///< Metadata collection to insert metadat item.
     291    psS32 location,                    ///< Location to be added.
     292    const char *name,                  ///< Name of metadata item.
     293    int type,                          ///< Type of metadata item (psMetadataType) and options (psMetadataFlags)
     294    const char *comment,               ///< Comment for metadata item.
     295    va_list list                       ///< Arguments for name formatting and metadata item data.
     296);
     297#endif
     298
     299psBool psMetadataAddS32(psMetadata* md, psS32 location, const char* name,
    228300                        const char* comment, psS32 value);
    229 psBool psMetadataAddF32(psMetadata* md, psS32 where, const char* name,
     301psBool psMetadataAddF32(psMetadata* md, psS32 location, const char* name,
    230302                        const char* comment, psF32 value);
    231 psBool psMetadataAddF64(psMetadata* md, psS32 where, const char* name,
     303psBool psMetadataAddF64(psMetadata* md, psS32 location, const char* name,
    232304                        const char* comment, psF64 value);
    233 psBool psMetadataAddList(psMetadata* md, psS32 where, const char* name,
     305psBool psMetadataAddList(psMetadata* md, psS32 location, const char* name,
    234306                         const char* comment, psList* value);
    235 psBool psMetadataAddStr(psMetadata* md, psS32 where, const char* name,
     307psBool psMetadataAddStr(psMetadata* md, psS32 location, const char* name,
    236308                        const char* comment, const char* value);
    237 psBool psMetadataAddVector(psMetadata* md, psS32 where, const char* name,
     309psBool psMetadataAddVector(psMetadata* md, psS32 location, const char* name,
    238310                           const char* comment, psVector* value);
    239 psBool psMetadataAddImage(psMetadata* md, psS32 where, const char* name,
     311psBool psMetadataAddImage(psMetadata* md, psS32 location, const char* name,
    240312                          const char* comment, psImage* value);
    241 psBool psMetadataAddHash(psMetadata* md, psS32 where, const char* name,
     313psBool psMetadataAddHash(psMetadata* md, psS32 location, const char* name,
    242314                         const char* comment, psHash* value);
    243 psBool psMetadataAddLookupTable(psMetadata* md, psS32 where, const char* name,
     315psBool psMetadataAddLookupTable(psMetadata* md, psS32 location, const char* name,
    244316                                const char* comment, psLookupTable* value);
    245 psBool psMetadataAddUnknown(psMetadata* md, psS32 where, const char* name,
     317psBool psMetadataAddUnknown(psMetadata* md, psS32 location, const char* name,
    246318                            const char* comment, psPtr value);
    247319
     
    340412 * @return void* : Value of metadata item.
    341413 */
    342 void* psMetadataLookupPtr(
     414psPtr psMetadataLookupPtr(
    343415    psBool *status,                    ///< Status of lookup.
    344416    psMetadata* md,                    ///< Metadata collection to lookup metadata item.
     
    354426 */
    355427psMetadataItem* psMetadataGet(
    356     psMetadata*  md,           ///< Metadata collection to insert metadat item.
    357     psS32 where                ///< Location to be retrieved.
     428    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
     429    psS32 location                     ///< Location to be retrieved.
     430);
     431
     432/** Creates a psMetadataIterator to iterate over the specified psMetadata.
     433 *
     434 *  Supports the subsetting of the metadata via keyword using regular
     435 *  expression.  If no regular expression is specified, iteration
     436 *  over the entire psMetadata is performed.
     437 *
     438 *  @return psMetadataIterator*        a new psMetadataIterator, of NULL if error occurred
     439 */
     440psMetadataIterator* psMetadataIteratorAlloc(
     441    psMetadata* md,                    ///< the psMetadata to iterate with
     442    int location,                      ///< the initial starting point (after subsetting).
     443    const char* regex
     444    ///< A regular expression for subsetting the psMetadata.  If NULL, no
     445    ///< subsetting is performed.
     446);
     447
     448/** Set the iterator of the psMetadat to a given position.  If location is
     449 *  invalid the iterator position is not changed.
     450 *
     451 *  @return psBool        TRUE if iterator successfully set, otherwise FALSE.
     452*/
     453psBool psMetadataIteratorSet(
     454    psMetadataIterator* iterator,      ///< psMetadata iterator
     455    int location                       ///< index number, PS_LIST_HEAD, or PS_LIST_TAIL
     456);
     457
     458/** Position the specified iterator to the next matching item in psMetadata,
     459 *  given the regular expression of the iterator
     460 *
     461 *  @return psPtr       the psMetadataItem at the original iterator position
     462 *                      or NULL if the iterator went past the end of the list.
     463 */
     464psMetadataItem* psMetadataGetAndIncrement(
     465    psMetadataIterator* iterator           ///< iterator to move
     466);
     467
     468/** Position the specified iterator to the previous matching item in psMetadata,
     469 *  given the regular expression of the iterator
     470 *
     471 *  @return psPtr       the psMetadataItem at the original iterator position
     472 *                      or NULL if the iterator went past the beginning of the
     473 *                      list.
     474 */
     475psMetadataItem* psMetadataGetAndDecrement(
     476    psMetadataIterator* iterator           ///< iterator to move
    358477);
    359478
  • 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,
  • trunk/psLib/src/astronomy/psMetadataIO.h

    r3264 r3381  
    11/** @file  psMetadataIO.h
    2 *
    3 *  @brief Contains metadata input/output functions.
    4 *
    5 *  This file defines functions to read and write metadata to/from an external file.
    6 *
    7 *  @ingroup Metadata
    8 *
    9 *  @author Ross Harman, MHPCC
    10 *
    11 *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
    12 *  @date $Date: 2005-02-17 19:26:23 $
    13 *
    14 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    15 */
     2 *
     3 *  @brief Contains metadata input/output functions.
     4 *
     5 *  This file defines functions to read and write metadata to/from an external file.
     6 *
     7 *  @ingroup Metadata
     8 *
     9 *  @author Ross Harman, MHPCC
     10 *  @author Robert DeSonia, MHPCC
     11 *
     12 *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-03-07 20:58:50 $
     14 *
     15 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     16 */
    1617#ifndef PS_METADATAIO_H
    1718#define PS_METADATAIO_H
    18 
    1919
    2020/// @addtogroup Metadata
  • trunk/psLib/src/collections/psList.h

    r3264 r3381  
    1010 *  @ingroup LinkedList
    1111 *
    12  *  @version $Revision: 1.21 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2005-02-17 19:26:23 $
     12 *  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-03-07 20:58:50 $
    1414 *
    1515 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    174174/** Position the specified iterator to the next item in list.
    175175 *
    176  *  @return psPtr       the data item at the new iterator position or NULL if the
    177  *                      iterator goes past the end of the list.
     176 *  @return psPtr       the data item at the original iterator position or NULL if the
     177 *                      iterator went past the end of the list.
    178178 */
    179179psPtr psListGetAndIncrement(
     
    183183/** Position the specified iterator to the previous item in list.
    184184 *
    185  *  @return psPtr       the data item at the new iterator position or NULL if the
    186  *                      iterator goes past the beginning of the list.
     185 *  @return psPtr       the data item at the original iterator position or NULL if the
     186 *                      iterator went past the beginning of the list.
    187187 */
    188188psPtr psListGetAndDecrement(
  • trunk/psLib/src/collections/psMetadata.c

    r3341 r3381  
    1212*  @author Ross Harman, MHPCC
    1313*
    14 *  @version $Revision: 1.53 $ $Name: not supported by cvs2svn $
    15 *  @date $Date: 2005-02-28 23:34:10 $
     14*  @version $Revision: 1.54 $ $Name: not supported by cvs2svn $
     15*  @date $Date: 2005-03-07 20:58:50 $
    1616*
    1717*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    8585}
    8686
     87static void metadataIteratorFree(psMetadataIterator* iter)
     88{
     89    if (iter == NULL) {
     90        return;
     91    }
     92    psFree(iter->iter);
     93    regfree(iter->preg);
     94}
     95
    8796static void metadataFree(psMetadata* metadata)
    8897{
     
    158167
    159168    // Set metadata item type
    160     metadataItem->type = type;
     169    metadataItem->type = type & PS_METADATA_TYPE_MASK;
    161170
    162171    // Allocate and set metadata item name
     
    165174
    166175    // Set metadata item value
    167     switch(type) {
     176    switch(metadataItem->type) {
    168177    case PS_META_BOOL:
    169178        metadataItem->data.B = (psBool)va_arg(argPtr, psS32);
     
    190199    case PS_META_ASTROM:
    191200    case PS_META_UNKNOWN:
     201    case PS_META_MULTI:
    192202        // Copy of input data not performed due to variability of data types
    193203        metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr));
     
    223233}
    224234
    225 psBool psMetadataAddItem(psMetadata *md, psMetadataItem *metadataItem, psS32 location)
     235psBool psMetadataAddItem(psMetadata *md, psMetadataItem *metadataItem, psS32 location, psS32 flags)
    226236{
    227237    char * key = NULL;
     
    229239    psList *mdList = NULL;
    230240    psMetadataItem *existingEntry = NULL;
    231     psMetadataItem *newFolderEntry = NULL;
    232     psMetadataType newType;
    233241
    234242    PS_PTR_CHECK_NULL(md,NULL);
     
    238246    PS_PTR_CHECK_NULL(metadataItem->name,NULL);
    239247
    240     newType = metadataItem->type;
    241248    mdTable = md->table;
    242249    mdList = md->list;
     
    245252    // See if key is already in table
    246253    existingEntry = (psMetadataItem*)psHashLookup(mdTable, key);
     254
     255    // how the item is added to the hash depends on flags & prior existence
    247256    if(existingEntry != NULL) {
    248 
    249         if(existingEntry->type == PS_META_LIST) {
    250 
    251             if(existingEntry->data.list == NULL) {
    252                 existingEntry->data.list = psListAlloc(NULL);
     257        if ((flags & PS_META_DUPLICATE_OK) != 0) {
     258            // duplicate entries allowed - add another entry.
     259            if (existingEntry->type != PS_META_MULTI) {
     260                // first duplicate, transfer the hash's old entry into a
     261                // list of entries with the type PS_META_MULTI.
     262
     263                // add entry to a list and dereference the local pointer
     264                psList* newList = psListAlloc(existingEntry);
     265
     266                existingEntry = psMetadataItemAlloc(key,
     267                                                    PS_META_MULTI,
     268                                                    "",
     269                                                    newList);
     270                psHashRemove(mdTable,key); // take out the old entry
     271                psHashAdd(mdTable, key, existingEntry); // put in the new entry
     272
     273                // free local references of newly allocated items.
     274                psFree(newList);
     275                psFree(existingEntry);
     276
    253277            }
    254278
    255             // Add leaf node to existing folder node
    256             if(!psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem)) {
    257                 psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED, metadataItem->name);
     279            // add to the hash's list of duplicate entries
     280            if (! psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem) ) {
     281                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
    258282                return false;
    259283            }
    260         } else if(existingEntry->type != PS_META_LIST && newType!= PS_META_LIST) {
    261 
    262             // Leaf node replaces another leaf. Make new folder node and add leaves.
    263             newFolderEntry = psMetadataItemAlloc(key, PS_META_LIST, NULL, NULL);
    264             newFolderEntry->data.list = psListAlloc(NULL);
    265 
    266             if(!psListAdd(newFolderEntry->data.list, PS_LIST_TAIL, existingEntry)) {
    267                 psError(PS_ERR_UNKNOWN,false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
    268                 psFree(newFolderEntry);
    269                 return false;
    270             }
    271 
    272             if(!psListAdd(newFolderEntry->data.list, PS_LIST_TAIL, metadataItem)) {
    273                 psError(PS_ERR_UNKNOWN,false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
    274                 psFree(newFolderEntry);
    275                 return false;
    276             }
    277 
    278             if(!psHashRemove(mdTable, key)) {
    279                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,key);
    280                 psFree(newFolderEntry);
    281                 return false;
    282             }
    283 
    284             if(!psHashAdd(mdTable, key, newFolderEntry)) {
    285                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
    286                 psFree(newFolderEntry);
    287                 return false;
    288             }
    289 
    290             // Remove local reference to new folder node
    291             psMemDecrRefCounter(newFolderEntry);
    292         } else {
    293 
    294             // Folder node replaces leaf or folder node - Put old node into new folder and remove from table
    295             if(metadataItem->data.list == NULL) {
    296                 metadataItem->data.list = psListAlloc(NULL);
    297             }
    298 
    299             if(!psListAdd(metadataItem->data.list, PS_LIST_TAIL, existingEntry)) {
    300                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
    301                 return false;
    302             }
    303 
    304             if(!psHashRemove(mdTable, key)) {
    305                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,key);
    306                 return false;
    307             }
    308 
     284            // (added to list below)
     285
     286        } else if ((flags & PS_META_REPLACE) != 0) {
     287            // replace entry instead of creating a duplicate entry.
     288
     289            // remove the existing entry from metadata
     290            psListRemoveData(mdList, existingEntry);
     291            psHashRemove(mdTable, key);
     292
     293            // treat as if new (added to list below)
    309294            if(!psHashAdd(mdTable, key, metadataItem)) {
    310295                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
    311296                return false;
    312297            }
     298        } else {
     299            // default is to error on duplicate entry.
     300            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
     301                    PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED);
     302            return false;
    313303        }
    314304    } else {
     305        // OK, this is a new item.
    315306
    316307        // Node doesn't exist - Add new metadata item to metadata collection's hash
     
    321312    }
    322313
    323     // Add items to metadata collection's list, even if they have the same metadata item names. Folder nodes
    324     // (PS_META_LIST metadata items) are not added, since the metadata list is flat.
    325     if(metadataItem->type != PS_META_LIST) {
    326         if(!psListAdd(mdList, location, metadataItem)) {
    327             psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
    328             return false;
    329         }
     314    if(!psListAdd(mdList, location, metadataItem)) {
     315        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
     316        return false;
    330317    }
    331318
     
    333320}
    334321
    335 psBool psMetadataAdd(psMetadata *md, psS32 where, const char *name,
    336                      psMetadataType type, const char *comment, ...)
     322psBool psMetadataAdd(psMetadata *md, psS32 location, const char *name,
     323                     psS32 type, const char *comment, ...)
    337324{
    338325    va_list argPtr;
     326
     327    va_start(argPtr, comment);
     328    psBool result = psMetadataAddV(md,location,name,type,comment,argPtr);
     329    va_end(argPtr);
     330
     331    return result;
     332}
     333
     334psBool psMetadataAddV(psMetadata *md, psS32 location, const char *name,
     335                      psS32 type, const char *comment, va_list list)
     336{
    339337    psMetadataItem* metadataItem = NULL;
    340338
    341     va_start(argPtr, comment);
    342     metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
    343     va_end(argPtr);
    344 
    345     if (!psMetadataAddItem(md, metadataItem, where)) {
     339    metadataItem = psMetadataItemAllocV(name, type & PS_METADATA_TYPE_MASK, comment, list);
     340
     341    if (!psMetadataAddItem(md, metadataItem, location, type & PS_METADATA_FLAGS_MASK)) {
    346342        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_FAILED);
    347343        psFree(metadataItem);
     
    373369psBool psMetadataRemove(psMetadata *md, psS32 where, const char *key)
    374370{
    375     psList* mdList = NULL;
    376     psHash* mdTable = NULL;
    377     psMetadataItem* entry = NULL;
    378 
    379 
    380371    PS_PTR_CHECK_NULL(md,NULL);
     372
     373    PS_PTR_CHECK_NULL(md->list,NULL);
     374    psList* mdList = md->list;
     375
    381376    PS_PTR_CHECK_NULL(md->table,NULL);
    382     PS_PTR_CHECK_NULL(md->list,NULL);
    383 
    384     mdList = md->list;
    385     mdTable = md->table;
     377    psHash* mdTable = md->table;
    386378
    387379    // Select removal by key or index
    388380    if (key != NULL) {
    389 
    390381        // Remove by key name
    391         entry = (psMetadataItem*)psHashLookup(mdTable, key);
     382        psMetadataItem* entry = psHashLookup(mdTable,key);
    392383        if (entry == NULL) {
    393             psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_FAILED, key);
     384            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
    394385            return false;
    395386        }
    396 
     387        if (entry->type == PS_META_MULTI) {
     388            psMetadataItem* listItem;
     389            psListIterator* iter = psListIteratorAlloc(
     390                                       entry->data.list,
     391                                       PS_LIST_HEAD,true);
     392            while ((listItem=psListGetAndIncrement(iter)) != NULL) {
     393                psListRemoveData(mdList, listItem);
     394            }
     395            psFree(iter);
     396            psHashRemove(mdTable,key);
     397
     398        } else {
     399            psListRemoveData(mdList, entry);
     400            psHashRemove(mdTable, key);
     401        }
    397402    } else {
    398 
    399403        // Remove by index
    400         entry = psListGet(mdList, where);
     404        psMetadataItem* entry = psListGet(mdList, where);
    401405        if (entry == NULL) {
    402406            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED, where);
    403407            return false;
    404408        }
    405 
    406409        key = entry->name;
    407         if(key == NULL) {
     410
     411        if (key == NULL) {
    408412            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_REMOVE_LIST_INDEX_FAILED, where);
    409413            return false;
    410414        }
    411     }
    412 
    413     if (!psListRemoveData(mdList, entry)) {
    414         psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_LIST_FAILED, key);
    415         return false;
    416     }
    417 
    418     // Remove entry from metadata collection's table
    419     if (!psHashRemove(mdTable, key)) {
    420         psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
    421         return false;
     415
     416        psMetadataItem* tableItem = psHashLookup(mdTable, key);
     417        if (tableItem == NULL) {
     418            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
     419            return false;
     420        }
     421
     422        if (tableItem->type == PS_META_MULTI) {
     423            // multiple entries with same key, remove just the specified one
     424            psListRemoveData(tableItem->data.list, entry);
     425            if (psListGet(tableItem->data.list,PS_LIST_HEAD) == NULL) {
     426                // list is empty, so let's clear the whole entry now.
     427                if (!psHashRemove(mdTable, key)) {
     428                    psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
     429                    return false;
     430                }
     431            }
     432        } else {
     433            if (!psHashRemove(mdTable, key)) {
     434                psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
     435                return false;
     436            }
     437        }
     438        psListRemove(mdList, where);
    422439    }
    423440
     
    455472        }
    456473        return NULL;
     474    }
     475    if (metadataItem->type == PS_META_MULTI) {
     476        // if multiple keys found, use the first.
     477        metadataItem = (psMetadataItem*)((metadataItem->data.list)->head);
    457478    }
    458479
     
    486507        } \
    487508        return 0; \
     509    } \
     510    if (metadataItem->type == PS_META_MULTI) { \
     511        /* if multiple keys found, use the first. */ \
     512        metadataItem = (psMetadataItem*)((metadataItem->data.list)->head); \
    488513    } \
    489514    \
     
    535560    return entry;
    536561}
     562
     563psMetadataIterator* psMetadataIteratorAlloc(psMetadata* md,
     564        int location,
     565        const char* regex)
     566{
     567    PS_PTR_CHECK_NULL(md,NULL);
     568    PS_PTR_CHECK_NULL(md->list,NULL);
     569
     570    psMetadataIterator* newIter = psAlloc(sizeof(psMetadataIterator));
     571    newIter->preg = NULL;
     572    newIter->iter = NULL;
     573
     574    // Set deallocator
     575    p_psMemSetDeallocator(newIter, (psFreeFcn) metadataIteratorFree);
     576
     577    if (regex == NULL) {
     578        newIter->iter = psListIteratorAlloc(md->list, location, false);
     579        return newIter;
     580    } else {
     581        int regRtn = regcomp(newIter->preg,regex,0);
     582        if (regRtn != 0) {
     583            char errMsg[256];
     584            regerror(regRtn, newIter->preg, errMsg, 256);
     585            regfree(newIter->preg);
     586            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
     587                    PS_ERRORTEXT_psMetadata_REGEX_INVALID,
     588                    errMsg);
     589            psFree(newIter);
     590            return NULL;
     591        }
     592    }
     593
     594    psMetadataIteratorSet(newIter, location); // XXX: do we error if no match is found?
     595
     596    return newIter;
     597}
     598
     599psBool psMetadataIteratorSet(psMetadataIterator* iterator,
     600                             int location)
     601{
     602    int match;
     603    psMetadataItem* cursor;
     604
     605    PS_PTR_CHECK_NULL(iterator,NULL);
     606
     607    psListIterator* iter = iterator->iter;
     608    PS_PTR_CHECK_NULL(iterator->iter,NULL);
     609
     610    regex_t* preg = iterator->preg;
     611
     612    // handle trivial case where no regex subsetting is required.
     613    if (preg == NULL) {
     614        return psListIteratorSet(iter,location);
     615    }
     616
     617    if (location < 0) {
     618        // match from the tail
     619        match = 0;
     620        psListIteratorSet(iter,PS_LIST_TAIL);
     621        while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
     622            if (regexec(preg, cursor->name, 0, NULL, 0) == 0) {
     623                // this key is a match
     624                match--;
     625                if (match == location) {
     626                    break;
     627                }
     628            }
     629            (void)psListGetAndDecrement(iter);
     630        }
     631        return (match == location);
     632    }
     633
     634    // find the n-th match from the head
     635    match = -1;
     636    psListIteratorSet(iter,PS_LIST_HEAD);
     637    while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
     638        if (regexec(preg, cursor->name, 0, NULL, 0) == 0) {
     639            // this key is a match
     640            match++;
     641            if (match == location) {
     642                break;
     643            }
     644        }
     645        (void)psListGetAndIncrement(iter);
     646    }
     647    return (match == location);
     648}
     649
     650psMetadataItem* psMetadataGetAndIncrement(psMetadataIterator* iterator)
     651{
     652    psMetadataItem* oldValue;
     653
     654    PS_PTR_CHECK_NULL(iterator,NULL);
     655
     656    psListIterator* iter = iterator->iter;
     657    PS_PTR_CHECK_NULL(iterator->iter,NULL);
     658
     659    regex_t* preg = iterator->preg;
     660
     661    // handle trivial case where no regex subsetting is required.
     662    if (preg == NULL) {
     663        return (psMetadataItem*)psListGetAndIncrement(iter);
     664    }
     665
     666    oldValue = (psMetadataItem*)iter->cursor;
     667
     668    while (psListGetAndIncrement(iter) != NULL) {
     669        if (iter->cursor != NULL &&
     670                regexec(preg, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
     671            // this key is a match
     672            break;
     673        }
     674    }
     675    return oldValue;
     676}
     677
     678psMetadataItem* psMetadataGetAndDecrement(psMetadataIterator* iterator)
     679{
     680    psMetadataItem* oldValue;
     681
     682    PS_PTR_CHECK_NULL(iterator,NULL);
     683
     684    psListIterator* iter = iterator->iter;
     685    PS_PTR_CHECK_NULL(iterator->iter,NULL);
     686
     687    regex_t* preg = iterator->preg;
     688
     689    // handle trivial case where no regex subsetting is required.
     690    if (preg == NULL) {
     691        return (psMetadataItem*)psListGetAndDecrement(iter);
     692    }
     693
     694    oldValue = (psMetadataItem*)iter->cursor;
     695
     696    while (psListGetAndDecrement(iter) != NULL) {
     697        if (iter->cursor != NULL &&
     698                regexec(preg, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
     699            // this key is a match
     700            break;
     701        }
     702    }
     703    return oldValue;
     704}
  • trunk/psLib/src/collections/psMetadata.h

    r3341 r3381  
    1111*  @author Ross Harman, MHPCC
    1212*
    13 *  @version $Revision: 1.38 $ $Name: not supported by cvs2svn $
    14 *  @date $Date: 2005-02-28 23:34:10 $
     13*  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
     14*  @date $Date: 2005-03-07 20:58:50 $
    1515*
    1616*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    2121#include <stdarg.h>
    2222#include <stdio.h>
     23#include <sys/types.h>
     24#include <regex.h>
    2325
    2426#include "psHash.h"
     
    3537 */
    3638typedef enum {
    37     PS_META_S32,                       ///< Primitive data.
    38     PS_META_F32,                       ///< Primitive data.
    39     PS_META_F64,                       ///< Primitive data.
    40     PS_META_BOOL,                       ///< Primitive data.
     39    PS_META_S32,                       ///< psS32 primitive data.
     40    PS_META_F32,                       ///< psF32 primitive data.
     41    PS_META_F64,                       ///< psF64 primitive data.
     42    PS_META_BOOL,                      ///< psBool primitive data.
    4143    PS_META_LIST,                      ///< List data (Stored as item.data.list).
    4244    PS_META_STR,                       ///< String data (Stored as item.data.V).
     
    4951    PS_META_ASTROM,                    ///< Astrometric coefficients (Stored as item.data.V).
    5052    PS_META_UNKNOWN,                   ///< Other data (Stored as item.data.V).
     53    PS_META_MULTI,                     ///< Used internally, do not create an metadata item of this type.
    5154    PS_META_NTYPE                      ///< Number of types. Must be last.
    5255} psMetadataType;
     
    7275typedef enum {
    7376    PS_META_DEFAULT = 0,               ///< default behaviour (duplicate entry is an error)
    74     PS_META_REPLACE = 0x10000          ///< allow entry to be replaced
     77    PS_META_REPLACE = 0x1000000,       ///< allow entry to be replaced
     78    PS_META_DUPLICATE_OK = 0x2000000   ///< allow duplicate entries
    7579} psMetadataFlags;
     80
     81#define PS_METADATA_FLAGS_MASK 0xFF000000
     82#define PS_METADATA_TYPE_MASK 0x00FFFFFF
    7683
    7784/** Metadata data structure.
     
    8895}
    8996psMetadata;
     97
     98/** Metadata iterator
     99 *
     100 *  Iterator for metadata.
     101 */
     102typedef struct
     103{
     104    psListIterator* iter;              ///< iterator for the psMetadata's psList
     105    regex_t* preg;                     ///< the subsetting regular expression
     106}
     107psMetadataIterator;
     108
    90109
    91110/** Metadata item data structure.
     
    134153);
    135154
     155/** Create a metadata item with specified string data.
     156 *
     157 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     158 *  struct.
     159 *
     160 * @return psMetadataItem* : Pointer metadata item.
     161 */
    136162psMetadataItem* psMetadataItemAllocStr(
    137     const char* name,
    138     const char* comment,
    139     const char* value
    140 );
    141 
     163    const char* name,                  ///< Name of metadata item.
     164    const char* comment,               ///< Comment for metadata item.
     165    const char* value                  ///< the value of the metadata item.
     166);
     167
     168/** Create a metadata item with specified psF32 data.
     169 *
     170 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     171 *  struct.
     172 *
     173 * @return psMetadataItem* : Pointer metadata item.
     174 */
    142175psMetadataItem* psMetadataItemAllocF32(
    143     const char* name,
    144     const char* comment,
    145     psF32 value
    146 );
    147 
     176    const char* name,                  ///< Name of metadata item.
     177    const char* comment,               ///< Comment for metadata item.
     178    psF32 value                        ///< the value of the metadata item.
     179);
     180
     181/** Create a metadata item with specified psF64 data.
     182 *
     183 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     184 *  struct.
     185 *
     186 * @return psMetadataItem* : Pointer metadata item.
     187 */
    148188psMetadataItem* psMetadataItemAllocF64(
    149     const char* name,
    150     const char* comment,
    151     psF64 value
    152 );
    153 
     189    const char* name,                  ///< Name of metadata item.
     190    const char* comment,               ///< Comment for metadata item.
     191    psF64 value                        ///< the value of the metadata item.
     192);
     193
     194/** Create a metadata item with specified psS32 data.
     195 *
     196 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     197 *  struct.
     198 *
     199 * @return psMetadataItem* : Pointer metadata item.
     200 */
    154201psMetadataItem* psMetadataItemAllocS32(
    155     const char* name,
    156     const char* comment,
    157     psS32 value
    158 );
    159 
     202    const char* name,                  ///< Name of metadata item.
     203    const char* comment,               ///< Comment for metadata item.
     204    psS32 value                        ///< the value of the metadata item.
     205);
     206
     207/** Create a metadata item with specified psBool data.
     208 *
     209 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     210 *  struct.
     211 *
     212 * @return psMetadataItem* : Pointer metadata item.
     213 */
    160214psMetadataItem* psMetadataItemAllocBool(
    161     const char* name,
    162     const char* comment,
    163     psBool value
     215    const char* name,                  ///< Name of metadata item.
     216    const char* comment,               ///< Comment for metadata item.
     217    psBool value                       ///< the value of the metadata item.
    164218);
    165219
     
    207261    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
    208262    psMetadataItem*  item,             ///< Metadata item to be added.
    209     psS32 location                     ///< Location to be added.
     263    psS32 location,                    ///< Location to be added.
     264    psS32 flags                        ///< Options flag mask, see psMetadataFlags enum
    210265);
    211266
     
    218273psBool psMetadataAdd(
    219274    psMetadata* md,                    ///< Metadata collection to insert metadat item.
    220     psS32 where,                       ///< Location to be added.
     275    psS32 location,                    ///< Location to be added.
    221276    const char *name,                  ///< Name of metadata item.
    222     psMetadataType type,               ///< Type of metadata item.
     277    int type,                          ///< Type of metadata item (psMetadataType) and options (psMetadataFlags)
    223278    const char *comment,               ///< Comment for metadata item.
    224279    ...                                ///< Arguments for name formatting and metadata item data.
    225280);
    226281
    227 psBool psMetadataAddS32(psMetadata* md, psS32 where, const char* name,
     282#ifndef SWIG
     283/** Create and add a metadata item to metadata collection.
     284 *
     285 * Creates a new metadata item add to the metadata collection.
     286 *
     287 * @return bool: True for success, false for failure.
     288 */
     289psBool psMetadataAddV(
     290    psMetadata* md,                    ///< Metadata collection to insert metadat item.
     291    psS32 location,                    ///< Location to be added.
     292    const char *name,                  ///< Name of metadata item.
     293    int type,                          ///< Type of metadata item (psMetadataType) and options (psMetadataFlags)
     294    const char *comment,               ///< Comment for metadata item.
     295    va_list list                       ///< Arguments for name formatting and metadata item data.
     296);
     297#endif
     298
     299psBool psMetadataAddS32(psMetadata* md, psS32 location, const char* name,
    228300                        const char* comment, psS32 value);
    229 psBool psMetadataAddF32(psMetadata* md, psS32 where, const char* name,
     301psBool psMetadataAddF32(psMetadata* md, psS32 location, const char* name,
    230302                        const char* comment, psF32 value);
    231 psBool psMetadataAddF64(psMetadata* md, psS32 where, const char* name,
     303psBool psMetadataAddF64(psMetadata* md, psS32 location, const char* name,
    232304                        const char* comment, psF64 value);
    233 psBool psMetadataAddList(psMetadata* md, psS32 where, const char* name,
     305psBool psMetadataAddList(psMetadata* md, psS32 location, const char* name,
    234306                         const char* comment, psList* value);
    235 psBool psMetadataAddStr(psMetadata* md, psS32 where, const char* name,
     307psBool psMetadataAddStr(psMetadata* md, psS32 location, const char* name,
    236308                        const char* comment, const char* value);
    237 psBool psMetadataAddVector(psMetadata* md, psS32 where, const char* name,
     309psBool psMetadataAddVector(psMetadata* md, psS32 location, const char* name,
    238310                           const char* comment, psVector* value);
    239 psBool psMetadataAddImage(psMetadata* md, psS32 where, const char* name,
     311psBool psMetadataAddImage(psMetadata* md, psS32 location, const char* name,
    240312                          const char* comment, psImage* value);
    241 psBool psMetadataAddHash(psMetadata* md, psS32 where, const char* name,
     313psBool psMetadataAddHash(psMetadata* md, psS32 location, const char* name,
    242314                         const char* comment, psHash* value);
    243 psBool psMetadataAddLookupTable(psMetadata* md, psS32 where, const char* name,
     315psBool psMetadataAddLookupTable(psMetadata* md, psS32 location, const char* name,
    244316                                const char* comment, psLookupTable* value);
    245 psBool psMetadataAddUnknown(psMetadata* md, psS32 where, const char* name,
     317psBool psMetadataAddUnknown(psMetadata* md, psS32 location, const char* name,
    246318                            const char* comment, psPtr value);
    247319
     
    340412 * @return void* : Value of metadata item.
    341413 */
    342 void* psMetadataLookupPtr(
     414psPtr psMetadataLookupPtr(
    343415    psBool *status,                    ///< Status of lookup.
    344416    psMetadata* md,                    ///< Metadata collection to lookup metadata item.
     
    354426 */
    355427psMetadataItem* psMetadataGet(
    356     psMetadata*  md,           ///< Metadata collection to insert metadat item.
    357     psS32 where                ///< Location to be retrieved.
     428    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
     429    psS32 location                     ///< Location to be retrieved.
     430);
     431
     432/** Creates a psMetadataIterator to iterate over the specified psMetadata.
     433 *
     434 *  Supports the subsetting of the metadata via keyword using regular
     435 *  expression.  If no regular expression is specified, iteration
     436 *  over the entire psMetadata is performed.
     437 *
     438 *  @return psMetadataIterator*        a new psMetadataIterator, of NULL if error occurred
     439 */
     440psMetadataIterator* psMetadataIteratorAlloc(
     441    psMetadata* md,                    ///< the psMetadata to iterate with
     442    int location,                      ///< the initial starting point (after subsetting).
     443    const char* regex
     444    ///< A regular expression for subsetting the psMetadata.  If NULL, no
     445    ///< subsetting is performed.
     446);
     447
     448/** Set the iterator of the psMetadat to a given position.  If location is
     449 *  invalid the iterator position is not changed.
     450 *
     451 *  @return psBool        TRUE if iterator successfully set, otherwise FALSE.
     452*/
     453psBool psMetadataIteratorSet(
     454    psMetadataIterator* iterator,      ///< psMetadata iterator
     455    int location                       ///< index number, PS_LIST_HEAD, or PS_LIST_TAIL
     456);
     457
     458/** Position the specified iterator to the next matching item in psMetadata,
     459 *  given the regular expression of the iterator
     460 *
     461 *  @return psPtr       the psMetadataItem at the original iterator position
     462 *                      or NULL if the iterator went past the end of the list.
     463 */
     464psMetadataItem* psMetadataGetAndIncrement(
     465    psMetadataIterator* iterator           ///< iterator to move
     466);
     467
     468/** Position the specified iterator to the previous matching item in psMetadata,
     469 *  given the regular expression of the iterator
     470 *
     471 *  @return psPtr       the psMetadataItem at the original iterator position
     472 *                      or NULL if the iterator went past the beginning of the
     473 *                      list.
     474 */
     475psMetadataItem* psMetadataGetAndDecrement(
     476    psMetadataIterator* iterator           ///< iterator to move
    358477);
    359478
  • trunk/psLib/src/collections/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,
  • trunk/psLib/src/collections/psMetadataIO.h

    r3264 r3381  
    11/** @file  psMetadataIO.h
    2 *
    3 *  @brief Contains metadata input/output functions.
    4 *
    5 *  This file defines functions to read and write metadata to/from an external file.
    6 *
    7 *  @ingroup Metadata
    8 *
    9 *  @author Ross Harman, MHPCC
    10 *
    11 *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
    12 *  @date $Date: 2005-02-17 19:26:23 $
    13 *
    14 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    15 */
     2 *
     3 *  @brief Contains metadata input/output functions.
     4 *
     5 *  This file defines functions to read and write metadata to/from an external file.
     6 *
     7 *  @ingroup Metadata
     8 *
     9 *  @author Ross Harman, MHPCC
     10 *  @author Robert DeSonia, MHPCC
     11 *
     12 *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-03-07 20:58:50 $
     14 *
     15 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     16 */
    1617#ifndef PS_METADATAIO_H
    1718#define PS_METADATAIO_H
    18 
    1919
    2020/// @addtogroup Metadata
  • trunk/psLib/src/sys/psType.h

    r3341 r3381  
    1010*  @author Ross Harman, MHPCC
    1111*
    12 *  @version $Revision: 1.30 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2005-02-28 23:34:10 $
     12*  @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
     13*  @date $Date: 2005-03-07 20:58:50 $
    1414*
    1515*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    5050typedef float psF32;                   ///< 32-bit floating point
    5151typedef double psF64;                  ///< 64-bit floating point
     52
    5253#ifdef SWIG
    5354typedef struct
     
    6566typedef double _Complex psC64;         ///< complex with 64-bit floating point Real and Imagary numbers
    6667#endif
     68
    6769typedef void* psPtr;                   ///< void pointer
    6870typedef bool psBool;                   ///< boolean value
     
    204206#define PS_IS_PSELEMTYPE_BOOL(x) ((x & 0x1000) == 0x1000)
    205207/// Macro to determine the storage size, in bytes, of the psElemType.
    206 #define PSELEMTYPE_SIZEOF(x) ( (x==PS_TYPE_PTR) ? sizeof(psPtr) :(x & 0xFF) )
     208#define PSELEMTYPE_SIZEOF(x) ( (x==(PS_TYPE_PTR&0xFFFF)) ? sizeof(psPtr) :(x & 0xFF) )
    207209
    208210/** Dimensions of a data type.
  • trunk/psLib/src/sysUtils/psType.h

    r3341 r3381  
    1010*  @author Ross Harman, MHPCC
    1111*
    12 *  @version $Revision: 1.30 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2005-02-28 23:34:10 $
     12*  @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
     13*  @date $Date: 2005-03-07 20:58:50 $
    1414*
    1515*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    5050typedef float psF32;                   ///< 32-bit floating point
    5151typedef double psF64;                  ///< 64-bit floating point
     52
    5253#ifdef SWIG
    5354typedef struct
     
    6566typedef double _Complex psC64;         ///< complex with 64-bit floating point Real and Imagary numbers
    6667#endif
     68
    6769typedef void* psPtr;                   ///< void pointer
    6870typedef bool psBool;                   ///< boolean value
     
    204206#define PS_IS_PSELEMTYPE_BOOL(x) ((x & 0x1000) == 0x1000)
    205207/// Macro to determine the storage size, in bytes, of the psElemType.
    206 #define PSELEMTYPE_SIZEOF(x) ( (x==PS_TYPE_PTR) ? sizeof(psPtr) :(x & 0xFF) )
     208#define PSELEMTYPE_SIZEOF(x) ( (x==(PS_TYPE_PTR&0xFFFF)) ? sizeof(psPtr) :(x & 0xFF) )
    207209
    208210/** Dimensions of a data type.
  • trunk/psLib/src/types/psList.h

    r3264 r3381  
    1010 *  @ingroup LinkedList
    1111 *
    12  *  @version $Revision: 1.21 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2005-02-17 19:26:23 $
     12 *  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-03-07 20:58:50 $
    1414 *
    1515 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    174174/** Position the specified iterator to the next item in list.
    175175 *
    176  *  @return psPtr       the data item at the new iterator position or NULL if the
    177  *                      iterator goes past the end of the list.
     176 *  @return psPtr       the data item at the original iterator position or NULL if the
     177 *                      iterator went past the end of the list.
    178178 */
    179179psPtr psListGetAndIncrement(
     
    183183/** Position the specified iterator to the previous item in list.
    184184 *
    185  *  @return psPtr       the data item at the new iterator position or NULL if the
    186  *                      iterator goes past the beginning of the list.
     185 *  @return psPtr       the data item at the original iterator position or NULL if the
     186 *                      iterator went past the beginning of the list.
    187187 */
    188188psPtr psListGetAndDecrement(
  • trunk/psLib/src/types/psMetadata.c

    r3341 r3381  
    1212*  @author Ross Harman, MHPCC
    1313*
    14 *  @version $Revision: 1.53 $ $Name: not supported by cvs2svn $
    15 *  @date $Date: 2005-02-28 23:34:10 $
     14*  @version $Revision: 1.54 $ $Name: not supported by cvs2svn $
     15*  @date $Date: 2005-03-07 20:58:50 $
    1616*
    1717*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    8585}
    8686
     87static void metadataIteratorFree(psMetadataIterator* iter)
     88{
     89    if (iter == NULL) {
     90        return;
     91    }
     92    psFree(iter->iter);
     93    regfree(iter->preg);
     94}
     95
    8796static void metadataFree(psMetadata* metadata)
    8897{
     
    158167
    159168    // Set metadata item type
    160     metadataItem->type = type;
     169    metadataItem->type = type & PS_METADATA_TYPE_MASK;
    161170
    162171    // Allocate and set metadata item name
     
    165174
    166175    // Set metadata item value
    167     switch(type) {
     176    switch(metadataItem->type) {
    168177    case PS_META_BOOL:
    169178        metadataItem->data.B = (psBool)va_arg(argPtr, psS32);
     
    190199    case PS_META_ASTROM:
    191200    case PS_META_UNKNOWN:
     201    case PS_META_MULTI:
    192202        // Copy of input data not performed due to variability of data types
    193203        metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr));
     
    223233}
    224234
    225 psBool psMetadataAddItem(psMetadata *md, psMetadataItem *metadataItem, psS32 location)
     235psBool psMetadataAddItem(psMetadata *md, psMetadataItem *metadataItem, psS32 location, psS32 flags)
    226236{
    227237    char * key = NULL;
     
    229239    psList *mdList = NULL;
    230240    psMetadataItem *existingEntry = NULL;
    231     psMetadataItem *newFolderEntry = NULL;
    232     psMetadataType newType;
    233241
    234242    PS_PTR_CHECK_NULL(md,NULL);
     
    238246    PS_PTR_CHECK_NULL(metadataItem->name,NULL);
    239247
    240     newType = metadataItem->type;
    241248    mdTable = md->table;
    242249    mdList = md->list;
     
    245252    // See if key is already in table
    246253    existingEntry = (psMetadataItem*)psHashLookup(mdTable, key);
     254
     255    // how the item is added to the hash depends on flags & prior existence
    247256    if(existingEntry != NULL) {
    248 
    249         if(existingEntry->type == PS_META_LIST) {
    250 
    251             if(existingEntry->data.list == NULL) {
    252                 existingEntry->data.list = psListAlloc(NULL);
     257        if ((flags & PS_META_DUPLICATE_OK) != 0) {
     258            // duplicate entries allowed - add another entry.
     259            if (existingEntry->type != PS_META_MULTI) {
     260                // first duplicate, transfer the hash's old entry into a
     261                // list of entries with the type PS_META_MULTI.
     262
     263                // add entry to a list and dereference the local pointer
     264                psList* newList = psListAlloc(existingEntry);
     265
     266                existingEntry = psMetadataItemAlloc(key,
     267                                                    PS_META_MULTI,
     268                                                    "",
     269                                                    newList);
     270                psHashRemove(mdTable,key); // take out the old entry
     271                psHashAdd(mdTable, key, existingEntry); // put in the new entry
     272
     273                // free local references of newly allocated items.
     274                psFree(newList);
     275                psFree(existingEntry);
     276
    253277            }
    254278
    255             // Add leaf node to existing folder node
    256             if(!psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem)) {
    257                 psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED, metadataItem->name);
     279            // add to the hash's list of duplicate entries
     280            if (! psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem) ) {
     281                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
    258282                return false;
    259283            }
    260         } else if(existingEntry->type != PS_META_LIST && newType!= PS_META_LIST) {
    261 
    262             // Leaf node replaces another leaf. Make new folder node and add leaves.
    263             newFolderEntry = psMetadataItemAlloc(key, PS_META_LIST, NULL, NULL);
    264             newFolderEntry->data.list = psListAlloc(NULL);
    265 
    266             if(!psListAdd(newFolderEntry->data.list, PS_LIST_TAIL, existingEntry)) {
    267                 psError(PS_ERR_UNKNOWN,false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
    268                 psFree(newFolderEntry);
    269                 return false;
    270             }
    271 
    272             if(!psListAdd(newFolderEntry->data.list, PS_LIST_TAIL, metadataItem)) {
    273                 psError(PS_ERR_UNKNOWN,false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
    274                 psFree(newFolderEntry);
    275                 return false;
    276             }
    277 
    278             if(!psHashRemove(mdTable, key)) {
    279                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,key);
    280                 psFree(newFolderEntry);
    281                 return false;
    282             }
    283 
    284             if(!psHashAdd(mdTable, key, newFolderEntry)) {
    285                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
    286                 psFree(newFolderEntry);
    287                 return false;
    288             }
    289 
    290             // Remove local reference to new folder node
    291             psMemDecrRefCounter(newFolderEntry);
    292         } else {
    293 
    294             // Folder node replaces leaf or folder node - Put old node into new folder and remove from table
    295             if(metadataItem->data.list == NULL) {
    296                 metadataItem->data.list = psListAlloc(NULL);
    297             }
    298 
    299             if(!psListAdd(metadataItem->data.list, PS_LIST_TAIL, existingEntry)) {
    300                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
    301                 return false;
    302             }
    303 
    304             if(!psHashRemove(mdTable, key)) {
    305                 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,key);
    306                 return false;
    307             }
    308 
     284            // (added to list below)
     285
     286        } else if ((flags & PS_META_REPLACE) != 0) {
     287            // replace entry instead of creating a duplicate entry.
     288
     289            // remove the existing entry from metadata
     290            psListRemoveData(mdList, existingEntry);
     291            psHashRemove(mdTable, key);
     292
     293            // treat as if new (added to list below)
    309294            if(!psHashAdd(mdTable, key, metadataItem)) {
    310295                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
    311296                return false;
    312297            }
     298        } else {
     299            // default is to error on duplicate entry.
     300            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
     301                    PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED);
     302            return false;
    313303        }
    314304    } else {
     305        // OK, this is a new item.
    315306
    316307        // Node doesn't exist - Add new metadata item to metadata collection's hash
     
    321312    }
    322313
    323     // Add items to metadata collection's list, even if they have the same metadata item names. Folder nodes
    324     // (PS_META_LIST metadata items) are not added, since the metadata list is flat.
    325     if(metadataItem->type != PS_META_LIST) {
    326         if(!psListAdd(mdList, location, metadataItem)) {
    327             psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
    328             return false;
    329         }
     314    if(!psListAdd(mdList, location, metadataItem)) {
     315        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
     316        return false;
    330317    }
    331318
     
    333320}
    334321
    335 psBool psMetadataAdd(psMetadata *md, psS32 where, const char *name,
    336                      psMetadataType type, const char *comment, ...)
     322psBool psMetadataAdd(psMetadata *md, psS32 location, const char *name,
     323                     psS32 type, const char *comment, ...)
    337324{
    338325    va_list argPtr;
     326
     327    va_start(argPtr, comment);
     328    psBool result = psMetadataAddV(md,location,name,type,comment,argPtr);
     329    va_end(argPtr);
     330
     331    return result;
     332}
     333
     334psBool psMetadataAddV(psMetadata *md, psS32 location, const char *name,
     335                      psS32 type, const char *comment, va_list list)
     336{
    339337    psMetadataItem* metadataItem = NULL;
    340338
    341     va_start(argPtr, comment);
    342     metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
    343     va_end(argPtr);
    344 
    345     if (!psMetadataAddItem(md, metadataItem, where)) {
     339    metadataItem = psMetadataItemAllocV(name, type & PS_METADATA_TYPE_MASK, comment, list);
     340
     341    if (!psMetadataAddItem(md, metadataItem, location, type & PS_METADATA_FLAGS_MASK)) {
    346342        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_FAILED);
    347343        psFree(metadataItem);
     
    373369psBool psMetadataRemove(psMetadata *md, psS32 where, const char *key)
    374370{
    375     psList* mdList = NULL;
    376     psHash* mdTable = NULL;
    377     psMetadataItem* entry = NULL;
    378 
    379 
    380371    PS_PTR_CHECK_NULL(md,NULL);
     372
     373    PS_PTR_CHECK_NULL(md->list,NULL);
     374    psList* mdList = md->list;
     375
    381376    PS_PTR_CHECK_NULL(md->table,NULL);
    382     PS_PTR_CHECK_NULL(md->list,NULL);
    383 
    384     mdList = md->list;
    385     mdTable = md->table;
     377    psHash* mdTable = md->table;
    386378
    387379    // Select removal by key or index
    388380    if (key != NULL) {
    389 
    390381        // Remove by key name
    391         entry = (psMetadataItem*)psHashLookup(mdTable, key);
     382        psMetadataItem* entry = psHashLookup(mdTable,key);
    392383        if (entry == NULL) {
    393             psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_FAILED, key);
     384            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
    394385            return false;
    395386        }
    396 
     387        if (entry->type == PS_META_MULTI) {
     388            psMetadataItem* listItem;
     389            psListIterator* iter = psListIteratorAlloc(
     390                                       entry->data.list,
     391                                       PS_LIST_HEAD,true);
     392            while ((listItem=psListGetAndIncrement(iter)) != NULL) {
     393                psListRemoveData(mdList, listItem);
     394            }
     395            psFree(iter);
     396            psHashRemove(mdTable,key);
     397
     398        } else {
     399            psListRemoveData(mdList, entry);
     400            psHashRemove(mdTable, key);
     401        }
    397402    } else {
    398 
    399403        // Remove by index
    400         entry = psListGet(mdList, where);
     404        psMetadataItem* entry = psListGet(mdList, where);
    401405        if (entry == NULL) {
    402406            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED, where);
    403407            return false;
    404408        }
    405 
    406409        key = entry->name;
    407         if(key == NULL) {
     410
     411        if (key == NULL) {
    408412            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_REMOVE_LIST_INDEX_FAILED, where);
    409413            return false;
    410414        }
    411     }
    412 
    413     if (!psListRemoveData(mdList, entry)) {
    414         psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_LIST_FAILED, key);
    415         return false;
    416     }
    417 
    418     // Remove entry from metadata collection's table
    419     if (!psHashRemove(mdTable, key)) {
    420         psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
    421         return false;
     415
     416        psMetadataItem* tableItem = psHashLookup(mdTable, key);
     417        if (tableItem == NULL) {
     418            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
     419            return false;
     420        }
     421
     422        if (tableItem->type == PS_META_MULTI) {
     423            // multiple entries with same key, remove just the specified one
     424            psListRemoveData(tableItem->data.list, entry);
     425            if (psListGet(tableItem->data.list,PS_LIST_HEAD) == NULL) {
     426                // list is empty, so let's clear the whole entry now.
     427                if (!psHashRemove(mdTable, key)) {
     428                    psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
     429                    return false;
     430                }
     431            }
     432        } else {
     433            if (!psHashRemove(mdTable, key)) {
     434                psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
     435                return false;
     436            }
     437        }
     438        psListRemove(mdList, where);
    422439    }
    423440
     
    455472        }
    456473        return NULL;
     474    }
     475    if (metadataItem->type == PS_META_MULTI) {
     476        // if multiple keys found, use the first.
     477        metadataItem = (psMetadataItem*)((metadataItem->data.list)->head);
    457478    }
    458479
     
    486507        } \
    487508        return 0; \
     509    } \
     510    if (metadataItem->type == PS_META_MULTI) { \
     511        /* if multiple keys found, use the first. */ \
     512        metadataItem = (psMetadataItem*)((metadataItem->data.list)->head); \
    488513    } \
    489514    \
     
    535560    return entry;
    536561}
     562
     563psMetadataIterator* psMetadataIteratorAlloc(psMetadata* md,
     564        int location,
     565        const char* regex)
     566{
     567    PS_PTR_CHECK_NULL(md,NULL);
     568    PS_PTR_CHECK_NULL(md->list,NULL);
     569
     570    psMetadataIterator* newIter = psAlloc(sizeof(psMetadataIterator));
     571    newIter->preg = NULL;
     572    newIter->iter = NULL;
     573
     574    // Set deallocator
     575    p_psMemSetDeallocator(newIter, (psFreeFcn) metadataIteratorFree);
     576
     577    if (regex == NULL) {
     578        newIter->iter = psListIteratorAlloc(md->list, location, false);
     579        return newIter;
     580    } else {
     581        int regRtn = regcomp(newIter->preg,regex,0);
     582        if (regRtn != 0) {
     583            char errMsg[256];
     584            regerror(regRtn, newIter->preg, errMsg, 256);
     585            regfree(newIter->preg);
     586            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
     587                    PS_ERRORTEXT_psMetadata_REGEX_INVALID,
     588                    errMsg);
     589            psFree(newIter);
     590            return NULL;
     591        }
     592    }
     593
     594    psMetadataIteratorSet(newIter, location); // XXX: do we error if no match is found?
     595
     596    return newIter;
     597}
     598
     599psBool psMetadataIteratorSet(psMetadataIterator* iterator,
     600                             int location)
     601{
     602    int match;
     603    psMetadataItem* cursor;
     604
     605    PS_PTR_CHECK_NULL(iterator,NULL);
     606
     607    psListIterator* iter = iterator->iter;
     608    PS_PTR_CHECK_NULL(iterator->iter,NULL);
     609
     610    regex_t* preg = iterator->preg;
     611
     612    // handle trivial case where no regex subsetting is required.
     613    if (preg == NULL) {
     614        return psListIteratorSet(iter,location);
     615    }
     616
     617    if (location < 0) {
     618        // match from the tail
     619        match = 0;
     620        psListIteratorSet(iter,PS_LIST_TAIL);
     621        while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
     622            if (regexec(preg, cursor->name, 0, NULL, 0) == 0) {
     623                // this key is a match
     624                match--;
     625                if (match == location) {
     626                    break;
     627                }
     628            }
     629            (void)psListGetAndDecrement(iter);
     630        }
     631        return (match == location);
     632    }
     633
     634    // find the n-th match from the head
     635    match = -1;
     636    psListIteratorSet(iter,PS_LIST_HEAD);
     637    while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
     638        if (regexec(preg, cursor->name, 0, NULL, 0) == 0) {
     639            // this key is a match
     640            match++;
     641            if (match == location) {
     642                break;
     643            }
     644        }
     645        (void)psListGetAndIncrement(iter);
     646    }
     647    return (match == location);
     648}
     649
     650psMetadataItem* psMetadataGetAndIncrement(psMetadataIterator* iterator)
     651{
     652    psMetadataItem* oldValue;
     653
     654    PS_PTR_CHECK_NULL(iterator,NULL);
     655
     656    psListIterator* iter = iterator->iter;
     657    PS_PTR_CHECK_NULL(iterator->iter,NULL);
     658
     659    regex_t* preg = iterator->preg;
     660
     661    // handle trivial case where no regex subsetting is required.
     662    if (preg == NULL) {
     663        return (psMetadataItem*)psListGetAndIncrement(iter);
     664    }
     665
     666    oldValue = (psMetadataItem*)iter->cursor;
     667
     668    while (psListGetAndIncrement(iter) != NULL) {
     669        if (iter->cursor != NULL &&
     670                regexec(preg, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
     671            // this key is a match
     672            break;
     673        }
     674    }
     675    return oldValue;
     676}
     677
     678psMetadataItem* psMetadataGetAndDecrement(psMetadataIterator* iterator)
     679{
     680    psMetadataItem* oldValue;
     681
     682    PS_PTR_CHECK_NULL(iterator,NULL);
     683
     684    psListIterator* iter = iterator->iter;
     685    PS_PTR_CHECK_NULL(iterator->iter,NULL);
     686
     687    regex_t* preg = iterator->preg;
     688
     689    // handle trivial case where no regex subsetting is required.
     690    if (preg == NULL) {
     691        return (psMetadataItem*)psListGetAndDecrement(iter);
     692    }
     693
     694    oldValue = (psMetadataItem*)iter->cursor;
     695
     696    while (psListGetAndDecrement(iter) != NULL) {
     697        if (iter->cursor != NULL &&
     698                regexec(preg, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
     699            // this key is a match
     700            break;
     701        }
     702    }
     703    return oldValue;
     704}
  • trunk/psLib/src/types/psMetadata.h

    r3341 r3381  
    1111*  @author Ross Harman, MHPCC
    1212*
    13 *  @version $Revision: 1.38 $ $Name: not supported by cvs2svn $
    14 *  @date $Date: 2005-02-28 23:34:10 $
     13*  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
     14*  @date $Date: 2005-03-07 20:58:50 $
    1515*
    1616*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    2121#include <stdarg.h>
    2222#include <stdio.h>
     23#include <sys/types.h>
     24#include <regex.h>
    2325
    2426#include "psHash.h"
     
    3537 */
    3638typedef enum {
    37     PS_META_S32,                       ///< Primitive data.
    38     PS_META_F32,                       ///< Primitive data.
    39     PS_META_F64,                       ///< Primitive data.
    40     PS_META_BOOL,                       ///< Primitive data.
     39    PS_META_S32,                       ///< psS32 primitive data.
     40    PS_META_F32,                       ///< psF32 primitive data.
     41    PS_META_F64,                       ///< psF64 primitive data.
     42    PS_META_BOOL,                      ///< psBool primitive data.
    4143    PS_META_LIST,                      ///< List data (Stored as item.data.list).
    4244    PS_META_STR,                       ///< String data (Stored as item.data.V).
     
    4951    PS_META_ASTROM,                    ///< Astrometric coefficients (Stored as item.data.V).
    5052    PS_META_UNKNOWN,                   ///< Other data (Stored as item.data.V).
     53    PS_META_MULTI,                     ///< Used internally, do not create an metadata item of this type.
    5154    PS_META_NTYPE                      ///< Number of types. Must be last.
    5255} psMetadataType;
     
    7275typedef enum {
    7376    PS_META_DEFAULT = 0,               ///< default behaviour (duplicate entry is an error)
    74     PS_META_REPLACE = 0x10000          ///< allow entry to be replaced
     77    PS_META_REPLACE = 0x1000000,       ///< allow entry to be replaced
     78    PS_META_DUPLICATE_OK = 0x2000000   ///< allow duplicate entries
    7579} psMetadataFlags;
     80
     81#define PS_METADATA_FLAGS_MASK 0xFF000000
     82#define PS_METADATA_TYPE_MASK 0x00FFFFFF
    7683
    7784/** Metadata data structure.
     
    8895}
    8996psMetadata;
     97
     98/** Metadata iterator
     99 *
     100 *  Iterator for metadata.
     101 */
     102typedef struct
     103{
     104    psListIterator* iter;              ///< iterator for the psMetadata's psList
     105    regex_t* preg;                     ///< the subsetting regular expression
     106}
     107psMetadataIterator;
     108
    90109
    91110/** Metadata item data structure.
     
    134153);
    135154
     155/** Create a metadata item with specified string data.
     156 *
     157 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     158 *  struct.
     159 *
     160 * @return psMetadataItem* : Pointer metadata item.
     161 */
    136162psMetadataItem* psMetadataItemAllocStr(
    137     const char* name,
    138     const char* comment,
    139     const char* value
    140 );
    141 
     163    const char* name,                  ///< Name of metadata item.
     164    const char* comment,               ///< Comment for metadata item.
     165    const char* value                  ///< the value of the metadata item.
     166);
     167
     168/** Create a metadata item with specified psF32 data.
     169 *
     170 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     171 *  struct.
     172 *
     173 * @return psMetadataItem* : Pointer metadata item.
     174 */
    142175psMetadataItem* psMetadataItemAllocF32(
    143     const char* name,
    144     const char* comment,
    145     psF32 value
    146 );
    147 
     176    const char* name,                  ///< Name of metadata item.
     177    const char* comment,               ///< Comment for metadata item.
     178    psF32 value                        ///< the value of the metadata item.
     179);
     180
     181/** Create a metadata item with specified psF64 data.
     182 *
     183 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     184 *  struct.
     185 *
     186 * @return psMetadataItem* : Pointer metadata item.
     187 */
    148188psMetadataItem* psMetadataItemAllocF64(
    149     const char* name,
    150     const char* comment,
    151     psF64 value
    152 );
    153 
     189    const char* name,                  ///< Name of metadata item.
     190    const char* comment,               ///< Comment for metadata item.
     191    psF64 value                        ///< the value of the metadata item.
     192);
     193
     194/** Create a metadata item with specified psS32 data.
     195 *
     196 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     197 *  struct.
     198 *
     199 * @return psMetadataItem* : Pointer metadata item.
     200 */
    154201psMetadataItem* psMetadataItemAllocS32(
    155     const char* name,
    156     const char* comment,
    157     psS32 value
    158 );
    159 
     202    const char* name,                  ///< Name of metadata item.
     203    const char* comment,               ///< Comment for metadata item.
     204    psS32 value                        ///< the value of the metadata item.
     205);
     206
     207/** Create a metadata item with specified psBool data.
     208 *
     209 *  Returns a fill psMetadataItem ready for insertion into the psMetadata
     210 *  struct.
     211 *
     212 * @return psMetadataItem* : Pointer metadata item.
     213 */
    160214psMetadataItem* psMetadataItemAllocBool(
    161     const char* name,
    162     const char* comment,
    163     psBool value
     215    const char* name,                  ///< Name of metadata item.
     216    const char* comment,               ///< Comment for metadata item.
     217    psBool value                       ///< the value of the metadata item.
    164218);
    165219
     
    207261    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
    208262    psMetadataItem*  item,             ///< Metadata item to be added.
    209     psS32 location                     ///< Location to be added.
     263    psS32 location,                    ///< Location to be added.
     264    psS32 flags                        ///< Options flag mask, see psMetadataFlags enum
    210265);
    211266
     
    218273psBool psMetadataAdd(
    219274    psMetadata* md,                    ///< Metadata collection to insert metadat item.
    220     psS32 where,                       ///< Location to be added.
     275    psS32 location,                    ///< Location to be added.
    221276    const char *name,                  ///< Name of metadata item.
    222     psMetadataType type,               ///< Type of metadata item.
     277    int type,                          ///< Type of metadata item (psMetadataType) and options (psMetadataFlags)
    223278    const char *comment,               ///< Comment for metadata item.
    224279    ...                                ///< Arguments for name formatting and metadata item data.
    225280);
    226281
    227 psBool psMetadataAddS32(psMetadata* md, psS32 where, const char* name,
     282#ifndef SWIG
     283/** Create and add a metadata item to metadata collection.
     284 *
     285 * Creates a new metadata item add to the metadata collection.
     286 *
     287 * @return bool: True for success, false for failure.
     288 */
     289psBool psMetadataAddV(
     290    psMetadata* md,                    ///< Metadata collection to insert metadat item.
     291    psS32 location,                    ///< Location to be added.
     292    const char *name,                  ///< Name of metadata item.
     293    int type,                          ///< Type of metadata item (psMetadataType) and options (psMetadataFlags)
     294    const char *comment,               ///< Comment for metadata item.
     295    va_list list                       ///< Arguments for name formatting and metadata item data.
     296);
     297#endif
     298
     299psBool psMetadataAddS32(psMetadata* md, psS32 location, const char* name,
    228300                        const char* comment, psS32 value);
    229 psBool psMetadataAddF32(psMetadata* md, psS32 where, const char* name,
     301psBool psMetadataAddF32(psMetadata* md, psS32 location, const char* name,
    230302                        const char* comment, psF32 value);
    231 psBool psMetadataAddF64(psMetadata* md, psS32 where, const char* name,
     303psBool psMetadataAddF64(psMetadata* md, psS32 location, const char* name,
    232304                        const char* comment, psF64 value);
    233 psBool psMetadataAddList(psMetadata* md, psS32 where, const char* name,
     305psBool psMetadataAddList(psMetadata* md, psS32 location, const char* name,
    234306                         const char* comment, psList* value);
    235 psBool psMetadataAddStr(psMetadata* md, psS32 where, const char* name,
     307psBool psMetadataAddStr(psMetadata* md, psS32 location, const char* name,
    236308                        const char* comment, const char* value);
    237 psBool psMetadataAddVector(psMetadata* md, psS32 where, const char* name,
     309psBool psMetadataAddVector(psMetadata* md, psS32 location, const char* name,
    238310                           const char* comment, psVector* value);
    239 psBool psMetadataAddImage(psMetadata* md, psS32 where, const char* name,
     311psBool psMetadataAddImage(psMetadata* md, psS32 location, const char* name,
    240312                          const char* comment, psImage* value);
    241 psBool psMetadataAddHash(psMetadata* md, psS32 where, const char* name,
     313psBool psMetadataAddHash(psMetadata* md, psS32 location, const char* name,
    242314                         const char* comment, psHash* value);
    243 psBool psMetadataAddLookupTable(psMetadata* md, psS32 where, const char* name,
     315psBool psMetadataAddLookupTable(psMetadata* md, psS32 location, const char* name,
    244316                                const char* comment, psLookupTable* value);
    245 psBool psMetadataAddUnknown(psMetadata* md, psS32 where, const char* name,
     317psBool psMetadataAddUnknown(psMetadata* md, psS32 location, const char* name,
    246318                            const char* comment, psPtr value);
    247319
     
    340412 * @return void* : Value of metadata item.
    341413 */
    342 void* psMetadataLookupPtr(
     414psPtr psMetadataLookupPtr(
    343415    psBool *status,                    ///< Status of lookup.
    344416    psMetadata* md,                    ///< Metadata collection to lookup metadata item.
     
    354426 */
    355427psMetadataItem* psMetadataGet(
    356     psMetadata*  md,           ///< Metadata collection to insert metadat item.
    357     psS32 where                ///< Location to be retrieved.
     428    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
     429    psS32 location                     ///< Location to be retrieved.
     430);
     431
     432/** Creates a psMetadataIterator to iterate over the specified psMetadata.
     433 *
     434 *  Supports the subsetting of the metadata via keyword using regular
     435 *  expression.  If no regular expression is specified, iteration
     436 *  over the entire psMetadata is performed.
     437 *
     438 *  @return psMetadataIterator*        a new psMetadataIterator, of NULL if error occurred
     439 */
     440psMetadataIterator* psMetadataIteratorAlloc(
     441    psMetadata* md,                    ///< the psMetadata to iterate with
     442    int location,                      ///< the initial starting point (after subsetting).
     443    const char* regex
     444    ///< A regular expression for subsetting the psMetadata.  If NULL, no
     445    ///< subsetting is performed.
     446);
     447
     448/** Set the iterator of the psMetadat to a given position.  If location is
     449 *  invalid the iterator position is not changed.
     450 *
     451 *  @return psBool        TRUE if iterator successfully set, otherwise FALSE.
     452*/
     453psBool psMetadataIteratorSet(
     454    psMetadataIterator* iterator,      ///< psMetadata iterator
     455    int location                       ///< index number, PS_LIST_HEAD, or PS_LIST_TAIL
     456);
     457
     458/** Position the specified iterator to the next matching item in psMetadata,
     459 *  given the regular expression of the iterator
     460 *
     461 *  @return psPtr       the psMetadataItem at the original iterator position
     462 *                      or NULL if the iterator went past the end of the list.
     463 */
     464psMetadataItem* psMetadataGetAndIncrement(
     465    psMetadataIterator* iterator           ///< iterator to move
     466);
     467
     468/** Position the specified iterator to the previous matching item in psMetadata,
     469 *  given the regular expression of the iterator
     470 *
     471 *  @return psPtr       the psMetadataItem at the original iterator position
     472 *                      or NULL if the iterator went past the beginning of the
     473 *                      list.
     474 */
     475psMetadataItem* psMetadataGetAndDecrement(
     476    psMetadataIterator* iterator           ///< iterator to move
    358477);
    359478
  • trunk/psLib/src/types/psMetadataConfig.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,
  • trunk/psLib/src/types/psMetadataConfig.h

    r3264 r3381  
    11/** @file  psMetadataIO.h
    2 *
    3 *  @brief Contains metadata input/output functions.
    4 *
    5 *  This file defines functions to read and write metadata to/from an external file.
    6 *
    7 *  @ingroup Metadata
    8 *
    9 *  @author Ross Harman, MHPCC
    10 *
    11 *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
    12 *  @date $Date: 2005-02-17 19:26:23 $
    13 *
    14 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    15 */
     2 *
     3 *  @brief Contains metadata input/output functions.
     4 *
     5 *  This file defines functions to read and write metadata to/from an external file.
     6 *
     7 *  @ingroup Metadata
     8 *
     9 *  @author Ross Harman, MHPCC
     10 *  @author Robert DeSonia, MHPCC
     11 *
     12 *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-03-07 20:58:50 $
     14 *
     15 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     16 */
    1617#ifndef PS_METADATAIO_H
    1718#define PS_METADATAIO_H
    18 
    1919
    2020/// @addtogroup Metadata
  • trunk/psLib/src/xml/psXML.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,
  • trunk/psLib/src/xml/psXML.h

    r3264 r3381  
    11/** @file  psMetadataIO.h
    2 *
    3 *  @brief Contains metadata input/output functions.
    4 *
    5 *  This file defines functions to read and write metadata to/from an external file.
    6 *
    7 *  @ingroup Metadata
    8 *
    9 *  @author Ross Harman, MHPCC
    10 *
    11 *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
    12 *  @date $Date: 2005-02-17 19:26:23 $
    13 *
    14 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    15 */
     2 *
     3 *  @brief Contains metadata input/output functions.
     4 *
     5 *  This file defines functions to read and write metadata to/from an external file.
     6 *
     7 *  @ingroup Metadata
     8 *
     9 *  @author Ross Harman, MHPCC
     10 *  @author Robert DeSonia, MHPCC
     11 *
     12 *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2005-03-07 20:58:50 $
     14 *
     15 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     16 */
    1617#ifndef PS_METADATAIO_H
    1718#define PS_METADATAIO_H
    18 
    1919
    2020/// @addtogroup Metadata
  • trunk/psLib/test/astronomy/Makefile.am

    r3286 r3381  
    7474        verified
    7575
     76CLEANFILES = $(TESTS) $(check_DATA)
     77
    7678psTime.config: $(top_srcdir)/etc/pslib/psTime.config.template
    7779        sed 's|PREFIX|$(top_srcdir)|' $? > $@
  • trunk/psLib/test/astronomy/data/test.config

    r3246 r3381  
    77#  author  Ross Harman, MHPCC
    88#
    9 #  version $Revision: 1.1 $  $Name: not supported by cvs2svn $
    10 #  date  $Date: 2005-02-17 01:58:43 $
     9#  version $Revision: 1.2 $  $Name: not supported by cvs2svn $
     10#  date  $Date: 2005-03-07 20:58:50 $
    1111#
    1212#  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    7474########## Test 10  ##########
    7575# The lines below should create a folder node with children that are strings. They should be read by the parser.
    76 comment *
    77 comment STR This
    78 comment STR     is
    79 comment STR         an
    80 comment STR             ugly
    81 comment STR                 comment
    82 comment STR                         but
    83 comment STR                             still
    84 comment STR                                 valid
     76comment *STR This
     77comment *STR     is
     78comment *STR         an
     79comment *STR             ugly
     80comment *STR                 comment
     81comment *STR                         but
     82comment *STR                             still
     83comment *STR                                 valid
    8584#
    8685#
  • trunk/psLib/test/astronomy/tst_psMetadataIO.c

    r3341 r3381  
    11/** @file  tst_psMetadataIO.c
    2 *
    3 *  @brief Test driver for psMetadataIO functions
    4 *
    5 *  This test driver contains the following tests for psMetadata:
    6 *    Test A - Read config file with overwrite set true
    7 *    Test B - Read config file with overwrite set false
    8 *    Test C - Read config file without auto-allocation of metadata
    9 *    Test D - Attempt to use null fileName argument
    10 *    Test E - Attempt to open nonexistant file
    11 *    Test F - Free psMetadata
    12 *
    13 *  @author  Ross Harman, MHPCC
    14 *
    15 *  @version $Revision: 1.10 $  $Name: not supported by cvs2svn $
    16 *  @date  $Date: 2005-02-28 23:34:10 $
    17 *
    18 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    19 *
    20 */
     2 *
     3 *  @brief Test driver for psMetadataIO functions
     4 *
     5 *  This test driver contains the following tests for psMetadata:
     6 *    Test A - Read config file with overwrite set true
     7 *    Test B - Read config file with overwrite set false
     8 *    Test C - Read config file without auto-allocation of metadata
     9 *    Test D - Attempt to use null fileName argument
     10 *    Test E - Attempt to open nonexistant file
     11 *    Test F - Free psMetadata
     12 *
     13 *  @author  Ross Harman, MHPCC
     14 *  @author  Robert DeSonia, MHPCC
     15 *
     16 *  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
     17 *  @date  $Date: 2005-03-07 20:58:50 $
     18 *
     19 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     20 *
     21 */
    2122
    2223#include <string.h>
     
    6970
    7071    switch (metadataItem->type) {
    71     case PS_META_LIST:
     72    case PS_META_MULTI:
    7273        printf("Key Value: %17c", ' ');
    7374        break;
     
    9293    printf("Key Comment: %s\n", metadataItem->comment);
    9394
    94     if(metadataItem->data.V && metadataItem->type==PS_META_LIST) {
     95    if(metadataItem->data.V && metadataItem->type==PS_META_MULTI) {
    9596        printMetadataList(metadataItem->data.V, "    ");
    9697    }
  • trunk/psLib/test/astronomy/tst_psMetadata_01.c

    r3341 r3381  
    1818*  @author  Ross Harman, MHPCC
    1919*
    20 *  @version $Revision: 1.21 $  $Name: not supported by cvs2svn $
    21 *  @date  $Date: 2005-02-28 23:34:10 $
     20*  @version $Revision: 1.22 $  $Name: not supported by cvs2svn $
     21*  @date  $Date: 2005-03-07 20:58:50 $
    2222*
    2323*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    7575
    7676    switch (metadataItem->type) {
    77     case PS_META_LIST:
     77    case PS_META_MULTI:
    7878        printf("Key Value: %17c", ' ');
    7979        break;
     
    9898    printf("Key Comment: %s\n", metadataItem->comment);
    9999
    100     if(metadataItem->data.V && metadataItem->type==PS_META_LIST) {
     100    if(metadataItem->data.V && metadataItem->type==PS_META_MULTI) {
    101101        printMetadataList(metadataItem->data.V, "    ");
    102102    }
  • trunk/psLib/test/astronomy/tst_psMetadata_02.c

    r3341 r3381  
    11/** @file  tst_psMetadata_02.c
    2 *
    3 *  @brief Test driver for psMetadata functions
    4 *
    5 *  This test driver contains the following tests for psMetadata:
    6 *     Test A - Allocate metadata items
    7 *     Test B - Attempt to create metadata item with null name
    8 *     Test C - Attempt to create metadata item with invalid type
    9 *     Test D - Allocate metadata
    10 *     Test E - Attempt to add metadata item to null metadata
    11 *     Test F - Attempt to add null metadata item to metadata
    12 *     Test G - Free psMetadata
    13 *
    14 *  @author  Ross Harman, MHPCC
    15 *
    16 *  @version $Revision: 1.12 $  $Name: not supported by cvs2svn $
    17 *  @date  $Date: 2005-02-28 23:34:10 $
    18 *
    19 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    20 *
    21 */
     2 *
     3 *  @brief Test driver for psMetadata functions
     4 *
     5 *  This test driver contains the following tests for psMetadata:
     6 *     Test A - Allocate metadata items
     7 *     Test B - Attempt to create metadata item with null name
     8 *     Test C - Attempt to create metadata item with invalid type
     9 *     Test D - Allocate metadata
     10 *     Test E - Attempt to add metadata item to null metadata
     11 *     Test F - Attempt to add null metadata item to metadata
     12 *     Test G - Free psMetadata
     13 *
     14 *  @author  Ross Harman, MHPCC
     15 *  @author  Robert DeSonia, MHPCC
     16 *
     17 *  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
     18 *  @date  $Date: 2005-03-07 20:58:50 $
     19 *
     20 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     21 *
     22 */
    2223
    2324#include <string.h>
     
    3132
    3233    switch (metadataItem->type) {
    33     case PS_META_LIST:
     34    case PS_META_MULTI:
    3435        printf("Key Value: %17c", ' ');
    3536        break;
     
    110111    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to add metadata item to null metadata",
    111112                            "Null metadata collection not allowed", 0);
    112     psMetadataAddItem(NULL, item1, PS_LIST_HEAD);
     113    psMetadataAddItem(NULL, item1, PS_LIST_HEAD, PS_META_DEFAULT);
    113114    printFooter(stdout, "psMetadata", "Test E - Attempt to add metadata item to null metadata", true);
    114115
     
    117118    printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to add null metadata item to metadata",
    118119                            "Null metadata item not allowed", 0);
    119     psMetadataAddItem(metadata, NULL, PS_LIST_HEAD);
     120    psMetadataAddItem(metadata, NULL, PS_LIST_HEAD, PS_META_DEFAULT);
    120121    printFooter(stdout, "psMetadata", "Test F - Attempt to add null metadata item to metadata", true);
    121122
  • trunk/psLib/test/astronomy/tst_psMetadata_03.c

    r3341 r3381  
    1818*  @author  Ross Harman, MHPCC
    1919*
    20 *  @version $Revision: 1.14 $  $Name: not supported by cvs2svn $
    21 *  @date  $Date: 2005-02-28 23:34:10 $
     20*  @version $Revision: 1.15 $  $Name: not supported by cvs2svn $
     21*  @date  $Date: 2005-03-07 20:58:50 $
    2222*
    2323*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3535
    3636    switch (metadataItem->type) {
    37     case PS_META_LIST:
     37    case PS_META_MULTI:
    3838        printf("Key Value: %17c", ' ');
    3939        break;
     
    9090    // Test B - Remove items from metadata by name
    9191    printPositiveTestHeader(stdout, "psMetadata", "Test B - Remove items from metadata by name");
    92     if(!psMetadataAddItem(metadata, item1, PS_LIST_HEAD)) {
     92    if(!psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT)) {
    9393        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by name.");
    9494        return 10;
     
    111111    // Test C - Remove items from metadata by index
    112112    printPositiveTestHeader(stdout, "psMetadata", "Test C - Remove items from metadata by index");
    113     if ( ! psMetadataAddItem(metadata, item3, PS_LIST_HEAD) ) {
     113    if ( ! psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
    114114        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by index.");
    115115        return 14;
     
    166166    mdTable = errMetadata->table;
    167167    errMetadata->table = NULL;
    168     if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD) ) {
     168    if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
    169169        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o hash table.");
    170170        return 21;
     
    182182    mdList = errMetadata->list;
    183183    errMetadata->list = NULL;
    184     if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD) ) {
     184    if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
    185185        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o link list.");
    186186        return 22;
     
    198198    errName = errItem->name;
    199199    errItem->name = NULL;
    200     if ( psMetadataAddItem(errMetadata, errItem, PS_LIST_HEAD) ) {
     200    if ( psMetadataAddItem(errMetadata, errItem, PS_LIST_HEAD, PS_META_DEFAULT) ) {
    201201        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false with item with null name.");
    202202        return 23;
  • trunk/psLib/test/astronomy/tst_psMetadata_04.c

    r3341 r3381  
    2323*  @author  Ross Harman, MHPCC
    2424*
    25 *  @version $Revision: 1.15 $  $Name: not supported by cvs2svn $
    26 *  @date  $Date: 2005-02-28 23:34:10 $
     25*  @version $Revision: 1.16 $  $Name: not supported by cvs2svn $
     26*  @date  $Date: 2005-03-07 20:58:50 $
    2727*
    2828*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    4040
    4141    switch (metadataItem->type) {
    42     case PS_META_LIST:
     42    case PS_META_MULTI:
    4343        printf("Key Value: %17c", ' ');
    4444        break;
     
    9595    printMetadataItem(item4);
    9696    printMetadataItem(item5);
    97     psMetadataAddItem(metadata, item1, PS_LIST_HEAD);
    98     psMetadataAddItem(metadata, item2, PS_LIST_HEAD);
    99     psMetadataAddItem(metadata, item3, PS_LIST_HEAD);
    100     psMetadataAddItem(metadata, item4, PS_LIST_HEAD);
    101     psMetadataAddItem(metadata, item5, PS_LIST_HEAD);
    102     psMetadataAddItem(metadata, item6, PS_LIST_HEAD);
     97    psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT);
     98    psMetadataAddItem(metadata, item2, PS_LIST_HEAD, PS_META_DEFAULT);
     99    psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT);
     100    psMetadataAddItem(metadata, item4, PS_LIST_HEAD, PS_META_DEFAULT);
     101    psMetadataAddItem(metadata, item5, PS_LIST_HEAD, PS_META_DEFAULT);
     102    psMetadataAddItem(metadata, item6, PS_LIST_HEAD, PS_META_DEFAULT);
    103103    psFree(vec);
    104104    printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
  • trunk/psLib/test/astronomy/tst_psMetadata_05.c

    r3341 r3381  
    2222*  @author  Ross Harman, MHPCC
    2323*
    24 *  @version $Revision: 1.20 $  $Name: not supported by cvs2svn $
    25 *  @date  $Date: 2005-02-28 23:34:10 $
     24*  @version $Revision: 1.21 $  $Name: not supported by cvs2svn $
     25*  @date  $Date: 2005-03-07 20:58:50 $
    2626*
    2727*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3939
    4040    switch (metadataItem->type) {
    41     case PS_META_LIST:
     41    case PS_META_MULTI:
    4242        printf("Key Value: %17c", ' ');
    4343        break;
     
    9292    printMetadataItem(item3);
    9393    printMetadataItem(item4);
    94     psMetadataAddItem(metadata, item1, PS_LIST_HEAD);
    95     psMetadataAddItem(metadata, item2, PS_LIST_HEAD);
    96     psMetadataAddItem(metadata, item3, PS_LIST_HEAD);
    97     psMetadataAddItem(metadata, item4, PS_LIST_HEAD);
     94    psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT);
     95    psMetadataAddItem(metadata, item2, PS_LIST_HEAD, PS_META_DEFAULT);
     96    psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT);
     97    psMetadataAddItem(metadata, item4, PS_LIST_HEAD, PS_META_DEFAULT);
    9898    printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
    9999
  • trunk/psLib/test/astronomy/tst_psMetadata_06.c

    r3341 r3381  
    1313*  @author  Ross Harman, MHPCC
    1414*
    15 *  @version $Revision: 1.10 $  $Name: not supported by cvs2svn $
    16 *  @date  $Date: 2005-02-28 23:34:10 $
     15*  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
     16*  @date  $Date: 2005-03-07 20:58:50 $
    1717*
    1818*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3030
    3131    switch (metadataItem->type) {
     32    case PS_META_MULTI:
     33        printf("Key Value: %17c", ' ');
     34        break;
    3235    case PS_META_LIST:
    33         printf("Key Value: %17c", ' ');
     36        printf("Key Value: %15s  ", "psList");
    3437        break;
    3538    case PS_META_BOOL:
     
    7174    item1c = psMetadataItemAlloc("myItem1", PS_META_S32, "I am a signed integer", 222);
    7275    item2a = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a signed integer", 333);
    73     item2b = psMetadataItemAlloc("myItem2", PS_META_LIST, "I am a folder node", NULL);
     76    item2b = psMetadataItemAlloc("myItem2", PS_META_LIST, "I am a list", NULL);
    7477    metadata = psMetadataAlloc();
    7578    printMetadataItem(item1a);
     
    8285
    8386    // Test B - Add leaf node on top of existing leaf node
    84     printPositiveTestHeader(stdout, "psMetadata", "Test B - Add leaf node on top of existing leaf node");
    85     if(!psMetadataAddItem(metadata, item1a, PS_LIST_HEAD)) {
     87    printPositiveTestHeader(stdout, "psMetadata", "Test B - replace an item in the metadata");
     88    if(!psMetadataAddItem(metadata, item1a, PS_LIST_HEAD, PS_META_DEFAULT)) {
    8689        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
    8790        return 20;
    8891    }
    89     if (!psMetadataAddItem(metadata, item1b, PS_LIST_HEAD)) {
     92    psMetadataItem* tempItem = psMetadataLookup(metadata, item1a->name);
     93    if (tempItem != item1a) {
     94        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add the metadata entry.");
     95        return 20;
     96    }
     97
     98    if (!psMetadataAddItem(metadata, item1b, PS_LIST_HEAD, PS_META_REPLACE)) {
    9099        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
    91100        return 21;
    92101    }
    93102
    94     printFooter(stdout, "psMetadata", "Test B - Add leaf node on top of existing leaf node", true);
     103    tempItem = psMetadataLookup(metadata, item1a->name);
     104    if (tempItem != item1b) {
     105        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't replace the metadata entry.");
     106        return 21;
     107    }
     108
     109    printFooter(stdout, "psMetadata", "Test B - replace an item in the metadata", true);
    95110
    96111
    97112    // Test C - Add leaf node to existing folder node
    98     printPositiveTestHeader(stdout, "psMetadata", "Test C - Add leaf node to existing folder node");
    99     if (!psMetadataAddItem(metadata, item1c, PS_LIST_HEAD)) {
     113    printPositiveTestHeader(stdout, "psMetadata", "Test C - add duplicate-key metadata item");
     114    if (!psMetadataAddItem(metadata, item1c, PS_LIST_HEAD, PS_META_DUPLICATE_OK)) {
    100115        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem return false for adding a not to existing node.");
    101116        return 22;
    102117    }
    103     printFooter(stdout, "psMetadata", "Test C - Add leaf node to existing folder node", true);
     118
     119    tempItem = psMetadataLookup(metadata, item1a->name);
     120    if (tempItem == NULL || tempItem->type != PS_META_MULTI) {
     121        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add additional metadata entry of same key.");
     122        return 22;
     123    }
     124    printFooter(stdout, "psMetadata", "Test C - add duplicate-key metadata item", true);
    104125
    105126
    106127    // Test D - Add folder node on top of existing leaf node
    107128    printPositiveTestHeader(stdout, "psMetadata", "Test D - Add folder node on top of existing leaf node");
    108     if (!psMetadataAddItem(metadata, item2a, PS_LIST_HEAD)) {
     129    if (!psMetadataAddItem(metadata, item2a, PS_LIST_HEAD, PS_META_DEFAULT)) {
    109130        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node to existing leaf node.");
    110131        return 23;
    111132    }
    112     if (!psMetadataAddItem(metadata, item2b, PS_LIST_HEAD)) {
     133    if (!psMetadataAddItem(metadata, item2b, PS_LIST_HEAD, PS_META_DUPLICATE_OK)) {
    113134        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a nod to existing leaf node.");
    114135        return 24;
    115136    }
    116137    printFooter(stdout, "psMetadata", "Test D - Add folder node on top of existing leaf node", true);
     138    tempItem = psMetadataLookup(metadata, item1a->name);
     139    if (tempItem == NULL || tempItem->type != PS_META_MULTI) {
     140        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add additional metadata entry of same key.");
     141        return 24;
     142    }
    117143
    118144
  • trunk/psLib/test/astronomy/verified/tst_psMetadataIO.stderr

    r3127 r3381  
    11<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    2     Failed to parse the value '9876.54qqq32' of metadata item xPosition, type F64, on line 90 of test.config.
     2    Failed to parse the value '9876.54qqq32' of metadata item xPosition, type F64, on line 89 of test.config.
    33<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    4     Failed to read a metadata value on line 96 of test.config.
     4    Failed to read a metadata value on line 95 of test.config.
    55<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    6     Metadata type '99.999', found on line 102 of test.config, is not invalid.
     6    Metadata type '99.999', found on line 101 of test.config, is not invalid.
    77<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    8     More than one '*' character not allowed.  Found on line 108 of test.config.
     8    More than one '*' character not allowed.  Found on line 107 of test.config.
    99<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    10     More than one '@' character not allowed.  Found on line 114 of test.config.
     10    More than one '@' character not allowed.  Found on line 113 of test.config.
    1111<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    12     More than one '~' character not allowed.  Found on line 120 of test.config.
     12    More than one '~' character not allowed.  Found on line 119 of test.config.
    1313<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    14     Failed to parse the value '9876.54qqq32' of metadata item xPosition, type F64, on line 90 of test.config.
     14    Failed to parse the value '9876.54qqq32' of metadata item xPosition, type F64, on line 89 of test.config.
    1515<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    16     Failed to read a metadata value on line 96 of test.config.
     16    Failed to read a metadata value on line 95 of test.config.
    1717<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    18     Metadata type '99.999', found on line 102 of test.config, is not invalid.
     18    Metadata type '99.999', found on line 101 of test.config, is not invalid.
    1919<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    20     More than one '*' character not allowed.  Found on line 108 of test.config.
     20    More than one '*' character not allowed.  Found on line 107 of test.config.
    2121<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    22     More than one '@' character not allowed.  Found on line 114 of test.config.
     22    More than one '@' character not allowed.  Found on line 113 of test.config.
    2323<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    24     More than one '~' character not allowed.  Found on line 120 of test.config.
     24    More than one '~' character not allowed.  Found on line 119 of test.config.
     25<DATE><TIME>|<HOST>|E|psMetadataAddItem (FILE:LINENO)
     26    Duplicate metadata item name is not allowed.  Use a psMetadataFlags option to allow such action.
     27<DATE><TIME>|<HOST>|E|psMetadataAddV (FILE:LINENO)
     28    Failed to add metadata item to metadata collection list.
    2529<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    26     Duplicate Metadata item, speed, found on line 128 of test.config.  Overwrite not allowed.
     30    Duplicate Metadata item, speed, found on line 127 of test.config.  Overwrite not allowed.
    2731<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    28     Failed to parse the value '9876.54qqq32' of metadata item xPosition, type F64, on line 90 of test.config.
     32    Failed to parse the value '9876.54qqq32' of metadata item xPosition, type F64, on line 89 of test.config.
    2933<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    30     Failed to read a metadata value on line 96 of test.config.
     34    Failed to read a metadata value on line 95 of test.config.
    3135<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    32     Metadata type '99.999', found on line 102 of test.config, is not invalid.
     36    Metadata type '99.999', found on line 101 of test.config, is not invalid.
    3337<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    34     More than one '*' character not allowed.  Found on line 108 of test.config.
     38    More than one '*' character not allowed.  Found on line 107 of test.config.
    3539<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    36     More than one '@' character not allowed.  Found on line 114 of test.config.
     40    More than one '@' character not allowed.  Found on line 113 of test.config.
    3741<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    38     More than one '~' character not allowed.  Found on line 120 of test.config.
     42    More than one '~' character not allowed.  Found on line 119 of test.config.
    3943<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
    4044    Unallowable operation: fileName is NULL.
  • trunk/psLib/test/astronomy/verified/tst_psMetadataIO.stdout

    r3341 r3381  
    2626
    2727Contents of metadata table:
    28  Key Name:  comment  Key mdType: 4  Key Value:                  Key Comment:
     28 Key Name:  comment  Key mdType: 14  Key Value:                  Key Comment:
    2929    Key Name:  comment  Key mdType: 5  Key Value:            This  Key Comment:
    3030    Key Name:  comment  Key mdType: 5  Key Value:              is  Key Comment:
     
    7373
    7474Contents of metadata table:
    75  Key Name:  comment  Key mdType: 4  Key Value:                  Key Comment:
     75 Key Name:  comment  Key mdType: 14  Key Value:                  Key Comment:
    7676    Key Name:  comment  Key mdType: 5  Key Value:            This  Key Comment:
    7777    Key Name:  comment  Key mdType: 5  Key Value:              is  Key Comment:
     
    120120
    121121Contents of metadata table:
    122  Key Name:  comment  Key mdType: 4  Key Value:                  Key Comment:
     122 Key Name:  comment  Key mdType: 14  Key Value:                  Key Comment:
    123123    Key Name:  comment  Key mdType: 5  Key Value:            This  Key Comment:
    124124    Key Name:  comment  Key mdType: 5  Key Value:              is  Key Comment:
  • trunk/psLib/test/astronomy/verified/tst_psMetadata_01.stderr

    r3127 r3381  
    1 <DATE><TIME>|<HOST>|E|psListRemoveData (FILE:LINENO)
    2     Specified data item is not found in the psList.
    3 <DATE><TIME>|<HOST>|E|psMetadataRemove (FILE:LINENO)
    4     Failed to remove metadata item, HISTORY, from metadata list.
    51<DATE><TIME>|<HOST>|E|psMetadataReadHeader (FILE:LINENO)
    62    Unallowable operation: fileName is NULL.
  • trunk/psLib/test/astronomy/verified/tst_psMetadata_01.stdout

    r3341 r3381  
    4444 Key Name:   PCOUNT  Key mdType: 0  Key Value:               0  Key Comment: required keyword; must = 0
    4545 Key Name: XTENSION  Key mdType: 5  Key Value:      'IMAGE   '  Key Comment: IMAGE extension
    46  Key Name:   BITPIX  Key mdType: 4  Key Value:                  Key Comment:
     46 Key Name:   BITPIX  Key mdType: 14  Key Value:                  Key Comment:
    4747    Key Name:   BITPIX  Key mdType: 0  Key Value:             -64  Key Comment: number of bits per data pixel
    4848    Key Name:   BITPIX  Key mdType: 0  Key Value:             -64  Key Comment: number of bits per data pixel
    4949 Key Name:   GCOUNT  Key mdType: 0  Key Value:               1  Key Comment: required keyword; must = 1
    50  Key Name:  HISTORY  Key mdType: 4  Key Value:                  Key Comment:
     50 Key Name:  HISTORY  Key mdType: 14  Key Value:                  Key Comment:
    5151    Key Name:  HISTORY  Key mdType: 5  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
    5252    Key Name:  HISTORY  Key mdType: 5  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
     
    8181 Key Name:   GCOUNT  Key mdType: 0  Key Value:               1  Key Comment: required keyword; must = 1
    8282 Key Name:   BITPIX  Key mdType: 0  Key Value:             -64  Key Comment: number of bits per data pixel
    83  Key Name:  HISTORY  Key mdType: 4  Key Value:                  Key Comment:
     83 Key Name:  HISTORY  Key mdType: 14  Key Value:                  Key Comment:
    8484    Key Name:  HISTORY  Key mdType: 5  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
    8585    Key Name:  HISTORY  Key mdType: 5  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
     
    104104 Key Name:   GCOUNT  Key mdType: 0  Key Value:               1  Key Comment: required keyword; must = 1
    105105 Key Name:  EXTNAME  Key mdType: 5  Key Value:     'MY_DATA_2'  Key Comment:
    106  Key Name:  HISTORY  Key mdType: 5  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
    107  Key Name:  HISTORY  Key mdType: 5  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
    108106
    109107Contents of metadata table:
     
    114112 Key Name:   GCOUNT  Key mdType: 0  Key Value:               1  Key Comment: required keyword; must = 1
    115113 Key Name:   BITPIX  Key mdType: 0  Key Value:             -64  Key Comment: number of bits per data pixel
    116  Key Name:  HISTORY  Key mdType: 4  Key Value:                  Key Comment:
    117     Key Name:  HISTORY  Key mdType: 5  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
    118     Key Name:  HISTORY  Key mdType: 5  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
    119114 Key Name:  EXTNAME  Key mdType: 5  Key Value:     'MY_DATA_2'  Key Comment:
    120115
  • trunk/psLib/test/astronomy/verified/tst_psMetadata_02.stderr

    r3341 r3381  
    44    Unallowable operation: name is NULL.
    55<DATE><TIME>|<HOST>|E|psMetadataItemAllocV (FILE:LINENO)
    6     Specified psMetadataType, 14, is not supported.
     6    Specified psMetadataType, 15, is not supported.
    77<DATE><TIME>|<HOST>|E|psMetadataAddItem (FILE:LINENO)
    88    Unallowable operation: md is NULL.
  • trunk/psLib/test/astronomy/verified/tst_psMetadata_03.stderr

    r3127 r3381  
    22    Unallowable operation: md is NULL.
    33<DATE><TIME>|<HOST>|E|psMetadataRemove (FILE:LINENO)
    4     Could not find metadata item, AARGH.
     4    Failed to remove metadata item, AARGH, from metadata table.
    55<DATE><TIME>|<HOST>|E|psMetadataRemove (FILE:LINENO)
    66    Could not find metadata item at index 22.
     
    1717<DATE><TIME>|<HOST>|E|psMetadataAddItem (FILE:LINENO)
    1818    Unallowable operation: md->table is NULL.
    19 <DATE><TIME>|<HOST>|E|psMetadataAdd (FILE:LINENO)
     19<DATE><TIME>|<HOST>|E|psMetadataAddV (FILE:LINENO)
    2020    Failed to add metadata item to metadata collection list.
  • trunk/psLib/test/astronomy/verified/tst_psMetadata_06.stdout

    r3341 r3381  
    99Key Name:  myItem1  Key mdType:  0  Key Value:             222  Key Comment: I am a signed integer
    1010Key Name:  myItem2  Key mdType:  0  Key Value:             333  Key Comment: I am a signed integer
    11 Key Name:  myItem2  Key mdType:  4  Key Value:                  Key Comment: I am a folder node
     11Key Name:  myItem2  Key mdType:  4  Key Value:          psList  Key Comment: I am a list
    1212
    1313---> TESTPOINT PASSED (psMetadata{Test A - Allocate metadata and items} | tst_psMetadata_06.c)
     
    1515/***************************** TESTPOINT ******************************************\
    1616*             TestFile: tst_psMetadata_06.c                                        *
    17 *            TestPoint: psMetadata{Test B - Add leaf node on top of existing leaf node} *
     17*            TestPoint: psMetadata{Test B - replace an item in the metadata}      *
    1818*             TestType: Positive                                                   *
    1919\**********************************************************************************/
    2020
    2121
    22 ---> TESTPOINT PASSED (psMetadata{Test B - Add leaf node on top of existing leaf node} | tst_psMetadata_06.c)
     22---> TESTPOINT PASSED (psMetadata{Test B - replace an item in the metadata} | tst_psMetadata_06.c)
    2323
    2424/***************************** TESTPOINT ******************************************\
    2525*             TestFile: tst_psMetadata_06.c                                        *
    26 *            TestPoint: psMetadata{Test C - Add leaf node to existing folder node} *
     26*            TestPoint: psMetadata{Test C - add duplicate-key metadata item}      *
    2727*             TestType: Positive                                                   *
    2828\**********************************************************************************/
    2929
    3030
    31 ---> TESTPOINT PASSED (psMetadata{Test C - Add leaf node to existing folder node} | tst_psMetadata_06.c)
     31---> TESTPOINT PASSED (psMetadata{Test C - add duplicate-key metadata item} | tst_psMetadata_06.c)
    3232
    3333/***************************** TESTPOINT ******************************************\
  • trunk/psLib/test/collections/Makefile.am

    r3281 r3381  
    3636TESTS_ENVIRONMENT = perl $(top_srcdir)/test/runTest -verified=$(srcdir)/verified
    3737
     38CLEANFILES = $(TESTS) $(check_DATA)
     39
    3840tests: $(TESTS)
    3941
  • trunk/psLib/test/collections/tst_psMetadataIO.c

    r3341 r3381  
    11/** @file  tst_psMetadataIO.c
    2 *
    3 *  @brief Test driver for psMetadataIO functions
    4 *
    5 *  This test driver contains the following tests for psMetadata:
    6 *    Test A - Read config file with overwrite set true
    7 *    Test B - Read config file with overwrite set false
    8 *    Test C - Read config file without auto-allocation of metadata
    9 *    Test D - Attempt to use null fileName argument
    10 *    Test E - Attempt to open nonexistant file
    11 *    Test F - Free psMetadata
    12 *
    13 *  @author  Ross Harman, MHPCC
    14 *
    15 *  @version $Revision: 1.10 $  $Name: not supported by cvs2svn $
    16 *  @date  $Date: 2005-02-28 23:34:10 $
    17 *
    18 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    19 *
    20 */
     2 *
     3 *  @brief Test driver for psMetadataIO functions
     4 *
     5 *  This test driver contains the following tests for psMetadata:
     6 *    Test A - Read config file with overwrite set true
     7 *    Test B - Read config file with overwrite set false
     8 *    Test C - Read config file without auto-allocation of metadata
     9 *    Test D - Attempt to use null fileName argument
     10 *    Test E - Attempt to open nonexistant file
     11 *    Test F - Free psMetadata
     12 *
     13 *  @author  Ross Harman, MHPCC
     14 *  @author  Robert DeSonia, MHPCC
     15 *
     16 *  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
     17 *  @date  $Date: 2005-03-07 20:58:50 $
     18 *
     19 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     20 *
     21 */
    2122
    2223#include <string.h>
     
    6970
    7071    switch (metadataItem->type) {
    71     case PS_META_LIST:
     72    case PS_META_MULTI:
    7273        printf("Key Value: %17c", ' ');
    7374        break;
     
    9293    printf("Key Comment: %s\n", metadataItem->comment);
    9394
    94     if(metadataItem->data.V && metadataItem->type==PS_META_LIST) {
     95    if(metadataItem->data.V && metadataItem->type==PS_META_MULTI) {
    9596        printMetadataList(metadataItem->data.V, "    ");
    9697    }
  • trunk/psLib/test/collections/tst_psMetadata_01.c

    r3341 r3381  
    1818*  @author  Ross Harman, MHPCC
    1919*
    20 *  @version $Revision: 1.21 $  $Name: not supported by cvs2svn $
    21 *  @date  $Date: 2005-02-28 23:34:10 $
     20*  @version $Revision: 1.22 $  $Name: not supported by cvs2svn $
     21*  @date  $Date: 2005-03-07 20:58:50 $
    2222*
    2323*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    7575
    7676    switch (metadataItem->type) {
    77     case PS_META_LIST:
     77    case PS_META_MULTI:
    7878        printf("Key Value: %17c", ' ');
    7979        break;
     
    9898    printf("Key Comment: %s\n", metadataItem->comment);
    9999
    100     if(metadataItem->data.V && metadataItem->type==PS_META_LIST) {
     100    if(metadataItem->data.V && metadataItem->type==PS_META_MULTI) {
    101101        printMetadataList(metadataItem->data.V, "    ");
    102102    }
  • trunk/psLib/test/collections/tst_psMetadata_02.c

    r3341 r3381  
    11/** @file  tst_psMetadata_02.c
    2 *
    3 *  @brief Test driver for psMetadata functions
    4 *
    5 *  This test driver contains the following tests for psMetadata:
    6 *     Test A - Allocate metadata items
    7 *     Test B - Attempt to create metadata item with null name
    8 *     Test C - Attempt to create metadata item with invalid type
    9 *     Test D - Allocate metadata
    10 *     Test E - Attempt to add metadata item to null metadata
    11 *     Test F - Attempt to add null metadata item to metadata
    12 *     Test G - Free psMetadata
    13 *
    14 *  @author  Ross Harman, MHPCC
    15 *
    16 *  @version $Revision: 1.12 $  $Name: not supported by cvs2svn $
    17 *  @date  $Date: 2005-02-28 23:34:10 $
    18 *
    19 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
    20 *
    21 */
     2 *
     3 *  @brief Test driver for psMetadata functions
     4 *
     5 *  This test driver contains the following tests for psMetadata:
     6 *     Test A - Allocate metadata items
     7 *     Test B - Attempt to create metadata item with null name
     8 *     Test C - Attempt to create metadata item with invalid type
     9 *     Test D - Allocate metadata
     10 *     Test E - Attempt to add metadata item to null metadata
     11 *     Test F - Attempt to add null metadata item to metadata
     12 *     Test G - Free psMetadata
     13 *
     14 *  @author  Ross Harman, MHPCC
     15 *  @author  Robert DeSonia, MHPCC
     16 *
     17 *  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
     18 *  @date  $Date: 2005-03-07 20:58:50 $
     19 *
     20 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     21 *
     22 */
    2223
    2324#include <string.h>
     
    3132
    3233    switch (metadataItem->type) {
    33     case PS_META_LIST:
     34    case PS_META_MULTI:
    3435        printf("Key Value: %17c", ' ');
    3536        break;
     
    110111    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to add metadata item to null metadata",
    111112                            "Null metadata collection not allowed", 0);
    112     psMetadataAddItem(NULL, item1, PS_LIST_HEAD);
     113    psMetadataAddItem(NULL, item1, PS_LIST_HEAD, PS_META_DEFAULT);
    113114    printFooter(stdout, "psMetadata", "Test E - Attempt to add metadata item to null metadata", true);
    114115
     
    117118    printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to add null metadata item to metadata",
    118119                            "Null metadata item not allowed", 0);
    119     psMetadataAddItem(metadata, NULL, PS_LIST_HEAD);
     120    psMetadataAddItem(metadata, NULL, PS_LIST_HEAD, PS_META_DEFAULT);
    120121    printFooter(stdout, "psMetadata", "Test F - Attempt to add null metadata item to metadata", true);
    121122
  • trunk/psLib/test/collections/tst_psMetadata_03.c

    r3341 r3381  
    1818*  @author  Ross Harman, MHPCC
    1919*
    20 *  @version $Revision: 1.14 $  $Name: not supported by cvs2svn $
    21 *  @date  $Date: 2005-02-28 23:34:10 $
     20*  @version $Revision: 1.15 $  $Name: not supported by cvs2svn $
     21*  @date  $Date: 2005-03-07 20:58:50 $
    2222*
    2323*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3535
    3636    switch (metadataItem->type) {
    37     case PS_META_LIST:
     37    case PS_META_MULTI:
    3838        printf("Key Value: %17c", ' ');
    3939        break;
     
    9090    // Test B - Remove items from metadata by name
    9191    printPositiveTestHeader(stdout, "psMetadata", "Test B - Remove items from metadata by name");
    92     if(!psMetadataAddItem(metadata, item1, PS_LIST_HEAD)) {
     92    if(!psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT)) {
    9393        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by name.");
    9494        return 10;
     
    111111    // Test C - Remove items from metadata by index
    112112    printPositiveTestHeader(stdout, "psMetadata", "Test C - Remove items from metadata by index");
    113     if ( ! psMetadataAddItem(metadata, item3, PS_LIST_HEAD) ) {
     113    if ( ! psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
    114114        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by index.");
    115115        return 14;
     
    166166    mdTable = errMetadata->table;
    167167    errMetadata->table = NULL;
    168     if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD) ) {
     168    if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
    169169        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o hash table.");
    170170        return 21;
     
    182182    mdList = errMetadata->list;
    183183    errMetadata->list = NULL;
    184     if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD) ) {
     184    if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
    185185        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o link list.");
    186186        return 22;
     
    198198    errName = errItem->name;
    199199    errItem->name = NULL;
    200     if ( psMetadataAddItem(errMetadata, errItem, PS_LIST_HEAD) ) {
     200    if ( psMetadataAddItem(errMetadata, errItem, PS_LIST_HEAD, PS_META_DEFAULT) ) {
    201201        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false with item with null name.");
    202202        return 23;
  • trunk/psLib/test/collections/tst_psMetadata_04.c

    r3341 r3381  
    2323*  @author  Ross Harman, MHPCC
    2424*
    25 *  @version $Revision: 1.15 $  $Name: not supported by cvs2svn $
    26 *  @date  $Date: 2005-02-28 23:34:10 $
     25*  @version $Revision: 1.16 $  $Name: not supported by cvs2svn $
     26*  @date  $Date: 2005-03-07 20:58:50 $
    2727*
    2828*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    4040
    4141    switch (metadataItem->type) {
    42     case PS_META_LIST:
     42    case PS_META_MULTI:
    4343        printf("Key Value: %17c", ' ');
    4444        break;
     
    9595    printMetadataItem(item4);
    9696    printMetadataItem(item5);
    97     psMetadataAddItem(metadata, item1, PS_LIST_HEAD);
    98     psMetadataAddItem(metadata, item2, PS_LIST_HEAD);
    99     psMetadataAddItem(metadata, item3, PS_LIST_HEAD);
    100     psMetadataAddItem(metadata, item4, PS_LIST_HEAD);
    101     psMetadataAddItem(metadata, item5, PS_LIST_HEAD);
    102     psMetadataAddItem(metadata, item6, PS_LIST_HEAD);
     97    psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT);
     98    psMetadataAddItem(metadata, item2, PS_LIST_HEAD, PS_META_DEFAULT);
     99    psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT);
     100    psMetadataAddItem(metadata, item4, PS_LIST_HEAD, PS_META_DEFAULT);
     101    psMetadataAddItem(metadata, item5, PS_LIST_HEAD, PS_META_DEFAULT);
     102    psMetadataAddItem(metadata, item6, PS_LIST_HEAD, PS_META_DEFAULT);
    103103    psFree(vec);
    104104    printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
  • trunk/psLib/test/collections/tst_psMetadata_05.c

    r3341 r3381  
    2222*  @author  Ross Harman, MHPCC
    2323*
    24 *  @version $Revision: 1.20 $  $Name: not supported by cvs2svn $
    25 *  @date  $Date: 2005-02-28 23:34:10 $
     24*  @version $Revision: 1.21 $  $Name: not supported by cvs2svn $
     25*  @date  $Date: 2005-03-07 20:58:50 $
    2626*
    2727*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3939
    4040    switch (metadataItem->type) {
    41     case PS_META_LIST:
     41    case PS_META_MULTI:
    4242        printf("Key Value: %17c", ' ');
    4343        break;
     
    9292    printMetadataItem(item3);
    9393    printMetadataItem(item4);
    94     psMetadataAddItem(metadata, item1, PS_LIST_HEAD);
    95     psMetadataAddItem(metadata, item2, PS_LIST_HEAD);
    96     psMetadataAddItem(metadata, item3, PS_LIST_HEAD);
    97     psMetadataAddItem(metadata, item4, PS_LIST_HEAD);
     94    psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT);
     95    psMetadataAddItem(metadata, item2, PS_LIST_HEAD, PS_META_DEFAULT);
     96    psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT);
     97    psMetadataAddItem(metadata, item4, PS_LIST_HEAD, PS_META_DEFAULT);
    9898    printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
    9999
  • trunk/psLib/test/collections/tst_psMetadata_06.c

    r3341 r3381  
    1313*  @author  Ross Harman, MHPCC
    1414*
    15 *  @version $Revision: 1.10 $  $Name: not supported by cvs2svn $
    16 *  @date  $Date: 2005-02-28 23:34:10 $
     15*  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
     16*  @date  $Date: 2005-03-07 20:58:50 $
    1717*
    1818*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3030
    3131    switch (metadataItem->type) {
     32    case PS_META_MULTI:
     33        printf("Key Value: %17c", ' ');
     34        break;
    3235    case PS_META_LIST:
    33         printf("Key Value: %17c", ' ');
     36        printf("Key Value: %15s  ", "psList");
    3437        break;
    3538    case PS_META_BOOL:
     
    7174    item1c = psMetadataItemAlloc("myItem1", PS_META_S32, "I am a signed integer", 222);
    7275    item2a = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a signed integer", 333);
    73     item2b = psMetadataItemAlloc("myItem2", PS_META_LIST, "I am a folder node", NULL);
     76    item2b = psMetadataItemAlloc("myItem2", PS_META_LIST, "I am a list", NULL);
    7477    metadata = psMetadataAlloc();
    7578    printMetadataItem(item1a);
     
    8285
    8386    // Test B - Add leaf node on top of existing leaf node
    84     printPositiveTestHeader(stdout, "psMetadata", "Test B - Add leaf node on top of existing leaf node");
    85     if(!psMetadataAddItem(metadata, item1a, PS_LIST_HEAD)) {
     87    printPositiveTestHeader(stdout, "psMetadata", "Test B - replace an item in the metadata");
     88    if(!psMetadataAddItem(metadata, item1a, PS_LIST_HEAD, PS_META_DEFAULT)) {
    8689        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
    8790        return 20;
    8891    }
    89     if (!psMetadataAddItem(metadata, item1b, PS_LIST_HEAD)) {
     92    psMetadataItem* tempItem = psMetadataLookup(metadata, item1a->name);
     93    if (tempItem != item1a) {
     94        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add the metadata entry.");
     95        return 20;
     96    }
     97
     98    if (!psMetadataAddItem(metadata, item1b, PS_LIST_HEAD, PS_META_REPLACE)) {
    9099        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
    91100        return 21;
    92101    }
    93102
    94     printFooter(stdout, "psMetadata", "Test B - Add leaf node on top of existing leaf node", true);
     103    tempItem = psMetadataLookup(metadata, item1a->name);
     104    if (tempItem != item1b) {
     105        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't replace the metadata entry.");
     106        return 21;
     107    }
     108
     109    printFooter(stdout, "psMetadata", "Test B - replace an item in the metadata", true);
    95110
    96111
    97112    // Test C - Add leaf node to existing folder node
    98     printPositiveTestHeader(stdout, "psMetadata", "Test C - Add leaf node to existing folder node");
    99     if (!psMetadataAddItem(metadata, item1c, PS_LIST_HEAD)) {
     113    printPositiveTestHeader(stdout, "psMetadata", "Test C - add duplicate-key metadata item");
     114    if (!psMetadataAddItem(metadata, item1c, PS_LIST_HEAD, PS_META_DUPLICATE_OK)) {
    100115        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem return false for adding a not to existing node.");
    101116        return 22;
    102117    }
    103     printFooter(stdout, "psMetadata", "Test C - Add leaf node to existing folder node", true);
     118
     119    tempItem = psMetadataLookup(metadata, item1a->name);
     120    if (tempItem == NULL || tempItem->type != PS_META_MULTI) {
     121        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add additional metadata entry of same key.");
     122        return 22;
     123    }
     124    printFooter(stdout, "psMetadata", "Test C - add duplicate-key metadata item", true);
    104125
    105126
    106127    // Test D - Add folder node on top of existing leaf node
    107128    printPositiveTestHeader(stdout, "psMetadata", "Test D - Add folder node on top of existing leaf node");
    108     if (!psMetadataAddItem(metadata, item2a, PS_LIST_HEAD)) {
     129    if (!psMetadataAddItem(metadata, item2a, PS_LIST_HEAD, PS_META_DEFAULT)) {
    109130        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node to existing leaf node.");
    110131        return 23;
    111132    }
    112     if (!psMetadataAddItem(metadata, item2b, PS_LIST_HEAD)) {
     133    if (!psMetadataAddItem(metadata, item2b, PS_LIST_HEAD, PS_META_DUPLICATE_OK)) {
    113134        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a nod to existing leaf node.");
    114135        return 24;
    115136    }
    116137    printFooter(stdout, "psMetadata", "Test D - Add folder node on top of existing leaf node", true);
     138    tempItem = psMetadataLookup(metadata, item1a->name);
     139    if (tempItem == NULL || tempItem->type != PS_META_MULTI) {
     140        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add additional metadata entry of same key.");
     141        return 24;
     142    }
    117143
    118144
  • trunk/psLib/test/dataIO/Makefile.am

    r3298 r3381  
    2727tests: $(TESTS)
    2828
     29CLEANFILES = $(TESTS) $(check_DATA)
     30
    2931tst_psLookupTable_01_SOURCES =  tst_psLookupTable_01.c
    3032tst_psFits_SOURCES =  tst_psFits.c
  • trunk/psLib/test/dataManip/Makefile.am

    r3378 r3381  
    6060check_PROGRAMS = $(TESTS)
    6161
     62CLEANFILES = $(TESTS) $(check_DATA)
     63
    6264TESTS_ENVIRONMENT = perl $(top_srcdir)/test/runTest -verified=$(srcdir)/verified
    6365
  • trunk/psLib/test/fileUtils/Makefile.am

    r3298 r3381  
    2727tests: $(TESTS)
    2828
     29CLEANFILES = $(TESTS) $(check_DATA)
     30
    2931tst_psLookupTable_01_SOURCES =  tst_psLookupTable_01.c
    3032tst_psFits_SOURCES =  tst_psFits.c
  • trunk/psLib/test/image/Makefile.am

    r3311 r3381  
    3535TESTS_ENVIRONMENT = perl $(top_srcdir)/test/runTest -verified=$(srcdir)/verified
    3636
     37CLEANFILES = $(TESTS) $(check_DATA)
     38
    3739tests: $(TESTS)
    3840
  • trunk/psLib/test/sysUtils/Makefile.am

    r3275 r3381  
    2828TESTS_ENVIRONMENT = perl $(top_srcdir)/test/runTest -verified=$(srcdir)/verified
    2929
     30CLEANFILES = $(TESTS) $(check_DATA)
     31
    3032tests: $(TESTS)
    3133
Note: See TracChangeset for help on using the changeset viewer.