Index: trunk/psLib/src/collections/psMetadata.c
===================================================================
--- trunk/psLib/src/collections/psMetadata.c	(revision 2529)
+++ trunk/psLib/src/collections/psMetadata.c	(revision 2607)
@@ -12,6 +12,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.38 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2004-11-30 00:26:53 $
+*  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2004-12-03 23:14:28 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -80,8 +80,5 @@
     psFree(metadataItem->name);
     psFree(metadataItem->comment);
-    psFree(metadataItem->items);
-    if (type == PS_META_STR || type == PS_META_VEC || type == PS_META_IMG || type == PS_META_LOOKUPTABLE ||
-            type == PS_META_JPEG || type == PS_META_PNG || type == PS_META_ASTROM || type == PS_META_UNKNOWN ||
-            type == PS_META_HASH) {
+    if (type != PS_META_PRIMITIVE) {
         psFree(metadataItem->data.V);
     }
@@ -101,5 +98,6 @@
 /*****************************************************************************/
 
-psMetadataItem* psMetadataItemAlloc(const char *name, psMetadataType type, const char *comment, ...)
+psMetadataItem* psMetadataItemAlloc(const char *name, psElemType pType, psMetadataType type,
+                                    const char *comment, ...)
 {
     va_list argPtr;
@@ -110,5 +108,5 @@
 
     // Call metadata item allocation
-    metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
+    metadataItem = psMetadataItemAllocV(name, pType, type, comment, argPtr);
 
     // Clean up stack after variable arguement has been used
@@ -118,9 +116,7 @@
 }
 
-psMetadataItem* psMetadataItemAllocV(const char *name, psMetadataType type, const char *comment,
-                                     va_list argPtr)
-{
-    psVector *vecIn = NULL;
-    psVector *vecOut = NULL;
+psMetadataItem* psMetadataItemAllocV(const char *name, psElemType pType, psMetadataType type,
+                                     const char *comment, va_list argPtr)
+{
     psMetadataItem* metadataItem = NULL;
 
@@ -129,5 +125,6 @@
 
     // Allocate metadata item
-    metadataItem = (psMetadataItem* ) psAlloc(sizeof(psMetadataItem));
+    metadataItem = (psMetadataItem*) psAlloc(sizeof(psMetadataItem));
+    metadataItem->data.V = NULL;
 
     // Set deallocator
@@ -148,8 +145,5 @@
     // Set metadata item type
     metadataItem->type = type;
-    metadataItem->data.V = NULL;
-
-    // Allocate metadata items with same name.
-    metadataItem->items = psListAlloc(NULL);
+    metadataItem->pType = pType;
 
     // Allocate and set metadata item name
@@ -158,39 +152,40 @@
 
     // Set metadata item value
-    switch (type) {
-    case PS_META_ITEM_SET:
-        break;
-    case PS_META_BOOL:
-        metadataItem->data.B = (psBool)va_arg(argPtr, psS32);
-        break;
-    case PS_META_S32:
-        metadataItem->data.S32 = (psS32)va_arg(argPtr, psS32);
-        break;
-    case PS_META_F32:
-        metadataItem->data.F32 = (psF32)va_arg(argPtr, psF64);
-        break;
-    case PS_META_F64:
-        metadataItem->data.F64 = va_arg(argPtr, psF64);
+    switch(type) {
+    case PS_META_PRIMITIVE:
+        switch(pType) {
+        case PS_TYPE_BOOL:
+            metadataItem->data.B = (psBool)va_arg(argPtr, psS32);
+            break;
+        case PS_TYPE_S32:
+            metadataItem->data.S32 = (psS32)va_arg(argPtr, psS32);
+            break;
+        case PS_TYPE_F32:
+            metadataItem->data.F32 = (psF32)va_arg(argPtr, psF64);
+            break;
+        case PS_TYPE_F64:
+            metadataItem->data.F64 = (psF64)va_arg(argPtr, psF64);
+            break;
+        default:
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_METATYPE_INVALID, type);
+            psFree(metadataItem);
+            metadataItem = NULL;
+        }
         break;
     case PS_META_STR:
+        // Perform copy of input strings
         metadataItem->data.V = psStringNCopy(va_arg(argPtr, char *), MAX_STRING_LENGTH);
         break;
+    case PS_META_LIST:
     case PS_META_VEC:
-        vecIn = (psVector*)va_arg(argPtr, psVector*);
-        vecOut = psVectorAlloc(vecIn->nalloc, vecIn->type.type);
-        memcpy(vecOut->data.V, vecIn->data.V, vecIn->nalloc*PSELEMTYPE_SIZEOF(vecIn->type.type));
-        metadataItem->data.V = vecOut;
-        break;
+    case PS_META_HASH:
     case PS_META_LOOKUPTABLE:
-        metadataItem->data.V = va_arg(argPtr, psLookupTable*); // Deep copy of input data not performed
-        break;
-    case PS_META_HASH:
-        metadataItem->data.V = va_arg(argPtr, psHash*); // Deep copy of input data not performed
-        break;
-    case PS_META_IMG:
     case PS_META_JPEG:
     case PS_META_PNG:
     case PS_META_ASTROM:
     case PS_META_UNKNOWN:
+        // Copy of input data not performed due to variability of data types
+        metadataItem->data.V = va_arg(argPtr, psPtr);
+        break;
     default:
         psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_METATYPE_INVALID, type);
@@ -209,11 +204,11 @@
 
     // Allocate metadata
-    metadata = (psMetadata* ) psAlloc(sizeof(psMetadata));
+    metadata = (psMetadata*) psAlloc(sizeof(psMetadata));
     // Set deallocator
     p_psMemSetDeallocator(metadata, (psFreeFcn) metadataFree);
 
     // Allocate metadata's internal containers
-    list = (psList* ) psListAlloc(NULL);
-    table = (psHash* ) psHashAlloc(10);
+    list = (psList*) psListAlloc(NULL);
+    table = (psHash*) psHashAlloc(10);
 
     metadata->list = list;
@@ -223,5 +218,5 @@
 }
 
-psBool psMetadataAddItem( psMetadata *restrict md, psMetadataItem *restrict metadataItem, psS32 location )
+psBool psMetadataAddItem(psMetadata *restrict md, psMetadataItem *restrict metadataItem, psS32 location)
 {
     char * key = NULL;
@@ -230,5 +225,5 @@
     psMetadataItem *existingEntry = NULL;
     psMetadataItem *newFolderEntry = NULL;
-    psMetadataType newType = PS_META_ITEM_SET;
+    psMetadataType newType;
 
     PS_PTR_CHECK_NULL(md,NULL);
@@ -247,30 +242,29 @@
     if(existingEntry != NULL) {
 
-        if(existingEntry->type == PS_META_ITEM_SET) {
+        if(existingEntry->type == PS_META_LIST) {
+
+            if(existingEntry->data.list == NULL) {
+                existingEntry->data.list = psListAlloc(NULL);
+            }
 
             // Add leaf node to existing folder node
-            if(!psListAdd(existingEntry->items, PS_LIST_TAIL, metadataItem)) {
-                psError(PS_ERR_UNKNOWN,false,
-                        PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,
-                        metadataItem->name );
-                return false;
-            }
-        } else if(existingEntry->type != PS_META_ITEM_SET && newType!= PS_META_ITEM_SET) {
+            if(!psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem)) {
+                psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED, metadataItem->name);
+                return false;
+            }
+        } else if(existingEntry->type != PS_META_LIST && newType!= PS_META_LIST) {
 
             // Leaf node replaces another leaf. Make new folder node and add leaves.
-            newFolderEntry = psMetadataItemAlloc(key, PS_META_ITEM_SET, NULL, NULL);
-
-            if(!psListAdd(newFolderEntry->items, PS_LIST_TAIL, existingEntry)) {
-                psError(PS_ERR_UNKNOWN,false,
-                        PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,
-                        key);
+            newFolderEntry = psMetadataItemAlloc(key, PS_TYPE_PTR, PS_META_LIST, NULL, NULL);
+            newFolderEntry->data.list = psListAlloc(NULL);
+
+            if(!psListAdd(newFolderEntry->data.list, PS_LIST_TAIL, existingEntry)) {
+                psError(PS_ERR_UNKNOWN,false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
                 psFree(newFolderEntry);
                 return false;
             }
 
-            if(!psListAdd(newFolderEntry->items, PS_LIST_TAIL, metadataItem)) {
-                psError(PS_ERR_UNKNOWN,false,
-                        PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,
-                        key);
+            if(!psListAdd(newFolderEntry->data.list, PS_LIST_TAIL, metadataItem)) {
+                psError(PS_ERR_UNKNOWN,false, PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
                 psFree(newFolderEntry);
                 return false;
@@ -278,7 +272,5 @@
 
             if(!psHashRemove(mdTable, key)) {
-                psError(PS_ERR_UNKNOWN,false,
-                        PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,
-                        key);
+                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,key);
                 psFree(newFolderEntry);
                 return false;
@@ -286,7 +278,5 @@
 
             if(!psHashAdd(mdTable, key, newFolderEntry)) {
-                psError(PS_ERR_UNKNOWN,false,
-                        PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,
-                        key);
+                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
                 psFree(newFolderEntry);
                 return false;
@@ -298,22 +288,20 @@
 
             // Folder node replaces leaf or folder node - Put old node into new folder and remove from table
-            if(!psListAdd(metadataItem->items, PS_LIST_TAIL, existingEntry)) {
-                psError(PS_ERR_UNKNOWN,false,
-                        PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,
-                        key);
+            if(metadataItem->data.list == NULL) {
+                metadataItem->data.list = psListAlloc(NULL);
+            }
+
+            if(!psListAdd(metadataItem->data.list, PS_LIST_TAIL, existingEntry)) {
+                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED,key);
                 return false;
             }
 
             if(!psHashRemove(mdTable, key)) {
-                psError(PS_ERR_UNKNOWN,false,
-                        PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,
-                        key);
+                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,key);
                 return false;
             }
 
             if(!psHashAdd(mdTable, key, metadataItem)) {
-                psError(PS_ERR_UNKNOWN,false,
-                        PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,
-                        key);
+                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
                 return false;
             }
@@ -323,7 +311,5 @@
         // Node doesn't exist - Add new metadata item to metadata collection's hash
         if(!psHashAdd(mdTable, key, metadataItem)) {
-            psError(PS_ERR_UNKNOWN,false,
-                    PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,
-                    key);
+            psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
             return false;
         }
@@ -331,10 +317,8 @@
 
     // Add items to metadata collection's list, even if they have the same metadata item names. Folder nodes
-    // (PS_META_ITEM_SET metadata items) are not added, since the metadata list is flat.
-    if(metadataItem->type != PS_META_ITEM_SET) {
+    // (PS_META_LIST metadata items) are not added, since the metadata list is flat.
+    if(metadataItem->type != PS_META_LIST) {
         if(!psListAdd(mdList, location, metadataItem)) {
-            psError(PS_ERR_UNKNOWN,false,
-                    PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,
-                    key);
+            psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
             return false;
         }
@@ -344,6 +328,6 @@
 }
 
-psBool psMetadataAdd(psMetadata* restrict md, psS32 where, const char *name, psMetadataType type,
-                     const char *comment, ...)
+psBool psMetadataAdd(psMetadata* restrict md, psS32 where, const char *name, psElemType pType,
+                     psMetadataType type, const char *comment, ...)
 {
     va_list argPtr;
@@ -351,10 +335,9 @@
 
     va_start(argPtr, comment);
-    metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
+    metadataItem = psMetadataItemAllocV(name, pType, type, comment, argPtr);
     va_end(argPtr);
 
     if (!psMetadataAddItem(md, metadataItem, where)) {
-        psError(PS_ERR_UNKNOWN,false,
-                PS_ERRORTEXT_psMetadata_ADD_FAILED);
+        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_FAILED);
         psFree(metadataItem);
         return false;
@@ -368,6 +351,6 @@
 psBool psMetadataRemove(psMetadata* restrict md, psS32 where, const char *restrict key)
 {
-    psS32 numChildren = 0;
     psList* mdList = NULL;
+    psList* entryList = NULL;
     psHash* mdTable = NULL;
     psMetadataItem* entry = NULL;
@@ -386,26 +369,21 @@
 
         // Remove by key name
-        entry = (psMetadataItem* ) psHashLookup(mdTable, key);
+        entry = (psMetadataItem*)psHashLookup(mdTable, key);
         if (entry == NULL) {
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
-                    PS_ERRORTEXT_psMetadata_FIND_FAILED,
-                    key);
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_FAILED, key);
             return false;
         }
 
-        numChildren = entry->items->size;
-        if (entry->type == PS_META_ITEM_SET && numChildren > 0) {
+        if (entry->type == PS_META_LIST) {
 
             // Table entry has children. Entry and children must be removed from metadata collection's list
-            psListSetIterator(entry->items, PS_LIST_HEAD);
-            entryChild = psListGetCurrent(entry->items);
-            while (entryChild != NULL) {
+            psListSetIterator(entryList, PS_LIST_HEAD);
+            entryChild = psListGetCurrent(entryList);
+            while(entryChild != NULL) {
                 if (!psListRemove(mdList, PS_LIST_UNKNOWN, entryChild)) {
-                    psError(PS_ERR_UNKNOWN,false,
-                            PS_ERRORTEXT_psMetadata_REMOVE_LIST_FAILED,
-                            key);
+                    psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_LIST_FAILED, key);
                     return false;
                 }
-                entryChild = psListGetNext(entry->items);
+                entryChild = psListGetNext(entryList);
             }
         } else {
@@ -413,7 +391,5 @@
             // Table entry has no children. Remove entry from metadata collection's list
             if (!psListRemove(mdList, PS_LIST_UNKNOWN, entry)) {
-                psError(PS_ERR_UNKNOWN,false,
-                        PS_ERRORTEXT_psMetadata_REMOVE_LIST_FAILED,
-                        key);
+                psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_LIST_FAILED, key);
                 return false;
             }
@@ -421,7 +397,5 @@
         // Remove entry from metadata collection's table
         if (!psHashRemove(mdTable, key)) {
-            psError(PS_ERR_UNKNOWN,false,
-                    PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED,
-                    key);
+            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
             return false;
         }
@@ -431,15 +405,11 @@
         entry = psListGet(mdList, where);
         if (entry == NULL) {
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
-                    PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED,
-                    where);
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED, where);
             return false;
         }
 
         key = entry->name;
-        if (key == NULL) {
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
-                    PS_ERRORTEXT_psMetadata_REMOVE_LIST_INDEX_FAILED,
-                    where);
+        if(key == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_REMOVE_LIST_INDEX_FAILED, where);
             return false;
         }
@@ -463,5 +433,5 @@
     mdTable = md->table;
 
-    entry = (psMetadataItem* ) psHashLookup(mdTable, key);
+    entry = (psMetadataItem*)psHashLookup(mdTable, key);
     if (entry == NULL) {
         return NULL;
@@ -478,9 +448,7 @@
     PS_PTR_CHECK_NULL(md->list,NULL);
 
-    entry = (psMetadataItem* ) psListGet(md->list, where);
+    entry = (psMetadataItem*) psListGet(md->list, where);
     if (entry == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
-                PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED,
-                where);
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED, where);
         return NULL;
     }
Index: trunk/psLib/src/collections/psMetadata.h
===================================================================
--- trunk/psLib/src/collections/psMetadata.h	(revision 2529)
+++ trunk/psLib/src/collections/psMetadata.h	(revision 2607)
@@ -11,6 +11,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.26 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2004-11-30 00:27:14 $
+*  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2004-12-03 23:14:34 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -33,42 +33,17 @@
  */
 typedef enum {
-    PS_META_ITEM_SET = 0,              ///< Null. Metadata is in psMetadataItem.items
-    PS_META_BOOL,                      ///< Boolean data.
-    PS_META_S32,                       ///< Signed 32-bit integer data.
-    PS_META_F32,                       ///< Single-precision float data.
-    PS_META_F64,                       ///< Double-precision float data.
-    PS_META_STR,                       ///< String data (Stored in as psPtr ).
-    PS_META_VEC,                       ///< Vector data (Stored in as psPtr ).
-    PS_META_HASH,                      ///< Hash data (Stored in as psPtr ).
-    PS_META_IMG,                       ///< Image data (Stored in as psPtr ).
-    PS_META_LOOKUPTABLE,               ///< Lookup table data (Stored as void *).
-    PS_META_JPEG,                      ///< JPEG data (Stored in as psPtr ).
-    PS_META_PNG,                       ///< PNG data (Stored in as psPtr ).
-    PS_META_ASTROM,                    ///< Astrometric coefficients (Stored in as psPtr ).
-    PS_META_UNKNOWN,                   ///< Other data (Stored in as psPtr ).
+    PS_META_PRIMITIVE,                 ///< Primitive data.
+    PS_META_LIST,                      ///< List data (Stored as item.data.list).
+    PS_META_STR,                       ///< String data (Stored as item.data.V).
+    PS_META_VEC,                       ///< Vector data (Stored as item.data.V).
+    PS_META_IMG,                       ///< Image data (Stored as item.data.V).
+    PS_META_HASH,                      ///< Hash data (Stored as item.data.V).
+    PS_META_LOOKUPTABLE,               ///< Lookup table data (Stored as item.data.V).
+    PS_META_JPEG,                      ///< JPEG data (Stored as item.data.V).
+    PS_META_PNG,                       ///< PNG data (Stored as item.data.V).
+    PS_META_ASTROM,                    ///< Astrometric coefficients (Stored as item.data.V).
+    PS_META_UNKNOWN,                   ///< Other data (Stored as item.data.V).
     PS_META_NTYPE                      ///< Number of types. Must be last.
 } psMetadataType;
-
-/** Metadata item data structure.
- *
- * Struct for maintaining metadata items of varying types. It also contains
- * information about the item name, flags, comments, and other items with the same name.
- */
-typedef struct psMetadataItem
-{
-    const psS32 id;                      ///< Unique ID for metadata item.
-    char *restrict name;               ///< Name of metadata item.
-    psMetadataType type;               ///< Type of metadata item.
-    union {
-        psBool B;                        ///< boolean data
-        psS32 S32;                     ///< Signed 32-bit integer data.
-        psF32 F32;                     ///< Single-precision float data.
-        psF64 F64;                     ///< Double-precision float data.
-        psPtr V;                       ///< Pointer to other type of data.
-    } data;                            ///< Union for data types.
-    char *comment;                     ///< Optional comment ("", not NULL).
-    psList* restrict items;            ///< List of psMetadataItems with same name.
-}
-psMetadataItem;
 
 /** Metadata data structure.
@@ -85,4 +60,28 @@
 }
 psMetadata;
+
+/** Metadata item data structure.
+ *
+ * Struct for maintaining metadata items of varying types. It also contains
+ * information about the item name, flags, comments, and other items with the same name.
+ */
+typedef struct psMetadataItem
+{
+    const psS32 id;                    ///< Unique ID for metadata item.
+    char *name;                        ///< Name of metadata item.
+    psMetadataType type;               ///< Type of metadata item.
+    psElemType pType;                  ///< Primitive data type
+    union {
+        psBool B;                      ///< boolean data
+        psS32 S32;                     ///< Signed 32-bit integer data.
+        psF32 F32;                     ///< Single-precision float data.
+        psF64 F64;                     ///< Double-precision float data.
+        psList *list;                  ///< List data.
+        psMetadata *md;                ///< Metadata data.
+        psPtr V;                       ///< Pointer to other type of data.
+    } data;                            ///< Union for data types.
+    char *comment;                     ///< Optional comment ("", not NULL).
+}
+psMetadataItem;
 
 /** Create a metadata item.
@@ -103,4 +102,5 @@
 psMetadataItem* psMetadataItemAlloc(
     const char *name,                  ///< Name of metadata item.
+    psElemType pType,                  ///< Primitive type.
     psMetadataType type,               ///< Type of metadata item.
     const char *comment,               ///< Comment for metadata item.
@@ -125,4 +125,5 @@
 psMetadataItem* psMetadataItemAllocV(
     const char *name,                  ///< Name of metadata item.
+    psElemType pType,                  ///< Primitive type.
     psMetadataType type,               ///< Type of metadata item.
     const char *comment,               ///< Comment for metadata item.
@@ -149,5 +150,5 @@
     psMetadata* restrict md,           ///< Metadata collection to insert metadat item.
     psMetadataItem* restrict item,     ///< Metadata item to be added.
-    psS32 location                       ///< Location to be added.
+    psS32 location                     ///< Location to be added.
 );
 
@@ -160,6 +161,7 @@
 psBool psMetadataAdd(
     psMetadata* restrict md,           ///< Metadata collection to insert metadat item.
-    psS32 where,                         ///< Location to be added.
+    psS32 where,                       ///< Location to be added.
     const char *name,                  ///< Name of metadata item.
+    psElemType pType,                  ///< Primitive type.
     psMetadataType type,               ///< Type of metadata item.
     const char *comment,               ///< Comment for metadata item.
@@ -179,5 +181,5 @@
 psBool psMetadataRemove(
     psMetadata* restrict md,           ///< Metadata collection to insert metadat item.
-    psS32 where,                         ///< Location to be removed.
+    psS32 where,                       ///< Location to be removed.
     const char *restrict key           ///< Name of metadata key.
 );
@@ -205,5 +207,5 @@
 psMetadataItem* psMetadataGet(
     psMetadata* restrict md,           ///< Metadata collection to insert metadat item.
-    psS32 where                          ///< Location to be retrieved.
+    psS32 where                        ///< Location to be retrieved.
 );
 
@@ -217,5 +219,5 @@
 psBool psMetadataSetIterator(
     psMetadata* restrict md,           ///< Metadata collection to iterate.
-    psS32 where                          ///< Location of iterator.
+    psS32 where                        ///< Location of iterator.
 );
 
@@ -229,5 +231,5 @@
     psMetadata* restrict md,           ///< Metadata collection to iterate.
     const char *restrict match,        ///< Beginning of key name.
-    psS32 which                          ///< Iterator to be used.
+    psS32 which                        ///< Iterator to be used.
 );
 
@@ -241,5 +243,5 @@
     psMetadata* restrict md,           ///< Metadata collection to iterate.
     const char *restrict match,        ///< Beginning of key name.
-    psS32 which                          ///< Iterator to be used.
+    psS32 which                        ///< Iterator to be used.
 );
 
Index: trunk/psLib/src/collections/psMetadataIO.c
===================================================================
--- trunk/psLib/src/collections/psMetadataIO.c	(revision 2529)
+++ trunk/psLib/src/collections/psMetadataIO.c	(revision 2607)
@@ -9,6 +9,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.12 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2004-11-30 01:09:14 $
+*  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2004-12-03 23:14:40 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -60,23 +60,19 @@
 /** Free and null temporary variables used by config file parser */
 #define CLEAR_TEMPS()                                                                                        \
-if(strName) {                                                                                            \
-    psFree(strName);                                                                                     \
-    strName = NULL;                                                                                      \
-}                                                                                                        \
-if(strType) {                                                                                            \
-    psFree(strType);                                                                                     \
-    strType = NULL;                                                                                      \
-}                                                                                                        \
-if(strValue) {                                                                                           \
-    psFree(strValue);                                                                                    \
-    strValue = NULL;                                                                                     \
-}                                                                                                        \
-if(strComment) {                                                                                         \
-    psFree(strComment);                                                                                  \
-    strComment = NULL;                                                                                   \
-}                                                                                                        \
-if(tempVec) {                                                                                            \
-    psFree(tempVec);                                                                                     \
-    tempVec = NULL;                                                                                      \
+if(strName) {                                                                                                \
+    psFree(strName);                                                                                         \
+    strName = NULL;                                                                                          \
+}                                                                                                            \
+if(strType) {                                                                                                \
+    psFree(strType);                                                                                         \
+    strType = NULL;                                                                                          \
+}                                                                                                            \
+if(strValue) {                                                                                               \
+    psFree(strValue);                                                                                        \
+    strValue = NULL;                                                                                         \
+}                                                                                                            \
+if(strComment) {                                                                                             \
+    psFree(strComment);                                                                                      \
+    strComment = NULL;                                                                                       \
 }
 
@@ -316,4 +312,5 @@
 {
     psMetadataType type;
+    psElemType pType;
 
     PS_PTR_CHECK_NULL(fd,);
@@ -322,20 +319,27 @@
 
     type = metadataItem->type;
+    pType = metadataItem->pType;
 
     switch(type) {
-    case PS_META_BOOL:
-        fprintf(fd, format, metadataItem->data.B);
-        break;
-    case PS_META_S32:
-        fprintf(fd,format, metadataItem->data.S32);
-        break;
-    case PS_META_F32:
-        fprintf(fd, format, metadataItem->data.F32);
-        break;
-    case PS_META_F64:
-        fprintf(fd, format, metadataItem->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(pType) {
+        case PS_TYPE_BOOL:
+            fprintf(fd, format, metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            fprintf(fd,format, metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            fprintf(fd, format, metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            fprintf(fd, format, metadataItem->data.F64);
+            break;
+        default:
+            psError(PS_ERR_BAD_PARAMETER_TYPE,true, PS_ERRORTEXT_psMetadata_METATYPE_INVALID, (int)pType);
+        }
         break;
     case PS_META_STR:
-        fprintf(fd, format, metadataItem->data.V);
+        fprintf(fd,format, metadataItem->data.V);
         break;
     default:
@@ -359,5 +363,4 @@
     psS32 numKeys = 0;
     psS32 keyNum = 0;
-    psMetadataType metadataItemType;
     fitsfile *fd = NULL;
 
@@ -416,33 +419,29 @@
         switch (keyType) {
         case 'I':
-            metadataItemType = PS_META_S32;
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, metadataItemType, keyComment, atoi(keyValue));
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_TYPE_S32, PS_META_PRIMITIVE,
+                                    keyComment, atoi(keyValue));
             break;
         case 'F':
-            metadataItemType = PS_META_F64;
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, metadataItemType, keyComment, atof(keyValue));
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_TYPE_F64, PS_META_PRIMITIVE,
+                                    keyComment, atof(keyValue));
             break;
         case 'C':
-            metadataItemType = PS_META_STR;
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, metadataItemType, keyComment, keyValue);
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_TYPE_PTR, PS_META_STR, keyComment,
+                                    keyValue);
             break;
         case 'L':
-            metadataItemType = PS_META_BOOL;
             tempBool = (keyValue[0] == 'T') ? 1 : 0;
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, metadataItemType, keyComment, tempBool);
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_TYPE_BOOL, PS_META_PRIMITIVE, keyComment,
+                                    tempBool);
             break;
         case 'U':
         case 'X':
         default:
-            psError(PS_ERR_IO, true,
-                    PS_ERRORTEXT_psMetadataIO_FITS_METATYPE_INVALID,
-                    keyType);
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FITS_METATYPE_INVALID, keyType);
             return output;
         }
 
         if (!success) {
-            psError(PS_ERR_UNKNOWN, false,
-                    PS_ERRORTEXT_psMetadataIO_ADD_FAILED,
-                    keyName);
+            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadataIO_ADD_FAILED, keyName);
             return output;
         }
@@ -452,6 +451,5 @@
 }
 
-
-psS32 psMetadataParseConfig(psMetadata** md, const char *fileName, psBool overwrite)
+psMetadata* psMetadataParseConfig(psMetadata* md, psU32 *nFail, const char *fileName, psBool overwrite)
 {
     psBool tempBool;
@@ -463,6 +461,5 @@
     char *linePtr = NULL;
     psS32 status = 0;
-    psS32 lineCount = 0;
-    psS32 failedLines = 0;
+    psU32 lineCount = 0;
     psF64 tempDbl = 0.0;
     psS32 tempInt = 0.0;
@@ -470,20 +467,18 @@
     psVector *tempVec = NULL;
     FILE *fp = NULL;
-    psElemType elemType;
+    psElemType pType;
     psMetadataType mdType;
 
 
     // Check for nulls
-    PS_PTR_CHECK_NULL(fileName,-1);
+    PS_PTR_CHECK_NULL(fileName,NULL);
     if((fp=fopen(fileName, "r")) == NULL) {
-        psError(PS_ERR_IO, true,
-                PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED,
-                fileName);
-        return -1;
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED, fileName);
+        return NULL;
     }
 
     // Allocate metadata if necessary
-    if (*md == NULL) {
-        *md = psMetadataAlloc();
+    if (md == NULL) {
+        md = psMetadataAlloc();
     }
 
@@ -504,20 +499,17 @@
             // Check for more than one '*' or '@' in a line
             if(repeatedChars(linePtr, '@') > 1) {
-                failedLines++;
+                (*nFail)++;
                 psError(PS_ERR_IO, true,
-                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR,
-                        '@', lineCount, fileName);
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '@', lineCount, fileName);
                 continue;
             } else if(repeatedChars(linePtr, '*') > 1) {
-                failedLines++;
+                (*nFail)++;
                 psError(PS_ERR_IO, true,
-                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR,
-                        '*', lineCount, fileName);
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '*', lineCount, fileName);
                 continue;
             } else if(repeatedChars(linePtr, '~') > 0) {
-                failedLines++;
+                (*nFail)++;
                 psError(PS_ERR_IO, true,
-                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR,
-                        '~', lineCount, fileName);
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '~', lineCount, fileName);
                 continue;
             }
@@ -526,9 +518,8 @@
             strName = getToken(&linePtr, " ", &status);
             if(strName==NULL || status) {
-                failedLines++;
+                (*nFail)++;
                 status = 0;
                 psError(PS_ERR_IO, true,
-                        PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL,
-                        "name",lineCount, fileName);
+                        PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "name", lineCount, fileName);
                 continue;
             }
@@ -537,32 +528,31 @@
             strType = getToken(&linePtr, " ", &status);
             if(strType==NULL) {
-                failedLines++;
+                (*nFail)++;
                 status = 0;
-                psError(PS_ERR_IO, true,
-                        PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL,
-                        "type",lineCount, fileName);
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "type",lineCount,
+                        fileName);
                 continue;
             } else if(!strncmp(strType, "*", 1)) {
-                mdType = PS_META_ITEM_SET;
+                mdType = PS_META_LIST;
+                pType = PS_TYPE_PTR;
             } else if(!strncmp(strType, "STR", 3)) {
                 mdType = PS_META_STR;
-                elemType = PS_TYPE_PTR;
+                pType = PS_TYPE_PTR;
             } else if(!strncmp(strType, "BOOL", 3)) {
-                mdType = PS_META_BOOL;
-                elemType = PS_TYPE_U8;
+                mdType = PS_META_PRIMITIVE;
+                pType = PS_TYPE_BOOL;
             } else if(!strncmp(strType, "S32", 3)) {
-                mdType = PS_META_S32;
-                elemType = PS_TYPE_S32;
+                mdType = PS_META_PRIMITIVE;
+                pType = PS_TYPE_S32;
             } else if(!strncmp(strType, "F32", 3)) {
-                mdType = PS_META_F32;
-                elemType = PS_TYPE_F32;
+                mdType = PS_META_PRIMITIVE;
+                pType = PS_TYPE_F32;
             } else if(!strncmp(strType, "F64", 3)) {
-                mdType = PS_META_F64;
-                elemType = PS_TYPE_F64;
+                mdType = PS_META_PRIMITIVE;
+                pType = PS_TYPE_F64;
             } else {
-                failedLines++;
-                psError(PS_ERR_IO, true,
-                        PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID,
-                        strType, lineCount, fileName);
+                (*nFail)++;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineCount,
+                        fileName);
                 continue;
             }
@@ -573,12 +563,11 @@
 
             // Get the metadata item value if there is one. Lines with * don't have values.
-            if(mdType != PS_META_ITEM_SET) {
+            if(mdType != PS_META_LIST) {
                 strValue = getToken(&linePtr, "#", &status);
                 if(strValue==NULL) {
-                    failedLines++;
+                    (*nFail)++;
                     status = 0;
-                    psError(PS_ERR_IO, true,
-                            PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL,
-                            "value",lineCount, fileName);
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "value", lineCount,
+                            fileName);
                     continue;
                 }
@@ -588,9 +577,8 @@
             strComment = getToken(&linePtr,"~", &status);
             if(status) {
-                failedLines++;
+                (*nFail)++;
                 status = 0;
-                psError(PS_ERR_IO, true,
-                        PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL,
-                        "comment",lineCount, fileName);
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "comment", lineCount,
+                        fileName);
                 continue;
             }
@@ -599,14 +587,13 @@
             and allow switch/case below to add new item. If overwrite is false, then report error. If found
             item is folder node, then psMetadataAdd will automatically add a new child. */
-            metadataItem = psMetadataLookup(*md, strName);
+            metadataItem = psMetadataLookup(md, strName);
             if(metadataItem != NULL) {
-                if(metadataItem->type!=PS_META_ITEM_SET) {
+                if(metadataItem->type!=PS_META_LIST) {
                     if(overwrite) {
-                        psMetadataRemove(*md, PS_LIST_UNKNOWN, strName);
+                        psMetadataRemove(md, PS_LIST_UNKNOWN, strName);
                     } else {
-                        failedLines++;
-                        psError(PS_ERR_IO, true,
-                                PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM,
-                                strName, lineCount, fileName);
+                        (*nFail)++;
+                        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineCount,
+                                fileName);
                         continue;
                     }
@@ -616,68 +603,73 @@
             // Create and add metadata item to metadata and parse values
             switch (mdType) {
-            case PS_META_ITEM_SET:
-                psMetadataAdd(*md, PS_LIST_TAIL, strName, mdType, NULL, NULL);
+            case PS_META_LIST:
+                psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, NULL, NULL);
                 break;
-            case PS_META_BOOL:
-                tempBool = parseBool(strValue, &status);
+            case PS_META_STR:
+                psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, strComment, strValue);
+                break;
+            case PS_META_VEC:
+                tempVec = parseVector(strValue, pType, &status);
                 if(!status) {
-                    psMetadataAdd(*md, PS_LIST_TAIL, strName, mdType, strComment, tempBool);
+                    psMetadataAdd(md, PS_LIST_TAIL, strName+1, pType, mdType, strComment, tempVec);
                 } else {
                     status = 0;
-                    failedLines++;
-                    psError(PS_ERR_IO, true,
-                            PS_ERRORTEXT_psMetadataIO_PARSE_FAILED,
-                            strValue, strName, strType, lineCount, fileName);
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
                     continue;
                 }
                 break;
-            case PS_META_S32:
-                tempInt = (psS32)parseValue(strValue, &status);
-                if(!status) {
-                    psMetadataAdd(*md, PS_LIST_TAIL, strName, mdType, strComment, tempInt);
-                } else {
-                    status = 0;
-                    failedLines++;
-                    psError(PS_ERR_IO, true,
-                            PS_ERRORTEXT_psMetadataIO_PARSE_FAILED,
-                            strValue, strName, strType, lineCount, fileName);
+            case PS_META_PRIMITIVE:
+                switch (pType) {
+                case PS_TYPE_BOOL:
+                    tempBool = parseBool(strValue, &status);
+                    if(!status) {
+                        psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, strComment, tempBool);
+                    } else {
+                        status = 0;
+                        (*nFail)++;
+                        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                                strType, lineCount, fileName);
+                        continue;
+                    }
+                    break;
+                case PS_TYPE_S32:
+                    tempInt = (psS32)parseValue(strValue, &status);
+                    if(!status) {
+                        psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, strComment, tempInt);
+                    } else {
+                        status = 0;
+                        (*nFail)++;
+                        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                                strType, lineCount, fileName);
+                        continue;
+                    }
+                    break;
+                case PS_TYPE_F32:
+                case PS_TYPE_F64:
+                    tempDbl = parseValue(strValue, &status);
+                    if(!status) {
+                        psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, strComment, tempDbl);
+                    } else {
+                        status = 0;
+                        (*nFail)++;
+                        psError(PS_ERR_IO, true,
+                                PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType, lineCount,
+                                fileName);
+                        continue;
+                    }
+                    break;
+                default:
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, mdType, lineCount,
+                            fileName);
                     continue;
-                }
-                break;
-            case PS_META_F32:
-            case PS_META_F64:
-                tempDbl = parseValue(strValue, &status);
-                if(!status) {
-                    psMetadataAdd(*md, PS_LIST_TAIL, strName, mdType, strComment, tempDbl);
-                } else {
-                    status = 0;
-                    failedLines++;
-                    psError(PS_ERR_IO, true,
-                            PS_ERRORTEXT_psMetadataIO_PARSE_FAILED,
-                            strValue, strName, strType, lineCount, fileName);
-                    continue;
-                }
-                break;
-            case PS_META_STR:
-                psMetadataAdd(*md, PS_LIST_TAIL, strName, mdType, strComment, strValue);
-                break;
-            case PS_META_VEC:
-                tempVec = parseVector(strValue, elemType, &status);
-                if(!status) {
-                    psMetadataAdd(*md, PS_LIST_TAIL, strName+1, mdType, strComment, tempVec);
-                } else {
-                    status = 0;
-                    failedLines++;
-                    psError(PS_ERR_IO, true,
-                            PS_ERRORTEXT_psMetadataIO_PARSE_FAILED,
-                            strValue, strName, strType, lineCount, fileName);
-                    continue;
-                }
+                } // switch
                 break;
             default:
-                failedLines++;
-                psError(PS_ERR_IO, true,
-                        PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID,
-                        mdType, lineCount, fileName);
+                (*nFail)++;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, mdType, lineCount,
+                        fileName);
                 continue;
             } // switch
@@ -687,5 +679,5 @@
     psFree(line);
 
-    return failedLines;
+    return md;
 }
 
@@ -753,5 +745,5 @@
 
     // Add attributes to metadata
-    psMetadataAdd(md, PS_LIST_TAIL, "htAtts", PS_META_HASH, NULL, htAtts);
+    psMetadataAdd(md, PS_LIST_TAIL, "htAtts", PS_TYPE_PTR, PS_META_HASH, NULL, htAtts);
 
     psFree(psTagName);
@@ -765,8 +757,8 @@
     psBool tempBool = false;
     psS32 status = 0;
-    psU64 lineNumber = 0;
+    psU32 lineNumber = 0;
     psF64 tempDbl = 0.0;
     psS32 tempInt = 0.0;
-    psElemType elemType;
+    psElemType pType;
     psMetadataType mdType;
     char *fileName = NULL;
@@ -790,8 +782,8 @@
     metadataItem = psMetadataLookup(md, "htAtts");
     PS_PTR_CHECK_NULL_GENERAL(metadataItem, return);
-    PS_PTR_CHECK_NULL_GENERAL(metadataItem->items, return);
-    psListSetIterator(metadataItem->items, PS_LIST_TAIL);
-    metadataItem = (psMetadataItem*)psListGetCurrent(metadataItem->items);
-    htAtts = (psHash*)metadataItem->data.V;
+    PS_PTR_CHECK_NULL_GENERAL(metadataItem->data.list, return);
+    psListSetIterator(metadataItem->data.list, PS_LIST_TAIL);
+    metadataItem = (psMetadataItem*)psListGetCurrent(metadataItem->data.list);
+    htAtts = (psHash*)metadataItem->data.list;
     PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
     fileName = (char*)input->filename;
@@ -811,17 +803,17 @@
         if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psString")) {
             mdType = PS_META_STR;
-            elemType = PS_TYPE_PTR;
+            pType = PS_TYPE_PTR;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
-            mdType = PS_META_BOOL;
-            elemType = PS_TYPE_U8;
+            mdType = PS_META_PRIMITIVE;
+            pType = PS_TYPE_U8;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psS32")) {
-            mdType = PS_META_S32;
-            elemType = PS_TYPE_S32;
+            mdType = PS_META_PRIMITIVE;
+            pType = PS_TYPE_S32;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF32")) {
-            mdType = PS_META_F32;
-            elemType = PS_TYPE_F32;
+            mdType = PS_META_PRIMITIVE;
+            pType = PS_TYPE_F32;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF64")) {
-            mdType = PS_META_F64;
-            elemType = PS_TYPE_F64;
+            mdType = PS_META_PRIMITIVE;
+            pType = PS_TYPE_F64;
         } else {
             psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE, strType, lineNumber,
@@ -847,5 +839,5 @@
         metadataItem = psMetadataLookup(md, strName);
         if(metadataItem != NULL) {
-            if(metadataItem->type != PS_META_ITEM_SET) {
+            if(metadataItem->type != PS_META_LIST) {
                 if(overwrite) {
                     psMetadataRemove(md, PS_LIST_UNKNOWN, strName);
@@ -861,40 +853,46 @@
     // Create metadata item and add to metadata
     switch(mdType) {
-    case PS_META_ITEM_SET:
-        psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, NULL);
-        break;
-    case PS_META_BOOL:
-        tempBool = parseBool((char*)strValue, &status);
-        if(!status) {
-            psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, tempBool);
-        } else {
-            status = 0;
-            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
-                    lineNumber, fileName);
-        }
-        break;
-    case PS_META_S32:
-        tempInt = (psS32)parseValue((char*)strValue, &status);
-        if(!status) {
-            psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, tempInt);
-        } else {
-            status = 0;
-            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
-                    lineNumber, fileName);
-        }
-        break;
-    case PS_META_F32:
-    case PS_META_F64:
-        tempDbl = parseValue((char*)strValue, &status);
-        if(!status) {
-            psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, tempDbl);
-        } else {
-            status = 0;
-            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
-                    lineNumber, fileName);
-        }
+    case PS_META_LIST:
+        psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, NULL, NULL);
         break;
     case PS_META_STR:
-        psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, strValue);
+        psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, NULL, strValue);
+        break;
+    case PS_META_PRIMITIVE:
+        switch(pType) {
+        case PS_TYPE_BOOL:
+            tempBool = parseBool((char*)strValue, &status);
+            if(!status) {
+                psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, NULL, tempBool);
+            } else {
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                        lineNumber, fileName);
+            }
+            break;
+        case PS_TYPE_S32:
+            tempInt = (psS32)parseValue((char*)strValue, &status);
+            if(!status) {
+                psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, NULL, tempInt);
+            } else {
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                        lineNumber, fileName);
+            }
+            break;
+        case PS_TYPE_F32:
+        case PS_TYPE_F64:
+            tempDbl = parseValue((char*)strValue, &status);
+            if(!status) {
+                psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, NULL, tempDbl);
+            } else {
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                        lineNumber, fileName);
+            }
+            break;
+        default:
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineNumber, fileName);
+        } // End switch
         break;
     default:
@@ -902,4 +900,5 @@
     } // End switch
 
+
     return;
 }
@@ -910,6 +909,6 @@
     bool overwrite = false;
     psS32 status = 0;
-    psU64 lineNumber = 0;
-    psElemType elemType;
+    psU32 lineNumber = 0;
+    psElemType pType;
     psMetadataType mdType;
     char *strName = NULL;
@@ -936,8 +935,8 @@
     tables = psMetadataLookup(md, "htAtts");
     PS_PTR_CHECK_NULL_GENERAL(tables, return);
-    PS_PTR_CHECK_NULL_GENERAL(tables->items, return);
-    psListSetIterator(tables->items, PS_LIST_TAIL);
-    table = (psMetadataItem*)psListGetCurrent(tables->items);
-    htAtts = (psHash*)table->data.V;
+    PS_PTR_CHECK_NULL_GENERAL(tables->data.list, return);
+    psListSetIterator(tables->data.list, PS_LIST_TAIL);
+    table = (psMetadataItem*)psListGetCurrent(tables->data.list);
+    htAtts = (psHash*)table->data.list;
     PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
     fileName = (char*)input->filename;
@@ -957,17 +956,17 @@
         if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psString")) {
             mdType = PS_META_STR;
-            elemType = PS_TYPE_PTR;
+            pType = PS_TYPE_PTR;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
-            mdType = PS_META_BOOL;
-            elemType = PS_TYPE_U8;
+            mdType = PS_META_PRIMITIVE;
+            pType = PS_TYPE_U8;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psS32")) {
-            mdType = PS_META_S32;
-            elemType = PS_TYPE_S32;
+            mdType = PS_META_PRIMITIVE;
+            pType = PS_TYPE_S32;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF32")) {
-            mdType = PS_META_F32;
-            elemType = PS_TYPE_F32;
+            mdType = PS_META_PRIMITIVE;
+            pType = PS_TYPE_F32;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF64")) {
-            mdType = PS_META_F64;
-            elemType = PS_TYPE_F64;
+            mdType = PS_META_PRIMITIVE;
+            pType = PS_TYPE_F64;
         } else {
             psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE, strName, lineNumber,
@@ -994,5 +993,5 @@
         metadataItem = psMetadataLookup(md, strName);
         if(metadataItem != NULL) {
-            if(metadataItem->type != PS_META_ITEM_SET) {
+            if(metadataItem->type != PS_META_LIST) {
                 if(overwrite) {
                     psMetadataRemove(md, PS_LIST_UNKNOWN, strName);
@@ -1007,7 +1006,7 @@
 
     // Get value
-    vec = parseVector((char*)strValue, elemType, &status);
+    vec = parseVector((char*)strValue, pType, &status);
     if(!status) {
-        psMetadataAdd(md, PS_LIST_TAIL, strName+1, mdType, NULL, vec);
+        psMetadataAdd(md, PS_LIST_TAIL, strName+1, pType, mdType, NULL, vec);
     } else {
         psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
@@ -1038,8 +1037,8 @@
     tables = psMetadataLookup(md, "htAtts");
     PS_PTR_CHECK_NULL_GENERAL(tables, return);
-    PS_PTR_CHECK_NULL_GENERAL(tables->items, return);
-    psListSetIterator(tables->items, PS_LIST_TAIL);
-    table = (psMetadataItem*)psListGetCurrent(tables->items);
-    htAtts = (psHash*)table->data.V;
+    PS_PTR_CHECK_NULL_GENERAL(tables->data.list, return);
+    psListSetIterator(tables->data.list, PS_LIST_TAIL);
+    table = (psMetadataItem*)psListGetCurrent(tables->data.list);
+    htAtts = (psHash*)table->data.list;
     PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
 
@@ -1064,5 +1063,5 @@
 
     // Free temporary metadata item and its hash table
-    psListRemove(tables->items, PS_LIST_TAIL, table);
+    psListRemove(tables->data.list, PS_LIST_TAIL, table);
 
     psFree(psEndTagName);
@@ -1071,5 +1070,5 @@
 }
 
-psS32 psMetadataParseConfigXml(psMetadata** md, const char *fileName)
+psMetadata*  psMetadataParseConfigXml(psMetadata* md, psU32 *nFail, const char *fileName, psBool overwrite)
 {
     xmlSAXHandler saxHandler;
@@ -1077,9 +1076,9 @@
 
     // Error checks
-    PS_PTR_CHECK_NULL(fileName,-1);
+    PS_PTR_CHECK_NULL(fileName, NULL);
 
     // Allocate metadata if necessary
-    if (*md == NULL) {
-        *md = psMetadataAlloc();
+    if (md == NULL) {
+        md = psMetadataAlloc();
     }
 
@@ -1113,5 +1112,5 @@
     saxHandler.externalSubset           = NULL;
     saxHandler.initialized              = 1;
-    saxHandler._private                 = *md;
+    saxHandler._private                 = md;
     saxHandler.startElementNs           = NULL;
     saxHandler.endElementNs             = NULL;
@@ -1121,5 +1120,5 @@
     if (xmlSAXUserParseFile(&saxHandler, NULL, fileName)) {
         psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED, fileName);
-        return -1;
+        return NULL;
     }
 
Index: trunk/psLib/src/collections/psMetadataIO.h
===================================================================
--- trunk/psLib/src/collections/psMetadataIO.h	(revision 2529)
+++ trunk/psLib/src/collections/psMetadataIO.h	(revision 2607)
@@ -9,6 +9,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2004-11-30 01:24:32 $
+*  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2004-12-03 23:14:46 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -58,8 +58,9 @@
  *  Loads pre-defined settings by parsing a configuration file into a psMetadata structure.
  *
- *  @return psS32 : Number of lines that failed to be read.
+ *  @return psMetadata* : Resulting metadata from read.
  */
-psS32 psMetadataParseConfig(
-    psMetadata** md,                   ///< Resulting metadata from read.
+psMetadata* psMetadataParseConfig(
+    psMetadata* md,                    ///< Resulting metadata from read.
+    psU32 *nFail,                      ///< Number of failed lines.
     const char *fileName,              ///< Name of file to read.
     psBool overwrite                   ///< Allow overwrite of duplicate specifications.
@@ -70,9 +71,12 @@
  *  Loads pre-defined XML settings by parsing a configuration file into a psMetadata structure.
  *
- *  @return psS32 : Number of lines that failed to be read.
+ *  @return psMetadata* : Resulting metadata from read.
  */
-psS32 psMetadataParseConfigXml(
-    psMetadata** md,                   ///< Resulting metadata from read.
-    const char *fileName               ///< Name of file to read.
+
+psMetadata*  psMetadataParseConfigXml(
+    psMetadata* md,                    ///< Resulting metadata from read.
+    psU32 *nFail,                      ///< Number of failed lines.
+    const char *fileName,              ///< Name of file to read.
+    psBool overwrite                   ///< Allow overwrite of duplicate specifications.
 );
 
