Index: /trunk/psLib/src/astro/psTime.c
===================================================================
--- /trunk/psLib/src/astro/psTime.c	(revision 2606)
+++ /trunk/psLib/src/astro/psTime.c	(revision 2607)
@@ -10,6 +10,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.45 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-11-29 18:41:07 $
+ *  @version $Revision: 1.46 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-12-03 23:15:00 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -196,4 +196,5 @@
     psS32 j = 0;
     psS32 numTables = 0;
+    psU32 nFail = 0;
     psVector *tablesFrom = NULL;
     psVector *tablesTo = NULL;
@@ -205,5 +206,8 @@
 
     // Read time config file
-    if(psMetadataParseConfig(&timeMetadata, fileName, true) < 0) {
+    timeMetadata = psMetadataParseConfig(timeMetadata, &nFail, fileName, true);
+    if(timeMetadata == NULL) {
+        return false;
+    } else if(nFail != 0) {
         return false;
     }
@@ -298,5 +302,5 @@
             if(metadataNamesPtr != NULL) {
                 psMetadataAdd(timeMetadata, PS_LIST_TAIL, strcat(metadataTableNames[j], "Table"),
-                              PS_META_LOOKUPTABLE, NULL, table);
+                              PS_TYPE_PTR, PS_META_LOOKUPTABLE, NULL, table);
                 foundTable = true;
             } else if(foundTable==false && j==numTables-1) {
Index: /trunk/psLib/src/astronomy/psAstronomyErrors.dat
===================================================================
--- /trunk/psLib/src/astronomy/psAstronomyErrors.dat	(revision 2606)
+++ /trunk/psLib/src/astronomy/psAstronomyErrors.dat	(revision 2607)
@@ -33,5 +33,5 @@
 psCoord_OFFSET_MODE_UNKNOWN            Specified offset mode, 0x%x, is not supported.
 #
-psAstrometry_NONLINEAR_TRANSFORM       The %s transfrom is not linear.  Only linear transforms are supported. 
+psAstrometry_NONLINEAR_TRANSFORM       The %s transfrom is not linear.  Only linear transforms are supported.
 #
 psMetadata_METATYPE_INVALID            Specified psMetadataType, %d, is not supported.
@@ -50,10 +50,13 @@
 psMetadataIO_FITS_METATYPE_INVALID     Specified FITS metadata type, %c, is not supported.
 psMetadataIO_ADD_FAILED                Failed to add metadata item, %s.
-psMetadataIO_FILE_OPEN_FAILED          Failed to open file '%s'.  Check if it exists and it has the proper permissions.
-psMetadataIO_FILE_MULTIPLE_CHAR        More than one '%c' character not allowed.  Found on line %d of %s.
-psMetadataIO_FILE_ELEMENT_NULL         Failed to read a metadata %s on line %d of %s.
-psMetadataIO_FILE_TYPE_INVALID         Metadata type '%s', found on line %d of %s, is not invalid.
-psMetadataIO_OVERWRITE_ITEM            Duplicate Metadata item, %s, found on line %d of %s.  Overwrite not allowed.
-psMetadataIO_PARSE_FAILED              Failed to parse the value '%s' of metadata item %s, type %s, on line %d of %s.
+psMetadataIO_FILE_OPEN_FAILED          Failed to open file '%s'. Check if it exists and it has the proper permissions.
+psMetadataIO_FILE_MULTIPLE_CHAR        More than one '%c' character not allowed.  Found on line %u of %s.
+psMetadataIO_FILE_ELEMENT_NULL         Failed to read a metadata %s on line %u of %s.
+psMetadataIO_FILE_TYPE_INVALID         Metadata type '%s', found on line %u of %s, is not invalid.
+psMetadataIO_OVERWRITE_ITEM            Duplicate Metadata item, %s, found on line %u of %s.  Overwrite not allowed.
+psMetadataIO_PARSE_FAILED              Failed to parse the value '%s' of metadata item %s, type %s, on line %u of %s.
+psMetadataIO_NO_NAME                   Failed to find key 'name' in table on line %u of %s.
+psMetadataIO_TYPE_INVALID_LINE_FILE    Specified type, %s, is not supported on line %u of %s.
+psMetadataIO_TAG_MISMATCH              Start tag, %s and end tag, %s do not agree.
+psMetadataIO_TAG_UNKNOWN               Invalid end tag name, %s.
 
-
Index: /trunk/psLib/src/astronomy/psAstronomyErrors.h
===================================================================
--- /trunk/psLib/src/astronomy/psAstronomyErrors.h	(revision 2606)
+++ /trunk/psLib/src/astronomy/psAstronomyErrors.h	(revision 2607)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-11-30 00:25:50 $
+ *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-12-03 23:14:13 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -23,5 +23,5 @@
  *     $2  The error text (rest of the line in psAstronomyErrors.dat)
  *     $n  The order of the source line in psAstronomyErrors.dat (comments excluded)
- * 
+ *
  * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
  */
@@ -66,17 +66,17 @@
 #define PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED "Could not find metadata item at index %d."
 #define PS_ERRORTEXT_psMetadataIO_TYPE_INVALID "Specified type, %d, is not supported."
-#define PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE "Specified type, %s, is not supported on line %lld of %s"
 #define PS_ERRORTEXT_psMetadataIO_EXTNUM_NOTPOSITIVE "Specified extension number, %d, is invalid.  Value must be positive if no extension name is given."
 #define PS_ERRORTEXT_psMetadataIO_FITS_METATYPE_INVALID "Specified FITS metadata type, %c, is not supported."
 #define PS_ERRORTEXT_psMetadataIO_ADD_FAILED "Failed to add metadata item, %s."
 #define PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED "Failed to open file '%s'. Check if it exists and it has the proper permissions."
-#define PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR "More than one '%c' character not allowed.  Found on line %d of %s."
-#define PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL "Failed to read a metadata %s on line %lld of %s."
-#define PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID "Metadata type '%s', found on line %lld of %s, is not invalid."
-#define PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM "Duplicate Metadata item, %s, found on line %lld of %s.  Overwrite not allowed."
-#define PS_ERRORTEXT_psMetadataIO_PARSE_FAILED "Failed to parse the value '%s' of metadata item %s, type %s, on line %lld of %s."
-#define PS_ERRORTEXT_psMetadataIO_NO_NAME "Couldn't find XML name attribute on line %lld of %s."
-#define PS_ERRORTEXT_psMetadataIO_TAG_MISMATCH "Start and end tag names don't agree, start tag, %s end tag, %s"
-#define PS_ERRORTEXT_psMetadataIO_TAG_UNKNOWN "Unknown tag name, %s"
+#define PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR "More than one '%c' character not allowed.  Found on line %u of %s."
+#define PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL "Failed to read a metadata %s on line %u of %s."
+#define PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID "Metadata type '%s', found on line %u of %s, is not invalid."
+#define PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM "Duplicate Metadata item, %s, found on line %u of %s.  Overwrite not allowed."
+#define PS_ERRORTEXT_psMetadataIO_PARSE_FAILED "Failed to parse the value '%s' of metadata item %s, type %s, on line %u of %s."
+#define PS_ERRORTEXT_psMetadataIO_NO_NAME "Failed to find key 'name' in table on line %u of %s."
+#define PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE "Specified type, %s, is not supported on line %u of %s."
+#define PS_ERRORTEXT_psMetadataIO_TAG_MISMATCH "Start tag, %s and end tag, %s do not agree."
+#define PS_ERRORTEXT_psMetadataIO_TAG_UNKNOWN "Invalid end tag name, %s."
 //~End
 
Index: /trunk/psLib/src/astronomy/psMetadata.c
===================================================================
--- /trunk/psLib/src/astronomy/psMetadata.c	(revision 2606)
+++ /trunk/psLib/src/astronomy/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/astronomy/psMetadata.h
===================================================================
--- /trunk/psLib/src/astronomy/psMetadata.h	(revision 2606)
+++ /trunk/psLib/src/astronomy/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/astronomy/psMetadataIO.c
===================================================================
--- /trunk/psLib/src/astronomy/psMetadataIO.c	(revision 2606)
+++ /trunk/psLib/src/astronomy/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/astronomy/psMetadataIO.h
===================================================================
--- /trunk/psLib/src/astronomy/psMetadataIO.h	(revision 2606)
+++ /trunk/psLib/src/astronomy/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.
 );
 
Index: /trunk/psLib/src/astronomy/psTime.c
===================================================================
--- /trunk/psLib/src/astronomy/psTime.c	(revision 2606)
+++ /trunk/psLib/src/astronomy/psTime.c	(revision 2607)
@@ -10,6 +10,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.45 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-11-29 18:41:07 $
+ *  @version $Revision: 1.46 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-12-03 23:15:00 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -196,4 +196,5 @@
     psS32 j = 0;
     psS32 numTables = 0;
+    psU32 nFail = 0;
     psVector *tablesFrom = NULL;
     psVector *tablesTo = NULL;
@@ -205,5 +206,8 @@
 
     // Read time config file
-    if(psMetadataParseConfig(&timeMetadata, fileName, true) < 0) {
+    timeMetadata = psMetadataParseConfig(timeMetadata, &nFail, fileName, true);
+    if(timeMetadata == NULL) {
+        return false;
+    } else if(nFail != 0) {
         return false;
     }
@@ -298,5 +302,5 @@
             if(metadataNamesPtr != NULL) {
                 psMetadataAdd(timeMetadata, PS_LIST_TAIL, strcat(metadataTableNames[j], "Table"),
-                              PS_META_LOOKUPTABLE, NULL, table);
+                              PS_TYPE_PTR, PS_META_LOOKUPTABLE, NULL, table);
                 foundTable = true;
             } else if(foundTable==false && j==numTables-1) {
Index: /trunk/psLib/src/collections/psMetadata.c
===================================================================
--- /trunk/psLib/src/collections/psMetadata.c	(revision 2606)
+++ /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 2606)
+++ /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 2606)
+++ /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 2606)
+++ /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.
 );
 
Index: /trunk/psLib/src/dataManip/psFunctions.c
===================================================================
--- /trunk/psLib/src/dataManip/psFunctions.c	(revision 2606)
+++ /trunk/psLib/src/dataManip/psFunctions.c	(revision 2607)
@@ -7,6 +7,6 @@
  *  polynomials.  It also contains a Gaussian functions.
  *
- *  @version $Revision: 1.70 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-11-24 22:33:21 $
+ *  @version $Revision: 1.71 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-12-03 23:15:32 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -2017,4 +2017,9 @@
                 PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
                 strType);
+    case PS_TYPE_BOOL:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
     }
     return(-3);
Index: /trunk/psLib/src/math/psPolynomial.c
===================================================================
--- /trunk/psLib/src/math/psPolynomial.c	(revision 2606)
+++ /trunk/psLib/src/math/psPolynomial.c	(revision 2607)
@@ -7,6 +7,6 @@
  *  polynomials.  It also contains a Gaussian functions.
  *
- *  @version $Revision: 1.70 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-11-24 22:33:21 $
+ *  @version $Revision: 1.71 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-12-03 23:15:32 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -2017,4 +2017,9 @@
                 PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
                 strType);
+    case PS_TYPE_BOOL:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
     }
     return(-3);
Index: /trunk/psLib/src/math/psSpline.c
===================================================================
--- /trunk/psLib/src/math/psSpline.c	(revision 2606)
+++ /trunk/psLib/src/math/psSpline.c	(revision 2607)
@@ -7,6 +7,6 @@
  *  polynomials.  It also contains a Gaussian functions.
  *
- *  @version $Revision: 1.70 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-11-24 22:33:21 $
+ *  @version $Revision: 1.71 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-12-03 23:15:32 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -2017,4 +2017,9 @@
                 PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
                 strType);
+    case PS_TYPE_BOOL:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
     }
     return(-3);
Index: /trunk/psLib/src/sys/psType.h
===================================================================
--- /trunk/psLib/src/sys/psType.h	(revision 2606)
+++ /trunk/psLib/src/sys/psType.h	(revision 2607)
@@ -11,6 +11,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.23 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2004-10-27 00:57:31 $
+*  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2004-12-03 23:16:05 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -57,17 +57,18 @@
 
 typedef enum {
-    PS_TYPE_S8 = 0x0101,               ///< Character.
-    PS_TYPE_S16 = 0x0102,              ///< Short integer.
-    PS_TYPE_S32 = 0x0104,              ///< Integer.
-    PS_TYPE_S64 = 0x0108,              ///< Long integer.
-    PS_TYPE_U8 = 0x0301,               ///< Unsigned character.
-    PS_TYPE_U16 = 0x0302,              ///< Unsigned psS16 integer.
-    PS_TYPE_U32 = 0x0304,              ///< Unsigned integer.
-    PS_TYPE_U64 = 0x0308,              ///< Unsigned psS64 integer.
-    PS_TYPE_F32 = 0x0404,              ///< Single-precision Floating point.
-    PS_TYPE_F64 = 0x0408,              ///< Double-precision floating point.
-    PS_TYPE_C32 = 0x0808,              ///< Complex numbers consisting of single-precision floating point.
-    PS_TYPE_C64 = 0x0810,              ///< Complex numbers consisting of double-precision floating point.
-    PS_TYPE_PTR = 0x0000               ///< Something else that's not supported for arithmetic.
+    PS_TYPE_BOOL = 0x0100,             ///< Boolean.
+    PS_TYPE_S8   = 0x0101,             ///< Character.
+    PS_TYPE_S16  = 0x0102,             ///< Short integer.
+    PS_TYPE_S32  = 0x0104,             ///< Integer.
+    PS_TYPE_S64  = 0x0108,             ///< Long integer.
+    PS_TYPE_U8   = 0x0301,             ///< Unsigned character.
+    PS_TYPE_U16  = 0x0302,             ///< Unsigned psS16 integer.
+    PS_TYPE_U32  = 0x0304,             ///< Unsigned integer.
+    PS_TYPE_U64  = 0x0308,             ///< Unsigned psS64 integer.
+    PS_TYPE_F32  = 0x0404,             ///< Single-precision Floating point.
+    PS_TYPE_F64  = 0x0408,             ///< Double-precision floating point.
+    PS_TYPE_C32  = 0x0808,             ///< Complex numbers consisting of single-precision floating point.
+    PS_TYPE_C64  = 0x0810,             ///< Complex numbers consisting of double-precision floating point.
+    PS_TYPE_PTR  = 0x0000              ///< Something else that's not supported for arithmetic.
 } psElemType;
 
Index: /trunk/psLib/src/sysUtils/psType.h
===================================================================
--- /trunk/psLib/src/sysUtils/psType.h	(revision 2606)
+++ /trunk/psLib/src/sysUtils/psType.h	(revision 2607)
@@ -11,6 +11,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.23 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2004-10-27 00:57:31 $
+*  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2004-12-03 23:16:05 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -57,17 +57,18 @@
 
 typedef enum {
-    PS_TYPE_S8 = 0x0101,               ///< Character.
-    PS_TYPE_S16 = 0x0102,              ///< Short integer.
-    PS_TYPE_S32 = 0x0104,              ///< Integer.
-    PS_TYPE_S64 = 0x0108,              ///< Long integer.
-    PS_TYPE_U8 = 0x0301,               ///< Unsigned character.
-    PS_TYPE_U16 = 0x0302,              ///< Unsigned psS16 integer.
-    PS_TYPE_U32 = 0x0304,              ///< Unsigned integer.
-    PS_TYPE_U64 = 0x0308,              ///< Unsigned psS64 integer.
-    PS_TYPE_F32 = 0x0404,              ///< Single-precision Floating point.
-    PS_TYPE_F64 = 0x0408,              ///< Double-precision floating point.
-    PS_TYPE_C32 = 0x0808,              ///< Complex numbers consisting of single-precision floating point.
-    PS_TYPE_C64 = 0x0810,              ///< Complex numbers consisting of double-precision floating point.
-    PS_TYPE_PTR = 0x0000               ///< Something else that's not supported for arithmetic.
+    PS_TYPE_BOOL = 0x0100,             ///< Boolean.
+    PS_TYPE_S8   = 0x0101,             ///< Character.
+    PS_TYPE_S16  = 0x0102,             ///< Short integer.
+    PS_TYPE_S32  = 0x0104,             ///< Integer.
+    PS_TYPE_S64  = 0x0108,             ///< Long integer.
+    PS_TYPE_U8   = 0x0301,             ///< Unsigned character.
+    PS_TYPE_U16  = 0x0302,             ///< Unsigned psS16 integer.
+    PS_TYPE_U32  = 0x0304,             ///< Unsigned integer.
+    PS_TYPE_U64  = 0x0308,             ///< Unsigned psS64 integer.
+    PS_TYPE_F32  = 0x0404,             ///< Single-precision Floating point.
+    PS_TYPE_F64  = 0x0408,             ///< Double-precision floating point.
+    PS_TYPE_C32  = 0x0808,             ///< Complex numbers consisting of single-precision floating point.
+    PS_TYPE_C64  = 0x0810,             ///< Complex numbers consisting of double-precision floating point.
+    PS_TYPE_PTR  = 0x0000              ///< Something else that's not supported for arithmetic.
 } psElemType;
 
Index: /trunk/psLib/src/types/psMetadata.c
===================================================================
--- /trunk/psLib/src/types/psMetadata.c	(revision 2606)
+++ /trunk/psLib/src/types/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/types/psMetadata.h
===================================================================
--- /trunk/psLib/src/types/psMetadata.h	(revision 2606)
+++ /trunk/psLib/src/types/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/types/psMetadataConfig.c
===================================================================
--- /trunk/psLib/src/types/psMetadataConfig.c	(revision 2606)
+++ /trunk/psLib/src/types/psMetadataConfig.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/types/psMetadataConfig.h
===================================================================
--- /trunk/psLib/src/types/psMetadataConfig.h	(revision 2606)
+++ /trunk/psLib/src/types/psMetadataConfig.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.
 );
 
Index: /trunk/psLib/src/xml/psXML.c
===================================================================
--- /trunk/psLib/src/xml/psXML.c	(revision 2606)
+++ /trunk/psLib/src/xml/psXML.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/xml/psXML.h
===================================================================
--- /trunk/psLib/src/xml/psXML.h	(revision 2606)
+++ /trunk/psLib/src/xml/psXML.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.
 );
 
Index: /trunk/psLib/test/astronomy/tst_psMetadataIO.c
===================================================================
--- /trunk/psLib/test/astronomy/tst_psMetadataIO.c	(revision 2606)
+++ /trunk/psLib/test/astronomy/tst_psMetadataIO.c	(revision 2607)
@@ -13,6 +13,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.4 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:53:39 $
+*  @version $Revision: 1.5 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -25,6 +25,17 @@
 
 static void printMetadataItem(psMetadataItem *metadataItem, char *spaces);
+static void printMetadata(psMetadata *metadata);
+static void printMetadataList(psList *metadataItemList, char* spaces);
+static void printMetadataTable(psHash *mdTable);
 
-static void printMetadataItemList(psList *metadataItemList)
+static void printMetadata(psMetadata *metadata)
+{
+    printf("Contents of metadata list:\n");
+    printMetadataList(metadata->list, " ");
+    printf("\nContents of metadata table:\n");
+    printMetadataTable(metadata->table);
+}
+
+static void printMetadataList(psList *metadataItemList, char* spaces)
 {
     psMetadataItem *entryChild = NULL;
@@ -33,69 +44,6 @@
     entryChild = psListGetCurrent(metadataItemList);
     while (entryChild != NULL) {
-        printMetadataItem(entryChild, "    ");
+        printMetadataItem(entryChild, spaces);
         entryChild = psListGetNext(metadataItemList);
-    }
-}
-
-static void printMetadataList(psList *metadataItemList)
-{
-    psMetadataItem *entryChild = NULL;
-
-    psListSetIterator(metadataItemList, PS_LIST_HEAD);
-    entryChild = psListGetCurrent(metadataItemList);
-    while (entryChild != NULL) {
-        printMetadataItem(entryChild, " ");
-        entryChild = psListGetNext(metadataItemList);
-    }
-}
-static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
-{
-
-    psVector *vec = NULL;
-
-
-    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
-    printf("Key Type: %2d  ", metadataItem->type);
-
-    switch (metadataItem->type ) {
-    case PS_META_ITEM_SET:
-        printf("Key Value: %17c", ' ');
-        break;
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", metadataItem->data.B);
-        break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", metadataItem->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", metadataItem->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", metadataItem->data.F64);
-        break;
-    case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
-        break;
-    case PS_META_VEC:
-        vec = (psVector*)metadataItem->data.V;
-        printf("Key Value: ");
-        for(psS32 i=0; i<vec->nalloc;i++) {
-            printf("%d ", vec->data.S32[i]);
-        }
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
-        break;
-    default:
-        printf("Bad type: %d ", metadataItem->type);
-    }
-    printf("Key Comment: %s\n", metadataItem->comment);
-
-    if(metadataItem->items->size) {
-        printMetadataItemList(metadataItem->items);
     }
 }
@@ -114,10 +62,43 @@
 }
 
-static void printMetadata(psMetadata *metadata)
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
 {
-    printf("\nContents of metadata list:\n");
-    printMetadataList(metadata->list);
-    printf("\nContents of metadata table:\n");
-    printMetadataTable(metadata->table);
+    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
+    printf("Key pType: %d  ", metadataItem->pType);
+    printf("Key mdType: %d  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+
+    if(metadataItem->data.V && metadataItem->type==PS_META_LIST) {
+        printMetadataList(metadataItem->data.V, "    ");
+    }
 }
 
@@ -128,6 +109,6 @@
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Read config file with overwrite set true");
     psMetadata *metadata1 = NULL;
-    psS32 failedLines1 = 0;
-    failedLines1 = psMetadataParseConfig(&metadata1, "test.config", true);
+    psU32 failedLines1 = 0;
+    metadata1 = psMetadataParseConfig(metadata1, &failedLines1, "test.config", true);
     printf("Failed lines: %d Expected: 6\n", failedLines1);
     printMetadata(metadata1);
@@ -139,6 +120,6 @@
     psMetadata *metadata2 = NULL;
     psS32 failedLines2 = 0;
-    failedLines2 = psMetadataParseConfig(&metadata2, "test.config", false);
-    printf("Failed lines: %d Expected: 7", failedLines2);
+    metadata2 = psMetadataParseConfig(metadata2, &failedLines2, "test.config", false);
+    printf("Failed lines: %d Expected: 7 ", failedLines2);
     printMetadata(metadata2);
     printFooter(stdout, "psMetadata", "Test B - Read config file with overwrite set false", true);
@@ -149,6 +130,6 @@
     psMetadata *metadata3 = psMetadataAlloc();
     psS32 failedLines3 = 0;
-    failedLines3 = psMetadataParseConfig(&metadata3, "test.config", false);
-    printf("Failed lines: %d Expected: 7", failedLines3);
+    metadata3 = psMetadataParseConfig(metadata3, &failedLines3, "test.config", true);
+    printf("Failed lines: %d Expected: 6 ", failedLines3);
     printMetadata(metadata3);
     printFooter(stdout, "psMetadata", "Test C - Read config file without auto-allocation of metadata", true);
@@ -158,5 +139,5 @@
     printNegativeTestHeader(stdout,"psMetadataIO", "Test D - Attempt to use null fileName argument",
                             "Null failedLines not allowed", 0);
-    psMetadataParseConfig(&metadata1, NULL, true);
+    psMetadataParseConfig(metadata1, &failedLines1, NULL, true);
     printFooter(stdout, "psMetadata", "Test D - Attempt to use null fileName argument", true);
 
@@ -165,5 +146,5 @@
     printNegativeTestHeader(stdout,"psMetadataIO", "Test E - Attempt to open nonexistant file",
                             "Error opening file", 0);
-    psMetadataParseConfig(&metadata1, "abcedfg", true);
+    psMetadataParseConfig(metadata1, &failedLines1, "abcedfg", true);
     printFooter(stdout, "psMetadata", "Test E - Attempt to open nonexistant file", true);
 
Index: /trunk/psLib/test/astronomy/tst_psMetadata_01.c
===================================================================
--- /trunk/psLib/test/astronomy/tst_psMetadata_01.c	(revision 2606)
+++ /trunk/psLib/test/astronomy/tst_psMetadata_01.c	(revision 2607)
@@ -13,10 +13,11 @@
 *     Test H - Attempt to use bad extNum
 *     Test I - Attempt to use bad extNameTest
-*     Test J - Free psMetadataData
+*     Test J - Read named hdr w/ invalid extnum
+*     Test K - Free psMetadata
 *
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.15 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:54:50 $
+*  @version $Revision: 1.16 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -29,6 +30,17 @@
 
 static void printMetadataItem(psMetadataItem *metadataItem, char *spaces);
-
-static void printMetadataItemList(psList *metadataItemList)
+static void printMetadata(psMetadata *metadata);
+static void printMetadataList(psList *metadataItemList, char* spaces);
+static void printMetadataTable(psHash *mdTable);
+
+static void printMetadata(psMetadata *metadata)
+{
+    printf("Contents of metadata list:\n");
+    printMetadataList(metadata->list, " ");
+    printf("\nContents of metadata table:\n");
+    printMetadataTable(metadata->table);
+}
+
+static void printMetadataList(psList *metadataItemList, char* spaces)
 {
     psMetadataItem *entryChild = NULL;
@@ -37,58 +49,6 @@
     entryChild = psListGetCurrent(metadataItemList);
     while (entryChild != NULL) {
-        printMetadataItem(entryChild, "    ");
+        printMetadataItem(entryChild, spaces);
         entryChild = psListGetNext(metadataItemList);
-    }
-}
-
-static void printMetadataList(psList *metadataItemList)
-{
-    psMetadataItem *entryChild = NULL;
-
-    psListSetIterator(metadataItemList, PS_LIST_HEAD);
-    entryChild = psListGetCurrent(metadataItemList);
-    while (entryChild != NULL) {
-        printMetadataItem(entryChild, " ");
-        entryChild = psListGetNext(metadataItemList);
-    }
-}
-static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
-{
-    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
-    printf("Key Type: %2d  ", metadataItem->type);
-
-    switch (metadataItem->type ) {
-    case PS_META_ITEM_SET:
-        printf("Key Value: %17c", ' ');
-        break;
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", metadataItem->data.B);
-        break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", metadataItem->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", metadataItem->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", metadataItem->data.F64);
-        break;
-    case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
-        break;
-    default:
-        printf("Bad type: %d ", metadataItem->type);
-    }
-    printf("Key Comment: %s\n", metadataItem->comment);
-
-    if(metadataItem->items->size) {
-        printMetadataItemList(metadataItem->items);
     }
 }
@@ -107,10 +67,43 @@
 }
 
-static void printMetadata(psMetadata *metadata)
-{
-    printf("Contents of metadata list:\n");
-    printMetadataList(metadata->list);
-    printf("\nContents of metadata table:\n");
-    printMetadataTable(metadata->table);
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
+{
+    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
+    printf("Key pType: %d  ", metadataItem->pType);
+    printf("Key mdType: %d  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+
+    if(metadataItem->data.V && metadataItem->type==PS_META_LIST) {
+        printMetadataList(metadataItem->data.V, "    ");
+    }
 }
 
@@ -244,17 +237,17 @@
 
 
-    // Test I1 - Attempt to use a valid named extension with invalid extnum
-    printNegativeTestHeader(stdout, "psMetadata", "Test I1 - Read named hdr w/ invalid extnum",
+    // Test J - Read named hdr w/ invalid extnum
+    printNegativeTestHeader(stdout, "psMetadata", "Test J - Read named hdr w/ invalid extnum",
                             "If extName specified, extNum should be -1.", 0);
-    metadata1 = psMetadataReadHeader(NULL, "MY_DATA_2", 0, "header_2.fits");
+    metadata1 = psMetadataReadHeader(NULL, NULL, 0, "header_2.fits");
     if (metadata1 != NULL ) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataReadHeader did not return null w/ valid extname, invalid extnum");
         return 12;
     }
-    printFooter(stdout, "psMetadata", "Test C - Read named hdr from complex FITS file", true);
-
-
-    // Test J - Free psMetadata
-    printPositiveTestHeader(stdout, "psMetadata", "Test J - Free psMetadata");
+    printFooter(stdout, "psMetadata", "Test J - Read named hdr w/ invalid extnum", true);
+
+
+    // Test K - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test K - Free psMetadata");
     psFree(metadata1);
     psFree(metadata2);
@@ -262,5 +255,4 @@
     if(psMemCheckLeaks(0, NULL, stdout,false)) {
         psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");
-        return 10;
     }
     psMemCheckCorruption(0);
@@ -269,5 +261,5 @@
         printf("ERROR: Found %d bad memory blocks\n", nBad);
     }
-    printFooter(stdout, "psMetadata", "Test J - Free psMetadata", true);
+    printFooter(stdout, "psMetadata", "Test K - Free psMetadata", true);
 
     return 0;
Index: /trunk/psLib/test/astronomy/tst_psMetadata_02.c
===================================================================
--- /trunk/psLib/test/astronomy/tst_psMetadata_02.c	(revision 2606)
+++ /trunk/psLib/test/astronomy/tst_psMetadata_02.c	(revision 2607)
@@ -14,6 +14,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.8 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:54:50 $
+*  @version $Revision: 1.9 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -25,36 +25,39 @@
 #include <string.h>
 
-static void printMetadataItem(psMetadataItem *item)
+static void printMetadataItem(psMetadataItem *metadataItem)
 {
-    printf("Key Name: %8s  ", item->name);
-    printf("Key Type: %2d  ", item->type);
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key pType: %2d  ", metadataItem->pType);
+    printf("Key mdType: %2d  ", metadataItem->type);
 
-    switch (item->type ) {
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", item->data.B);
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
         break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", item->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", item->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", item->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
         break;
     case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)item->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
         break;
     default:
-        printf("Bad type: %d ", item->type);
+        printf("Bad type: %d ", metadataItem->type);
     }
-    printf("Key Comment: %s\n", item->comment);
+    printf("Key Comment: %s\n", metadataItem->comment);
 }
 
@@ -73,9 +76,9 @@
     // Test A - Allocate metadata items
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
-    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
-    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a signed integer", 111);
-    item3 = psMetadataItemAlloc("myItem3", PS_META_F32, "I am a single precision floating point", 222.222);
-    item4 = psMetadataItemAlloc("myItem4", PS_META_F64, "I am a double precision floating point", 333.333);
-    item5 = psMetadataItemAlloc("myItem5", PS_META_STR, "I am a string", "HELLO WORLD");
+    item1 = psMetadataItemAlloc("myItem1", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a signed integer", 111);
+    item3 = psMetadataItemAlloc("myItem3", PS_TYPE_F32, PS_META_PRIMITIVE, "I am a single precision floating point", 222.222);
+    item4 = psMetadataItemAlloc("myItem4", PS_TYPE_F64, PS_META_PRIMITIVE, "I am a double precision floating point", 333.333);
+    item5 = psMetadataItemAlloc("myItem5", PS_TYPE_PTR, PS_META_STR, "I am a string", "HELLO WORLD");
     printMetadataItem(item1);
     printMetadataItem(item2);
@@ -90,5 +93,5 @@
                             "Null value for name not allowed", 0);
     psLogMsg(__func__,PS_LOG_INFO,"Following should produce error for null name.");
-    badItem = psMetadataItemAlloc(NULL, PS_META_STR, "I am a string", "HELLO WORLD");
+    badItem = psMetadataItemAlloc(NULL, PS_TYPE_PTR, PS_META_STR, "I am a string", "HELLO WORLD");
     if (badItem != NULL) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataItemAlloc did not return null with null name item.");
@@ -101,5 +104,5 @@
     printNegativeTestHeader(stdout,"psMetadata", "Test C - Attempt to create metadata item with invalid type",
                             "Invalid psMetadataType: 6", 0);
-    badItem = psMetadataItemAlloc("badItem", PS_META_IMG, "I am bad", "Bad comment");
+    badItem = psMetadataItemAlloc("badItem", PS_TYPE_PTR, PS_META_NTYPE, "I am bad", "Bad comment");
     printFooter(stdout, "psMetadata", "Test C - Attempt to create metadata item with invalid type", true);
 
Index: /trunk/psLib/test/astronomy/tst_psMetadata_03.c
===================================================================
--- /trunk/psLib/test/astronomy/tst_psMetadata_03.c	(revision 2606)
+++ /trunk/psLib/test/astronomy/tst_psMetadata_03.c	(revision 2607)
@@ -10,10 +10,14 @@
 *     Test E - Attempt to remove non-existant metadata item by name
 *     Test F - Attempt to remove non-existant metadata item by index
-*     Test G - Free psMetadata
- *
+*     Test G - Attempt to add item to an invalid metadata structure
+*     Test H - Attempt to add item to an invalid metadata structure
+*     Test I - Attempt to add item with a null name
+*     Test J - Attempt to add item to an invalid metadata structure
+*     Test K - Free psMetadata
+*
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.10 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:54:50 $
+*  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -25,36 +29,39 @@
 #include <string.h>
 
-static void printMetadataItem(psMetadataItem *item)
+static void printMetadataItem(psMetadataItem *metadataItem)
 {
-    printf("Key Name: %8s  ", item->name);
-    printf("Key Type: %2d  ", item->type);
-
-    switch (item->type ) {
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", item->data.B);
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key pType: %2d  ", metadataItem->pType);
+    printf("Key mdType: %2d  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
         break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", item->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", item->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", item->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
         break;
     case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)item->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
         break;
     default:
-        printf("Bad type: %d ", item->type);
-    }
-    printf("Key Comment: %s\n", item->comment);
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
 }
 
@@ -76,9 +83,9 @@
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
     metadata = psMetadataAlloc();
-    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
-    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a integer", 55);
-    item3 = psMetadataItemAlloc("myItem3", PS_META_BOOL, "I am a boolean", false);
-    item4 = psMetadataItemAlloc("myItem4", PS_META_S32, "I am a integer", 66);
-    errItem = psMetadataItemAlloc("errItem", PS_META_S32, "I am a integer", 99);
+    item1 = psMetadataItemAlloc("myItem1", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 55);
+    item3 = psMetadataItemAlloc("myItem3", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", false);
+    item4 = psMetadataItemAlloc("myItem4", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 66);
+    errItem = psMetadataItemAlloc("errItem", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 99);
     printMetadataItem(item1);
     printMetadataItem(item2);
@@ -90,17 +97,17 @@
     // Test B - Remove items from metadata by name
     printPositiveTestHeader(stdout, "psMetadata", "Test B - Remove items from metadata by name");
-    if( ! psMetadataAddItem(metadata, item1, PS_LIST_HEAD) ) {
+    if(!psMetadataAddItem(metadata, item1, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by name.");
         return 10;
     }
-    if( ! psMetadataAdd(metadata,PS_LIST_HEAD,"myItem2",PS_META_S32,"I am S32 integer",77) ) {
+    if(!psMetadataAdd(metadata,PS_LIST_HEAD,"myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am S32 integer",77)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by name.");
         return 11;
     }
-    if ( ! psMetadataRemove(metadata, 0, "myItem1" ) ) {
+    if (!psMetadataRemove(metadata, 0, "myItem1")) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return true when removing by name.");
         return 12;
     }
-    if ( ! psMetadataRemove(metadata, 0, "myItem2" ) ) {
+    if (!psMetadataRemove(metadata, 0, "myItem2")) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return true when removing by name.");
         return 13;
@@ -115,5 +122,5 @@
         return 14;
     }
-    if ( ! psMetadataAdd(metadata,PS_LIST_HEAD,"myItem4",PS_META_S32,"I am S32 integer",88) ) {
+    if ( ! psMetadataAdd(metadata,PS_LIST_HEAD,"myItem4", PS_TYPE_S32, PS_META_PRIMITIVE, "I am S32 integer",88) ) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by index.");
         return 15;
@@ -160,6 +167,6 @@
 
 
-    // Test H - Attempt to add item to an invalid metadata structure
-    printNegativeTestHeader(stdout,"psMetadata","Test H - Attempt to add item to metadata w/o hash table",
+    // Test G - Attempt to add item to an invalid metadata structure
+    printNegativeTestHeader(stdout,"psMetadata","Test G - Attempt to add item to metadata w/o hash table",
                             "Couldn't add item to invalid metadata structure.",0);
     errMetadata = psMetadataAlloc();
@@ -175,8 +182,8 @@
     }
     errMetadata->table = mdTable;
-    printFooter(stdout,"psMetadata","Test H - Attempt to add item to invalid metadata w/o hash table", true);
-
-    // Test J - Attempt to add item to an invalid metadata structure
-    printNegativeTestHeader(stdout,"psMetadata","Test J - Attempt to add item to metadata w/o link list",
+    printFooter(stdout,"psMetadata","Test G - Attempt to add item to invalid metadata w/o hash table", true);
+
+    // Test H - Attempt to add item to an invalid metadata structure
+    printNegativeTestHeader(stdout,"psMetadata","Test H - Attempt to add item to metadata w/o link list",
                             "Couldn't add item to invalid metadata structure.",0);
     mdList = errMetadata->list;
@@ -191,8 +198,8 @@
     }
     errMetadata->list = mdList;
-    printFooter(stdout,"psMetadata","Test J - Attempt to add item to invalid metadata w/o link list", true);
-
-    // Test K - Attempt to add item with a null name
-    printNegativeTestHeader(stdout,"psMetadata","Test K - Attempt to add item with null name",
+    printFooter(stdout,"psMetadata","Test H - Attempt to add item to invalid metadata w/o link list", true);
+
+    // Test I - Attempt to add item with a null name
+    printNegativeTestHeader(stdout,"psMetadata","Test I - Attempt to add item with null name",
                             "Couldn't add item with null name.",0);
     errName = errItem->name;
@@ -203,20 +210,20 @@
     }
     errItem->name = errName;
-    printFooter(stdout,"psMetadata","Test K - Attempt to add item with null name", true);
-
-    // Test L - Attempt to add item to an invalid metadata structure
-    printNegativeTestHeader(stdout,"psMetadata","Test L - Attempt to add item to metadata w/o hash table",
+    printFooter(stdout,"psMetadata","Test I - Attempt to add item with null name", true);
+
+    // Test J - Attempt to add item to an invalid metadata structure
+    printNegativeTestHeader(stdout,"psMetadata","Test J - Attempt to add item to metadata w/o hash table",
                             "Couldn't add item to invalid metadata structure.",0);
     mdTable = errMetadata->table;
     errMetadata->table = NULL;
-    if ( psMetadataAdd(errMetadata, PS_LIST_HEAD, "errItem", PS_META_S32,"Integer",22) ) {
+    if (psMetadataAdd(errMetadata, PS_LIST_HEAD, "errItem", PS_TYPE_S32, PS_META_PRIMITIVE, "Integer",22) ) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o hash table.");
         return 24;
     }
     errMetadata->table = mdTable;
-    printFooter(stdout,"psMetadata","Test L - Attempt to add item to invalid metadata w/o hash table", true);
-
-    // Test G - Free psMetadata
-    printPositiveTestHeader(stdout, "psMetadata", "Test G - Free psMetadata");
+    printFooter(stdout,"psMetadata","Test J - Attempt to add item to invalid metadata w/o hash table", true);
+
+    // Test K - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test K - Free psMetadata");
     psFree(metadata);
     psFree(item1);
@@ -235,5 +242,5 @@
         printf("ERROR: Found %d bad memory blocks\n", nBad);
     }
-    printFooter(stdout, "psMetadata", "Test G - Free psMetadata", true);
+    printFooter(stdout, "psMetadata", "Test K - Free psMetadata", true);
 
 
Index: /trunk/psLib/test/astronomy/tst_psMetadata_04.c
===================================================================
--- /trunk/psLib/test/astronomy/tst_psMetadata_04.c	(revision 2606)
+++ /trunk/psLib/test/astronomy/tst_psMetadata_04.c	(revision 2607)
@@ -13,11 +13,12 @@
 *     Test G - Attempt to use null metadata
 *     Test H - Attempt to get non-existant metadata item
-*     Test I - Free psMetadata
-*     Test J - Attempt to look up with an invalid metadata object
+*     Test I - Attempt to look up with an invalid metadata object
+*     Test J - Attempt get item  with an invalid metadata object
+*     Test K - Free psMetadata
 *
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.8 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:54:50 $
+*  @version $Revision: 1.9 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -29,36 +30,39 @@
 #include <string.h>
 
-static void printMetadataItem(psMetadataItem *item)
+static void printMetadataItem(psMetadataItem *metadataItem)
 {
-    printf("Key Name: %8s  ", item->name);
-    printf("Key Type: %2d  ", item->type);
-
-    switch (item->type ) {
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", item->data.B);
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key pType: %2d  ", metadataItem->pType);
+    printf("Key mdType: %2d  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
         break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", item->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", item->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", item->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
         break;
     case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)item->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
         break;
     default:
-        printf("Bad type: %d ", item->type);
-    }
-    printf("Key Comment: %s\n", item->comment);
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
 }
 
@@ -75,11 +79,12 @@
     psList* tmpList = NULL;
 
+
     // Test A - Allocate metadata and items
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
     metadata = psMetadataAlloc();
-    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
-    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a integer", 55);
-    item3 = psMetadataItemAlloc("myItem3", PS_META_BOOL, "I am a boolean", false);
-    item4 = psMetadataItemAlloc("myItem4", PS_META_S32, "I am a integer", 66);
+    item1 = psMetadataItemAlloc("myItem1", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 55);
+    item3 = psMetadataItemAlloc("myItem3", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", false);
+    item4 = psMetadataItemAlloc("myItem4", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 66);
     printMetadataItem(item1);
     printMetadataItem(item2);
@@ -165,6 +170,6 @@
     printFooter(stdout, "psMetadata", "Test H - Attempt to get non-existant metadata item", true);
 
-    // Test J - Attempt to look up with an invalid metadata object
-    printNegativeTestHeader(stdout,"psMetadata","Test J - Attemp to look up with an invalid metadata",
+    // Test I - Attempt to look up with an invalid metadata object
+    printNegativeTestHeader(stdout,"psMetadata","Test I - Attemp to look up with an invalid metadata",
                             "Lookup item with invalid metadata object.", 0 );
     tmpTable = metadata->table;
@@ -175,8 +180,8 @@
     }
     metadata->table = tmpTable;
-    printFooter(stdout, "psMetadata","Test J - Attempt to lookup an invalid metadata object.",true);
-
-    // Test K - Attempt get item  with an invalid metadata object
-    printNegativeTestHeader(stdout,"psMetadata","Test K - Attemp to get item with an invalid metadata",
+    printFooter(stdout, "psMetadata","Test I - Attempt to lookup an invalid metadata object.",true);
+
+    // Test J - Attempt get item  with an invalid metadata object
+    printNegativeTestHeader(stdout,"psMetadata","Test J - Attemp to get item with an invalid metadata",
                             "Get item with invalid metadata object.", 0 );
     tmpList = metadata->list;
@@ -187,8 +192,8 @@
     }
     metadata->list = tmpList;
-    printFooter(stdout, "psMetadata","Test K - Attempt to get item with  invalid metadata object.",true);
-
-    // Test I - Free psMetadata
-    printPositiveTestHeader(stdout, "psMetadata", "Test I - Free psMetadata");
+    printFooter(stdout, "psMetadata","Test J - Attempt to get item with  invalid metadata object.",true);
+
+    // Test K - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test K - Free psMetadata");
     psFree(metadata);
     psFree(item1);
@@ -206,5 +211,5 @@
         return 21;
     }
-    printFooter(stdout, "psMetadata", "Test I - Free psMetadata", true);
+    printFooter(stdout, "psMetadata", "Test K - Free psMetadata", true);
 
 
Index: /trunk/psLib/test/astronomy/tst_psMetadata_05.c
===================================================================
--- /trunk/psLib/test/astronomy/tst_psMetadata_05.c	(revision 2606)
+++ /trunk/psLib/test/astronomy/tst_psMetadata_05.c	(revision 2607)
@@ -22,6 +22,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.12 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-30 01:16:43 $
+*  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -33,36 +33,39 @@
 #include <string.h>
 
-static void printMetadataItem(psMetadataItem *item)
+static void printMetadataItem(psMetadataItem *metadataItem)
 {
-    printf("Key Name: %8s  ", item->name);
-    printf("Key Type: %2d  ", item->type);
-
-    switch (item->type ) {
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", item->data.B);
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key pType: %2d  ", metadataItem->pType);
+    printf("Key mdType: %2d  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
         break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", item->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", item->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", item->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
         break;
     case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)item->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
         break;
     default:
-        printf("Bad type: %d ", item->type);
-    }
-    printf("Key Comment: %s\n", item->comment);
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
 }
 
@@ -70,6 +73,4 @@
 psS32 main( psS32 argc, char* argv[] )
 {
-    psS64 data;
-    psF32 fpdata;
     psMetadataItem *item1 = NULL;
     psMetadataItem *item2 = NULL;
@@ -80,21 +81,18 @@
     psMetadataItem *item7 = NULL;
     psMetadataItem *item8 = NULL;
-    psMetadataItem *item = NULL;
     psMetadata *metadata = NULL;
     FILE *fd = NULL;
-    char str[7];
-    psList* tmpList = NULL;
 
     // Test A - Allocate metadata and items
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
     metadata = psMetadataAlloc();
-    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
-    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a integer", 55);
-    item3 = psMetadataItemAlloc("myItem3", PS_META_BOOL, "I am a boolean", false);
-    item4 = psMetadataItemAlloc("myItem4", PS_META_S32, "I am a integer", 66);
-    item5 = psMetadataItemAlloc("myItem5", PS_META_F32, "I am a float", 3.14);
-    item6 = psMetadataItemAlloc("myItem6", PS_META_F64, "I am a double", 6.28);
-    item7 = psMetadataItemAlloc("myItem7", PS_META_STR, "I am a string", "GNIRTS");
-    item8 = psMetadataItemAlloc("myItem8", PS_META_UNKNOWN, "I am unknown");
+    item1 = psMetadataItemAlloc("myItem1", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 55);
+    item3 = psMetadataItemAlloc("myItem3", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", false);
+    item4 = psMetadataItemAlloc("myItem4", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 66);
+    item5 = psMetadataItemAlloc("myItem5", PS_TYPE_F32, PS_META_PRIMITIVE, "I am a float", 3.14);
+    item6 = psMetadataItemAlloc("myItem6", PS_TYPE_F64, PS_META_PRIMITIVE,"I am a double", 6.28);
+    item7 = psMetadataItemAlloc("myItem7", PS_TYPE_PTR, PS_META_STR, "I am a string", "GNIRTS");
+    item8 = psMetadataItemAlloc("myItem8", PS_TYPE_PTR, PS_META_UNKNOWN, "I am unknown");
     printMetadataItem(item1);
     printMetadataItem(item2);
@@ -107,58 +105,58 @@
     printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
 
-
-    // Test B - Set iterator at second index
-    printPositiveTestHeader(stdout, "psMetadata", "Test B - Set iterator at second index");
-    if ( !psMetadataSetIterator(metadata, 2)) {
-        psError(PS_ERR_UNKNOWN,true,"Failed to set iterator");
-        return 100;
-    }
-    printFooter(stdout, "psMetadata", "Test B - Set iterator at second index", true);
-
-
-    // Test C - Get next item at index
-    printPositiveTestHeader(stdout, "psMetadata", "Test C - Get next item at index");
-    item = psMetadataGetNext(metadata, NULL, 2);
-    if(item == NULL) {
-        printf("ERROR: Item should not be null\n");
-    } else {
-        printf("Found item named %s\n", item->name);
-    }
-    printFooter(stdout, "psMetadata", "Test C - Get next item at index", true);
-
-
-    // Test D - Get next item at index and string
-    printPositiveTestHeader(stdout, "psMetadata", "Test D - Get next item at index and string");
-    item = psMetadataGetNext(metadata, "myItem1", 1);
-    if(item == NULL) {
-        printf("ERROR: Item should not be null\n");
-    } else {
-        printf("Found item named %s\n", item->name);
-    }
-    printFooter(stdout, "psMetadata", "Test D - Get next item at index and string", true);
-
-
-    // Test E - Get previous item at index
-    printPositiveTestHeader(stdout, "psMetadata", "Test E - Get previous item at index");
-    item = psMetadataGetPrevious(metadata, NULL, 1);
-    if(item == NULL) {
-        printf("ERROR: Item should not be null\n");
-    } else {
-        printf("Found item named %s\n", item->name);
-    }
-    if( psMetadataGetPrevious(metadata,"myItem3",1) == NULL) {
-        psError(PS_ERR_UNKNOWN, true,"psMetadataGetPrevious did not return an item from metadata.");
-        return 45;
-    }
-    tmpList = metadata->list;
-    metadata->list = NULL;
-    if ( psMetadataGetPrevious(metadata,NULL,1) != NULL) {
-        psError(PS_ERR_UNKNOWN, true,"psMetadataGetPrevious did not return null for invalid metadata.");
-        return 50;
-    }
-    metadata->list = tmpList;
-    printFooter(stdout, "psMetadata", "Test E - Get previous item at index", true);
-
-
+    /*
+        // Test B - Set iterator at second index
+        printPositiveTestHeader(stdout, "psMetadata", "Test B - Set iterator at second index");
+        if (!psMetadataSetIterator(metadata, 2)) {
+            psError(PS_ERR_UNKNOWN,true,"Failed to set iterator");
+            return 100;
+        }
+        printFooter(stdout, "psMetadata", "Test B - Set iterator at second index", true);
+     
+     
+        // Test C - Get next item at index
+        printPositiveTestHeader(stdout, "psMetadata", "Test C - Get next item at index");
+        item = psMetadataGetNext(metadata, NULL, 2);
+        if(item == NULL) {
+            printf("ERROR: Item should not be null\n");
+        } else {
+            printf("Found item named %s\n", item->name);
+        }
+        printFooter(stdout, "psMetadata", "Test C - Get next item at index", true);
+     
+     
+        // Test D - Get next item at index and string
+        printPositiveTestHeader(stdout, "psMetadata", "Test D - Get next item at index and string");
+        item = psMetadataGetNext(metadata, "myItem1", 1);
+        if(item == NULL) {
+            printf("ERROR: Item should not be null\n");
+        } else {
+            printf("Found item named %s\n", item->name);
+        }
+        printFooter(stdout, "psMetadata", "Test D - Get next item at index and string", true);
+     
+     
+        // Test E - Get previous item at index
+        printPositiveTestHeader(stdout, "psMetadata", "Test E - Get previous item at index");
+        item = psMetadataGetPrevious(metadata, NULL, 1);
+        if(item == NULL) {
+            printf("ERROR: Item should not be null\n");
+        } else {
+            printf("Found item named %s\n", item->name);
+        }
+        if( psMetadataGetPrevious(metadata,"myItem3",1) == NULL) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetPrevious did not return an item from metadata.");
+            return 45;
+        }
+        tmpList = metadata->list;
+        metadata->list = NULL;
+        if ( psMetadataGetPrevious(metadata,NULL,1) != NULL) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetPrevious did not return null for invalid metadata.");
+            return 50;
+        }
+        metadata->list = tmpList;
+        printFooter(stdout, "psMetadata", "Test E - Get previous item at index", true);
+     
+    */
     // Test F - Write metadata item to file
     printPositiveTestHeader(stdout, "psMetadata", "Test F - Write metadata item to file");
@@ -167,11 +165,10 @@
         printf("ERROR: Couldn't open file for writing\n");
     }
-    psMetadataItemPrint(fd, "S32  = %ld\n", item2);
-    psMetadataItemPrint(fd, "BOL  = %ld\n", item3);
-    psMetadataItemPrint(fd, "F32  = %g\n", item5);
-    psMetadataItemPrint(fd, "F64  = %g\n", item6);
-    psMetadataItemPrint(fd, "STR  = %s\n", item7);
-    psMetadataItemPrint(fd, "UNK  = \n", item8);
-    printFooter(stdout, "psMetadata", "Test F - Write metadata item to file", true);
+    psMetadataItemPrint(fd, "S32 = %ld\n", item2);
+    psMetadataItemPrint(fd, "BOL = %ld\n", item3);
+    psMetadataItemPrint(fd, "F32 = %g\n", item5);
+    psMetadataItemPrint(fd, "F64 = %g\n", item6);
+    psMetadataItemPrint(fd, "STR = %s\n", item7);
+    psMetadataItemPrint(fd, "UNK = \n", item8);
     fclose(fd);
     fd = fopen("./tst_psMetadata05_OUT", "r");
@@ -179,68 +176,81 @@
         printf("ERROR: Couldn't open file for reading\n");
     }
-    fscanf(fd, "S64 = %lld\n", &data);
-    if(data != 55) {
-        printf("ERROR: Data in file is not as expected. Value: %lld. Should be: 55.\n", data);
-    }
-    fscanf(fd, "BOL = %lld\n", &data);
-    if(data != 0) {
-        printf("ERROR: Data in file is not as expected. Value: %lld. Should be: 0.\n", data);
-    }
-    fscanf(fd, "F32 = %g\n", &fpdata);
-    if ( (fpdata <= 3.1) || (fpdata >= 3.2) ) {
-        printf("ERROR: Data in file is not as expected. Value: %g. Should be: 3.14.\n", fpdata);
-    }
-    fscanf(fd, "F64 = %g\n", &fpdata);
-    if ( (fpdata <= 6.2) || ( fpdata >= 6.3) ) {
-        printf("ERROR: Data in file is not as expected. Value: %g. Should be: 6.28.\n", fpdata);
-    }
-    fscanf(fd, "STR = %s\n", str);
-    if ( strcmp(str,"GNIRTS") != 0 ) {
-        printf("ERROR: Data is file is not as expected. Value: %s. Should be: GNIRTS.\n", str);
-    }
+
+    char line[256];
+    char truth1[] = "S32 = 55";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth1, 8)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth1);
+    }
+
+    char truth2[] = "BOL = 0";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth2, 7)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth2);
+    }
+
+    char truth3[] = "F32 = 3.14";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth3, 10)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth3);
+    }
+
+    char truth4[] = "F64 = 6.28";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth4, 10)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth4);
+    }
+
+    char truth5[] = "STR = GNIRTS";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth5, 12)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth5);
+    }
+
     fclose(fd);
-
-    // Test G - Attempt to use null metadata with setIterator
-    printNegativeTestHeader(stdout,"psMetadata", "Test G - Attempt to use null metadata with setIterator",
-                            "Null metadata collection not allowed", 0);
-    if( psMetadataSetIterator(NULL, 0)) {
-        psError(PS_ERR_UNKNOWN,true,"Set iterator did not detect invalid parameter.");
-        return 101;
-    }
-    tmpList = metadata->list;
-    metadata->list = NULL;
-    if( psMetadataSetIterator(metadata,0)) {
-        psError(PS_ERR_UNKNOWN,true,"Set iterator did not detect null list.");
-        return 102;
-    }
-    metadata->list = tmpList;
-    printFooter(stdout, "psMetadata", "Test G - Attempt to use null metadata with setIterator", true);
-
-
-    // Test H - Attempt to use null metadata with getNext
-    printNegativeTestHeader(stdout,"psMetadata", "Test H - Attempt to use null metadata with getNext",
-                            "Null metadata collection not allowed", 0);
-    if( psMetadataGetNext(NULL, "myItem2", 0) != NULL ) {
-        psError(PS_ERR_UNKNOWN, true,"psMetadataGetNext did not return null for null metadata.");
-        return 40;
-    }
-    tmpList = metadata->list;
-    metadata->list = NULL;
-    if ( psMetadataGetNext(metadata, "myItem2", 0) != NULL ) {
-        psError(PS_ERR_UNKNOWN, true,"psMetadataGetNext did not return null for invalid metadata.");
-        return 41;
-    }
-    metadata->list = tmpList;
-
-    printFooter(stdout, "psMetadata", "Test H - Attempt to use null metadata with getNext", true);
-
-
-    // Test I - Attempt to use null metadata with getPrevious
-    printNegativeTestHeader(stdout,"psMetadata", "Test I - Attempt to use null metadata with getPrevious",
-                            "Null metadata collection not allowed", 0);
-    psMetadataGetPrevious(NULL, "myItem2", 0);
-    printFooter(stdout, "psMetadata", "Test I - Attempt to use null metadata with getPrevious", true);
-
-
+    printFooter(stdout, "psMetadata", "Test F - Write metadata item to file", true);
+    /*
+        // Test G - Attempt to use null metadata with setIterator
+        printNegativeTestHeader(stdout,"psMetadata", "Test G - Attempt to use null metadata with setIterator",
+                                "Null metadata collection not allowed", 0);
+        if( psMetadataSetIterator(NULL, 0)) {
+            psError(PS_ERR_UNKNOWN,true,"Set iterator did not detect invalid parameter.");
+            return 101;
+        }
+        tmpList = metadata->list;
+        metadata->list = NULL;
+        if( psMetadataSetIterator(metadata,0)) {
+            psError(PS_ERR_UNKNOWN,true,"Set iterator did not detect null list.");
+            return 102;
+        }
+        metadata->list = tmpList;
+        printFooter(stdout, "psMetadata", "Test G - Attempt to use null metadata with setIterator", true);
+     
+     
+        // Test H - Attempt to use null metadata with getNext
+        printNegativeTestHeader(stdout,"psMetadata", "Test H - Attempt to use null metadata with getNext",
+                                "Null metadata collection not allowed", 0);
+        if( psMetadataGetNext(NULL, "myItem2", 0) != NULL ) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetNext did not return null for null metadata.");
+            return 40;
+        }
+        tmpList = metadata->list;
+        metadata->list = NULL;
+        if ( psMetadataGetNext(metadata, "myItem2", 0) != NULL ) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetNext did not return null for invalid metadata.");
+            return 41;
+        }
+        metadata->list = tmpList;
+     
+        printFooter(stdout, "psMetadata", "Test H - Attempt to use null metadata with getNext", true);
+     
+     
+        // Test I - Attempt to use null metadata with getPrevious
+        printNegativeTestHeader(stdout,"psMetadata", "Test I - Attempt to use null metadata with getPrevious",
+                                "Null metadata collection not allowed", 0);
+        psMetadataGetPrevious(NULL, "myItem2", 0);
+        printFooter(stdout, "psMetadata", "Test I - Attempt to use null metadata with getPrevious", true);
+     
+    */
     // Test J - Attempt to use null file with itemPrint
     printNegativeTestHeader(stdout,"psMetadata", "Test J - Attempt to use null file with itemPrint",
Index: /trunk/psLib/test/astronomy/tst_psMetadata_06.c
===================================================================
--- /trunk/psLib/test/astronomy/tst_psMetadata_06.c	(revision 2606)
+++ /trunk/psLib/test/astronomy/tst_psMetadata_06.c	(revision 2607)
@@ -13,6 +13,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.6 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:54:50 $
+*  @version $Revision: 1.7 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -24,36 +24,39 @@
 #include <string.h>
 
-static void printMetadataItem(psMetadataItem *item)
+static void printMetadataItem(psMetadataItem *metadataItem)
 {
-    printf("Key Name: %8s  ", item->name);
-    printf("Key Type: %2d  ", item->type);
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key pType: %2d  ", metadataItem->pType);
+    printf("Key mdType: %2d  ", metadataItem->type);
 
-    switch (item->type ) {
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", item->data.B);
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
         break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", item->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", item->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", item->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
         break;
     case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)item->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
         break;
     default:
-        printf("Bad type: %d ", item->type);
+        printf("Bad type: %d ", metadataItem->type);
     }
-    printf("Key Comment: %s\n", item->comment);
+    printf("Key Comment: %s\n", metadataItem->comment);
 }
 
@@ -71,9 +74,9 @@
     // Test A - Allocate metadata and items
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata and items");
-    item1a = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
-    item1b = psMetadataItemAlloc("myItem1", PS_META_S32, "I am a signed integer", 111);
-    item1c = psMetadataItemAlloc("myItem1", PS_META_S32, "I am a signed integer", 222);
-    item2a = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a signed integer", 333);
-    item2b = psMetadataItemAlloc("myItem2", PS_META_ITEM_SET, "I am a folder node", NULL);
+    item1a = psMetadataItemAlloc("myItem1", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", true);
+    item1b = psMetadataItemAlloc("myItem1", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a signed integer", 111);
+    item1c = psMetadataItemAlloc("myItem1", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a signed integer", 222);
+    item2a = psMetadataItemAlloc("myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a signed integer", 333);
+    item2b = psMetadataItemAlloc("myItem2", PS_TYPE_PTR, PS_META_LIST, "I am a folder node", NULL);
     metadata = psMetadataAlloc();
     printMetadataItem(item1a);
@@ -87,9 +90,9 @@
     // Test B - Add leaf node on top of existing leaf node
     printPositiveTestHeader(stdout, "psMetadata", "Test B - Add leaf node on top of existing leaf node");
-    if( ! psMetadataAddItem(metadata, item1a, PS_LIST_HEAD) ) {
+    if(!psMetadataAddItem(metadata, item1a, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
         return 20;
     }
-    if ( ! psMetadataAddItem(metadata, item1b, PS_LIST_HEAD) ) {
+    if (!psMetadataAddItem(metadata, item1b, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
         return 21;
@@ -101,5 +104,5 @@
     // Test C - Add leaf node to existing folder node
     printPositiveTestHeader(stdout, "psMetadata", "Test C - Add leaf node to existing folder node");
-    if ( ! psMetadataAddItem(metadata, item1c, PS_LIST_HEAD) ) {
+    if (!psMetadataAddItem(metadata, item1c, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem return false for adding a not to existing node.");
         return 22;
@@ -110,9 +113,9 @@
     // Test D - Add folder node on top of existing leaf node
     printPositiveTestHeader(stdout, "psMetadata", "Test D - Add folder node on top of existing leaf node");
-    if ( ! psMetadataAddItem(metadata, item2a, PS_LIST_HEAD) ) {
+    if (!psMetadataAddItem(metadata, item2a, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node to existing leaf node.");
         return 23;
     }
-    if ( ! psMetadataAddItem(metadata, item2b, PS_LIST_HEAD) ) {
+    if (!psMetadataAddItem(metadata, item2b, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a nod to existing leaf node.");
         return 24;
Index: /trunk/psLib/test/collections/tst_psMetadataIO.c
===================================================================
--- /trunk/psLib/test/collections/tst_psMetadataIO.c	(revision 2606)
+++ /trunk/psLib/test/collections/tst_psMetadataIO.c	(revision 2607)
@@ -13,6 +13,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.4 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:53:39 $
+*  @version $Revision: 1.5 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -25,6 +25,17 @@
 
 static void printMetadataItem(psMetadataItem *metadataItem, char *spaces);
+static void printMetadata(psMetadata *metadata);
+static void printMetadataList(psList *metadataItemList, char* spaces);
+static void printMetadataTable(psHash *mdTable);
 
-static void printMetadataItemList(psList *metadataItemList)
+static void printMetadata(psMetadata *metadata)
+{
+    printf("Contents of metadata list:\n");
+    printMetadataList(metadata->list, " ");
+    printf("\nContents of metadata table:\n");
+    printMetadataTable(metadata->table);
+}
+
+static void printMetadataList(psList *metadataItemList, char* spaces)
 {
     psMetadataItem *entryChild = NULL;
@@ -33,69 +44,6 @@
     entryChild = psListGetCurrent(metadataItemList);
     while (entryChild != NULL) {
-        printMetadataItem(entryChild, "    ");
+        printMetadataItem(entryChild, spaces);
         entryChild = psListGetNext(metadataItemList);
-    }
-}
-
-static void printMetadataList(psList *metadataItemList)
-{
-    psMetadataItem *entryChild = NULL;
-
-    psListSetIterator(metadataItemList, PS_LIST_HEAD);
-    entryChild = psListGetCurrent(metadataItemList);
-    while (entryChild != NULL) {
-        printMetadataItem(entryChild, " ");
-        entryChild = psListGetNext(metadataItemList);
-    }
-}
-static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
-{
-
-    psVector *vec = NULL;
-
-
-    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
-    printf("Key Type: %2d  ", metadataItem->type);
-
-    switch (metadataItem->type ) {
-    case PS_META_ITEM_SET:
-        printf("Key Value: %17c", ' ');
-        break;
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", metadataItem->data.B);
-        break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", metadataItem->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", metadataItem->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", metadataItem->data.F64);
-        break;
-    case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
-        break;
-    case PS_META_VEC:
-        vec = (psVector*)metadataItem->data.V;
-        printf("Key Value: ");
-        for(psS32 i=0; i<vec->nalloc;i++) {
-            printf("%d ", vec->data.S32[i]);
-        }
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
-        break;
-    default:
-        printf("Bad type: %d ", metadataItem->type);
-    }
-    printf("Key Comment: %s\n", metadataItem->comment);
-
-    if(metadataItem->items->size) {
-        printMetadataItemList(metadataItem->items);
     }
 }
@@ -114,10 +62,43 @@
 }
 
-static void printMetadata(psMetadata *metadata)
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
 {
-    printf("\nContents of metadata list:\n");
-    printMetadataList(metadata->list);
-    printf("\nContents of metadata table:\n");
-    printMetadataTable(metadata->table);
+    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
+    printf("Key pType: %d  ", metadataItem->pType);
+    printf("Key mdType: %d  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+
+    if(metadataItem->data.V && metadataItem->type==PS_META_LIST) {
+        printMetadataList(metadataItem->data.V, "    ");
+    }
 }
 
@@ -128,6 +109,6 @@
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Read config file with overwrite set true");
     psMetadata *metadata1 = NULL;
-    psS32 failedLines1 = 0;
-    failedLines1 = psMetadataParseConfig(&metadata1, "test.config", true);
+    psU32 failedLines1 = 0;
+    metadata1 = psMetadataParseConfig(metadata1, &failedLines1, "test.config", true);
     printf("Failed lines: %d Expected: 6\n", failedLines1);
     printMetadata(metadata1);
@@ -139,6 +120,6 @@
     psMetadata *metadata2 = NULL;
     psS32 failedLines2 = 0;
-    failedLines2 = psMetadataParseConfig(&metadata2, "test.config", false);
-    printf("Failed lines: %d Expected: 7", failedLines2);
+    metadata2 = psMetadataParseConfig(metadata2, &failedLines2, "test.config", false);
+    printf("Failed lines: %d Expected: 7 ", failedLines2);
     printMetadata(metadata2);
     printFooter(stdout, "psMetadata", "Test B - Read config file with overwrite set false", true);
@@ -149,6 +130,6 @@
     psMetadata *metadata3 = psMetadataAlloc();
     psS32 failedLines3 = 0;
-    failedLines3 = psMetadataParseConfig(&metadata3, "test.config", false);
-    printf("Failed lines: %d Expected: 7", failedLines3);
+    metadata3 = psMetadataParseConfig(metadata3, &failedLines3, "test.config", true);
+    printf("Failed lines: %d Expected: 6 ", failedLines3);
     printMetadata(metadata3);
     printFooter(stdout, "psMetadata", "Test C - Read config file without auto-allocation of metadata", true);
@@ -158,5 +139,5 @@
     printNegativeTestHeader(stdout,"psMetadataIO", "Test D - Attempt to use null fileName argument",
                             "Null failedLines not allowed", 0);
-    psMetadataParseConfig(&metadata1, NULL, true);
+    psMetadataParseConfig(metadata1, &failedLines1, NULL, true);
     printFooter(stdout, "psMetadata", "Test D - Attempt to use null fileName argument", true);
 
@@ -165,5 +146,5 @@
     printNegativeTestHeader(stdout,"psMetadataIO", "Test E - Attempt to open nonexistant file",
                             "Error opening file", 0);
-    psMetadataParseConfig(&metadata1, "abcedfg", true);
+    psMetadataParseConfig(metadata1, &failedLines1, "abcedfg", true);
     printFooter(stdout, "psMetadata", "Test E - Attempt to open nonexistant file", true);
 
Index: /trunk/psLib/test/collections/tst_psMetadata_01.c
===================================================================
--- /trunk/psLib/test/collections/tst_psMetadata_01.c	(revision 2606)
+++ /trunk/psLib/test/collections/tst_psMetadata_01.c	(revision 2607)
@@ -13,10 +13,11 @@
 *     Test H - Attempt to use bad extNum
 *     Test I - Attempt to use bad extNameTest
-*     Test J - Free psMetadataData
+*     Test J - Read named hdr w/ invalid extnum
+*     Test K - Free psMetadata
 *
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.15 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:54:50 $
+*  @version $Revision: 1.16 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -29,6 +30,17 @@
 
 static void printMetadataItem(psMetadataItem *metadataItem, char *spaces);
-
-static void printMetadataItemList(psList *metadataItemList)
+static void printMetadata(psMetadata *metadata);
+static void printMetadataList(psList *metadataItemList, char* spaces);
+static void printMetadataTable(psHash *mdTable);
+
+static void printMetadata(psMetadata *metadata)
+{
+    printf("Contents of metadata list:\n");
+    printMetadataList(metadata->list, " ");
+    printf("\nContents of metadata table:\n");
+    printMetadataTable(metadata->table);
+}
+
+static void printMetadataList(psList *metadataItemList, char* spaces)
 {
     psMetadataItem *entryChild = NULL;
@@ -37,58 +49,6 @@
     entryChild = psListGetCurrent(metadataItemList);
     while (entryChild != NULL) {
-        printMetadataItem(entryChild, "    ");
+        printMetadataItem(entryChild, spaces);
         entryChild = psListGetNext(metadataItemList);
-    }
-}
-
-static void printMetadataList(psList *metadataItemList)
-{
-    psMetadataItem *entryChild = NULL;
-
-    psListSetIterator(metadataItemList, PS_LIST_HEAD);
-    entryChild = psListGetCurrent(metadataItemList);
-    while (entryChild != NULL) {
-        printMetadataItem(entryChild, " ");
-        entryChild = psListGetNext(metadataItemList);
-    }
-}
-static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
-{
-    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
-    printf("Key Type: %2d  ", metadataItem->type);
-
-    switch (metadataItem->type ) {
-    case PS_META_ITEM_SET:
-        printf("Key Value: %17c", ' ');
-        break;
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", metadataItem->data.B);
-        break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", metadataItem->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", metadataItem->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", metadataItem->data.F64);
-        break;
-    case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
-        break;
-    default:
-        printf("Bad type: %d ", metadataItem->type);
-    }
-    printf("Key Comment: %s\n", metadataItem->comment);
-
-    if(metadataItem->items->size) {
-        printMetadataItemList(metadataItem->items);
     }
 }
@@ -107,10 +67,43 @@
 }
 
-static void printMetadata(psMetadata *metadata)
-{
-    printf("Contents of metadata list:\n");
-    printMetadataList(metadata->list);
-    printf("\nContents of metadata table:\n");
-    printMetadataTable(metadata->table);
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
+{
+    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
+    printf("Key pType: %d  ", metadataItem->pType);
+    printf("Key mdType: %d  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+
+    if(metadataItem->data.V && metadataItem->type==PS_META_LIST) {
+        printMetadataList(metadataItem->data.V, "    ");
+    }
 }
 
@@ -244,17 +237,17 @@
 
 
-    // Test I1 - Attempt to use a valid named extension with invalid extnum
-    printNegativeTestHeader(stdout, "psMetadata", "Test I1 - Read named hdr w/ invalid extnum",
+    // Test J - Read named hdr w/ invalid extnum
+    printNegativeTestHeader(stdout, "psMetadata", "Test J - Read named hdr w/ invalid extnum",
                             "If extName specified, extNum should be -1.", 0);
-    metadata1 = psMetadataReadHeader(NULL, "MY_DATA_2", 0, "header_2.fits");
+    metadata1 = psMetadataReadHeader(NULL, NULL, 0, "header_2.fits");
     if (metadata1 != NULL ) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataReadHeader did not return null w/ valid extname, invalid extnum");
         return 12;
     }
-    printFooter(stdout, "psMetadata", "Test C - Read named hdr from complex FITS file", true);
-
-
-    // Test J - Free psMetadata
-    printPositiveTestHeader(stdout, "psMetadata", "Test J - Free psMetadata");
+    printFooter(stdout, "psMetadata", "Test J - Read named hdr w/ invalid extnum", true);
+
+
+    // Test K - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test K - Free psMetadata");
     psFree(metadata1);
     psFree(metadata2);
@@ -262,5 +255,4 @@
     if(psMemCheckLeaks(0, NULL, stdout,false)) {
         psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");
-        return 10;
     }
     psMemCheckCorruption(0);
@@ -269,5 +261,5 @@
         printf("ERROR: Found %d bad memory blocks\n", nBad);
     }
-    printFooter(stdout, "psMetadata", "Test J - Free psMetadata", true);
+    printFooter(stdout, "psMetadata", "Test K - Free psMetadata", true);
 
     return 0;
Index: /trunk/psLib/test/collections/tst_psMetadata_02.c
===================================================================
--- /trunk/psLib/test/collections/tst_psMetadata_02.c	(revision 2606)
+++ /trunk/psLib/test/collections/tst_psMetadata_02.c	(revision 2607)
@@ -14,6 +14,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.8 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:54:50 $
+*  @version $Revision: 1.9 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -25,36 +25,39 @@
 #include <string.h>
 
-static void printMetadataItem(psMetadataItem *item)
+static void printMetadataItem(psMetadataItem *metadataItem)
 {
-    printf("Key Name: %8s  ", item->name);
-    printf("Key Type: %2d  ", item->type);
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key pType: %2d  ", metadataItem->pType);
+    printf("Key mdType: %2d  ", metadataItem->type);
 
-    switch (item->type ) {
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", item->data.B);
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
         break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", item->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", item->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", item->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
         break;
     case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)item->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
         break;
     default:
-        printf("Bad type: %d ", item->type);
+        printf("Bad type: %d ", metadataItem->type);
     }
-    printf("Key Comment: %s\n", item->comment);
+    printf("Key Comment: %s\n", metadataItem->comment);
 }
 
@@ -73,9 +76,9 @@
     // Test A - Allocate metadata items
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
-    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
-    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a signed integer", 111);
-    item3 = psMetadataItemAlloc("myItem3", PS_META_F32, "I am a single precision floating point", 222.222);
-    item4 = psMetadataItemAlloc("myItem4", PS_META_F64, "I am a double precision floating point", 333.333);
-    item5 = psMetadataItemAlloc("myItem5", PS_META_STR, "I am a string", "HELLO WORLD");
+    item1 = psMetadataItemAlloc("myItem1", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a signed integer", 111);
+    item3 = psMetadataItemAlloc("myItem3", PS_TYPE_F32, PS_META_PRIMITIVE, "I am a single precision floating point", 222.222);
+    item4 = psMetadataItemAlloc("myItem4", PS_TYPE_F64, PS_META_PRIMITIVE, "I am a double precision floating point", 333.333);
+    item5 = psMetadataItemAlloc("myItem5", PS_TYPE_PTR, PS_META_STR, "I am a string", "HELLO WORLD");
     printMetadataItem(item1);
     printMetadataItem(item2);
@@ -90,5 +93,5 @@
                             "Null value for name not allowed", 0);
     psLogMsg(__func__,PS_LOG_INFO,"Following should produce error for null name.");
-    badItem = psMetadataItemAlloc(NULL, PS_META_STR, "I am a string", "HELLO WORLD");
+    badItem = psMetadataItemAlloc(NULL, PS_TYPE_PTR, PS_META_STR, "I am a string", "HELLO WORLD");
     if (badItem != NULL) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataItemAlloc did not return null with null name item.");
@@ -101,5 +104,5 @@
     printNegativeTestHeader(stdout,"psMetadata", "Test C - Attempt to create metadata item with invalid type",
                             "Invalid psMetadataType: 6", 0);
-    badItem = psMetadataItemAlloc("badItem", PS_META_IMG, "I am bad", "Bad comment");
+    badItem = psMetadataItemAlloc("badItem", PS_TYPE_PTR, PS_META_NTYPE, "I am bad", "Bad comment");
     printFooter(stdout, "psMetadata", "Test C - Attempt to create metadata item with invalid type", true);
 
Index: /trunk/psLib/test/collections/tst_psMetadata_03.c
===================================================================
--- /trunk/psLib/test/collections/tst_psMetadata_03.c	(revision 2606)
+++ /trunk/psLib/test/collections/tst_psMetadata_03.c	(revision 2607)
@@ -10,10 +10,14 @@
 *     Test E - Attempt to remove non-existant metadata item by name
 *     Test F - Attempt to remove non-existant metadata item by index
-*     Test G - Free psMetadata
- *
+*     Test G - Attempt to add item to an invalid metadata structure
+*     Test H - Attempt to add item to an invalid metadata structure
+*     Test I - Attempt to add item with a null name
+*     Test J - Attempt to add item to an invalid metadata structure
+*     Test K - Free psMetadata
+*
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.10 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:54:50 $
+*  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -25,36 +29,39 @@
 #include <string.h>
 
-static void printMetadataItem(psMetadataItem *item)
+static void printMetadataItem(psMetadataItem *metadataItem)
 {
-    printf("Key Name: %8s  ", item->name);
-    printf("Key Type: %2d  ", item->type);
-
-    switch (item->type ) {
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", item->data.B);
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key pType: %2d  ", metadataItem->pType);
+    printf("Key mdType: %2d  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
         break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", item->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", item->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", item->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
         break;
     case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)item->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
         break;
     default:
-        printf("Bad type: %d ", item->type);
-    }
-    printf("Key Comment: %s\n", item->comment);
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
 }
 
@@ -76,9 +83,9 @@
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
     metadata = psMetadataAlloc();
-    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
-    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a integer", 55);
-    item3 = psMetadataItemAlloc("myItem3", PS_META_BOOL, "I am a boolean", false);
-    item4 = psMetadataItemAlloc("myItem4", PS_META_S32, "I am a integer", 66);
-    errItem = psMetadataItemAlloc("errItem", PS_META_S32, "I am a integer", 99);
+    item1 = psMetadataItemAlloc("myItem1", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 55);
+    item3 = psMetadataItemAlloc("myItem3", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", false);
+    item4 = psMetadataItemAlloc("myItem4", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 66);
+    errItem = psMetadataItemAlloc("errItem", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 99);
     printMetadataItem(item1);
     printMetadataItem(item2);
@@ -90,17 +97,17 @@
     // Test B - Remove items from metadata by name
     printPositiveTestHeader(stdout, "psMetadata", "Test B - Remove items from metadata by name");
-    if( ! psMetadataAddItem(metadata, item1, PS_LIST_HEAD) ) {
+    if(!psMetadataAddItem(metadata, item1, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by name.");
         return 10;
     }
-    if( ! psMetadataAdd(metadata,PS_LIST_HEAD,"myItem2",PS_META_S32,"I am S32 integer",77) ) {
+    if(!psMetadataAdd(metadata,PS_LIST_HEAD,"myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am S32 integer",77)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by name.");
         return 11;
     }
-    if ( ! psMetadataRemove(metadata, 0, "myItem1" ) ) {
+    if (!psMetadataRemove(metadata, 0, "myItem1")) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return true when removing by name.");
         return 12;
     }
-    if ( ! psMetadataRemove(metadata, 0, "myItem2" ) ) {
+    if (!psMetadataRemove(metadata, 0, "myItem2")) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return true when removing by name.");
         return 13;
@@ -115,5 +122,5 @@
         return 14;
     }
-    if ( ! psMetadataAdd(metadata,PS_LIST_HEAD,"myItem4",PS_META_S32,"I am S32 integer",88) ) {
+    if ( ! psMetadataAdd(metadata,PS_LIST_HEAD,"myItem4", PS_TYPE_S32, PS_META_PRIMITIVE, "I am S32 integer",88) ) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by index.");
         return 15;
@@ -160,6 +167,6 @@
 
 
-    // Test H - Attempt to add item to an invalid metadata structure
-    printNegativeTestHeader(stdout,"psMetadata","Test H - Attempt to add item to metadata w/o hash table",
+    // Test G - Attempt to add item to an invalid metadata structure
+    printNegativeTestHeader(stdout,"psMetadata","Test G - Attempt to add item to metadata w/o hash table",
                             "Couldn't add item to invalid metadata structure.",0);
     errMetadata = psMetadataAlloc();
@@ -175,8 +182,8 @@
     }
     errMetadata->table = mdTable;
-    printFooter(stdout,"psMetadata","Test H - Attempt to add item to invalid metadata w/o hash table", true);
-
-    // Test J - Attempt to add item to an invalid metadata structure
-    printNegativeTestHeader(stdout,"psMetadata","Test J - Attempt to add item to metadata w/o link list",
+    printFooter(stdout,"psMetadata","Test G - Attempt to add item to invalid metadata w/o hash table", true);
+
+    // Test H - Attempt to add item to an invalid metadata structure
+    printNegativeTestHeader(stdout,"psMetadata","Test H - Attempt to add item to metadata w/o link list",
                             "Couldn't add item to invalid metadata structure.",0);
     mdList = errMetadata->list;
@@ -191,8 +198,8 @@
     }
     errMetadata->list = mdList;
-    printFooter(stdout,"psMetadata","Test J - Attempt to add item to invalid metadata w/o link list", true);
-
-    // Test K - Attempt to add item with a null name
-    printNegativeTestHeader(stdout,"psMetadata","Test K - Attempt to add item with null name",
+    printFooter(stdout,"psMetadata","Test H - Attempt to add item to invalid metadata w/o link list", true);
+
+    // Test I - Attempt to add item with a null name
+    printNegativeTestHeader(stdout,"psMetadata","Test I - Attempt to add item with null name",
                             "Couldn't add item with null name.",0);
     errName = errItem->name;
@@ -203,20 +210,20 @@
     }
     errItem->name = errName;
-    printFooter(stdout,"psMetadata","Test K - Attempt to add item with null name", true);
-
-    // Test L - Attempt to add item to an invalid metadata structure
-    printNegativeTestHeader(stdout,"psMetadata","Test L - Attempt to add item to metadata w/o hash table",
+    printFooter(stdout,"psMetadata","Test I - Attempt to add item with null name", true);
+
+    // Test J - Attempt to add item to an invalid metadata structure
+    printNegativeTestHeader(stdout,"psMetadata","Test J - Attempt to add item to metadata w/o hash table",
                             "Couldn't add item to invalid metadata structure.",0);
     mdTable = errMetadata->table;
     errMetadata->table = NULL;
-    if ( psMetadataAdd(errMetadata, PS_LIST_HEAD, "errItem", PS_META_S32,"Integer",22) ) {
+    if (psMetadataAdd(errMetadata, PS_LIST_HEAD, "errItem", PS_TYPE_S32, PS_META_PRIMITIVE, "Integer",22) ) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o hash table.");
         return 24;
     }
     errMetadata->table = mdTable;
-    printFooter(stdout,"psMetadata","Test L - Attempt to add item to invalid metadata w/o hash table", true);
-
-    // Test G - Free psMetadata
-    printPositiveTestHeader(stdout, "psMetadata", "Test G - Free psMetadata");
+    printFooter(stdout,"psMetadata","Test J - Attempt to add item to invalid metadata w/o hash table", true);
+
+    // Test K - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test K - Free psMetadata");
     psFree(metadata);
     psFree(item1);
@@ -235,5 +242,5 @@
         printf("ERROR: Found %d bad memory blocks\n", nBad);
     }
-    printFooter(stdout, "psMetadata", "Test G - Free psMetadata", true);
+    printFooter(stdout, "psMetadata", "Test K - Free psMetadata", true);
 
 
Index: /trunk/psLib/test/collections/tst_psMetadata_04.c
===================================================================
--- /trunk/psLib/test/collections/tst_psMetadata_04.c	(revision 2606)
+++ /trunk/psLib/test/collections/tst_psMetadata_04.c	(revision 2607)
@@ -13,11 +13,12 @@
 *     Test G - Attempt to use null metadata
 *     Test H - Attempt to get non-existant metadata item
-*     Test I - Free psMetadata
-*     Test J - Attempt to look up with an invalid metadata object
+*     Test I - Attempt to look up with an invalid metadata object
+*     Test J - Attempt get item  with an invalid metadata object
+*     Test K - Free psMetadata
 *
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.8 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:54:50 $
+*  @version $Revision: 1.9 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -29,36 +30,39 @@
 #include <string.h>
 
-static void printMetadataItem(psMetadataItem *item)
+static void printMetadataItem(psMetadataItem *metadataItem)
 {
-    printf("Key Name: %8s  ", item->name);
-    printf("Key Type: %2d  ", item->type);
-
-    switch (item->type ) {
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", item->data.B);
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key pType: %2d  ", metadataItem->pType);
+    printf("Key mdType: %2d  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
         break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", item->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", item->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", item->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
         break;
     case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)item->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
         break;
     default:
-        printf("Bad type: %d ", item->type);
-    }
-    printf("Key Comment: %s\n", item->comment);
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
 }
 
@@ -75,11 +79,12 @@
     psList* tmpList = NULL;
 
+
     // Test A - Allocate metadata and items
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
     metadata = psMetadataAlloc();
-    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
-    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a integer", 55);
-    item3 = psMetadataItemAlloc("myItem3", PS_META_BOOL, "I am a boolean", false);
-    item4 = psMetadataItemAlloc("myItem4", PS_META_S32, "I am a integer", 66);
+    item1 = psMetadataItemAlloc("myItem1", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 55);
+    item3 = psMetadataItemAlloc("myItem3", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", false);
+    item4 = psMetadataItemAlloc("myItem4", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 66);
     printMetadataItem(item1);
     printMetadataItem(item2);
@@ -165,6 +170,6 @@
     printFooter(stdout, "psMetadata", "Test H - Attempt to get non-existant metadata item", true);
 
-    // Test J - Attempt to look up with an invalid metadata object
-    printNegativeTestHeader(stdout,"psMetadata","Test J - Attemp to look up with an invalid metadata",
+    // Test I - Attempt to look up with an invalid metadata object
+    printNegativeTestHeader(stdout,"psMetadata","Test I - Attemp to look up with an invalid metadata",
                             "Lookup item with invalid metadata object.", 0 );
     tmpTable = metadata->table;
@@ -175,8 +180,8 @@
     }
     metadata->table = tmpTable;
-    printFooter(stdout, "psMetadata","Test J - Attempt to lookup an invalid metadata object.",true);
-
-    // Test K - Attempt get item  with an invalid metadata object
-    printNegativeTestHeader(stdout,"psMetadata","Test K - Attemp to get item with an invalid metadata",
+    printFooter(stdout, "psMetadata","Test I - Attempt to lookup an invalid metadata object.",true);
+
+    // Test J - Attempt get item  with an invalid metadata object
+    printNegativeTestHeader(stdout,"psMetadata","Test J - Attemp to get item with an invalid metadata",
                             "Get item with invalid metadata object.", 0 );
     tmpList = metadata->list;
@@ -187,8 +192,8 @@
     }
     metadata->list = tmpList;
-    printFooter(stdout, "psMetadata","Test K - Attempt to get item with  invalid metadata object.",true);
-
-    // Test I - Free psMetadata
-    printPositiveTestHeader(stdout, "psMetadata", "Test I - Free psMetadata");
+    printFooter(stdout, "psMetadata","Test J - Attempt to get item with  invalid metadata object.",true);
+
+    // Test K - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test K - Free psMetadata");
     psFree(metadata);
     psFree(item1);
@@ -206,5 +211,5 @@
         return 21;
     }
-    printFooter(stdout, "psMetadata", "Test I - Free psMetadata", true);
+    printFooter(stdout, "psMetadata", "Test K - Free psMetadata", true);
 
 
Index: /trunk/psLib/test/collections/tst_psMetadata_05.c
===================================================================
--- /trunk/psLib/test/collections/tst_psMetadata_05.c	(revision 2606)
+++ /trunk/psLib/test/collections/tst_psMetadata_05.c	(revision 2607)
@@ -22,6 +22,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.12 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-30 01:16:43 $
+*  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -33,36 +33,39 @@
 #include <string.h>
 
-static void printMetadataItem(psMetadataItem *item)
+static void printMetadataItem(psMetadataItem *metadataItem)
 {
-    printf("Key Name: %8s  ", item->name);
-    printf("Key Type: %2d  ", item->type);
-
-    switch (item->type ) {
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", item->data.B);
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key pType: %2d  ", metadataItem->pType);
+    printf("Key mdType: %2d  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
         break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", item->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", item->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", item->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
         break;
     case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)item->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
         break;
     default:
-        printf("Bad type: %d ", item->type);
-    }
-    printf("Key Comment: %s\n", item->comment);
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
 }
 
@@ -70,6 +73,4 @@
 psS32 main( psS32 argc, char* argv[] )
 {
-    psS64 data;
-    psF32 fpdata;
     psMetadataItem *item1 = NULL;
     psMetadataItem *item2 = NULL;
@@ -80,21 +81,18 @@
     psMetadataItem *item7 = NULL;
     psMetadataItem *item8 = NULL;
-    psMetadataItem *item = NULL;
     psMetadata *metadata = NULL;
     FILE *fd = NULL;
-    char str[7];
-    psList* tmpList = NULL;
 
     // Test A - Allocate metadata and items
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
     metadata = psMetadataAlloc();
-    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
-    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a integer", 55);
-    item3 = psMetadataItemAlloc("myItem3", PS_META_BOOL, "I am a boolean", false);
-    item4 = psMetadataItemAlloc("myItem4", PS_META_S32, "I am a integer", 66);
-    item5 = psMetadataItemAlloc("myItem5", PS_META_F32, "I am a float", 3.14);
-    item6 = psMetadataItemAlloc("myItem6", PS_META_F64, "I am a double", 6.28);
-    item7 = psMetadataItemAlloc("myItem7", PS_META_STR, "I am a string", "GNIRTS");
-    item8 = psMetadataItemAlloc("myItem8", PS_META_UNKNOWN, "I am unknown");
+    item1 = psMetadataItemAlloc("myItem1", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 55);
+    item3 = psMetadataItemAlloc("myItem3", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", false);
+    item4 = psMetadataItemAlloc("myItem4", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a integer", 66);
+    item5 = psMetadataItemAlloc("myItem5", PS_TYPE_F32, PS_META_PRIMITIVE, "I am a float", 3.14);
+    item6 = psMetadataItemAlloc("myItem6", PS_TYPE_F64, PS_META_PRIMITIVE,"I am a double", 6.28);
+    item7 = psMetadataItemAlloc("myItem7", PS_TYPE_PTR, PS_META_STR, "I am a string", "GNIRTS");
+    item8 = psMetadataItemAlloc("myItem8", PS_TYPE_PTR, PS_META_UNKNOWN, "I am unknown");
     printMetadataItem(item1);
     printMetadataItem(item2);
@@ -107,58 +105,58 @@
     printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
 
-
-    // Test B - Set iterator at second index
-    printPositiveTestHeader(stdout, "psMetadata", "Test B - Set iterator at second index");
-    if ( !psMetadataSetIterator(metadata, 2)) {
-        psError(PS_ERR_UNKNOWN,true,"Failed to set iterator");
-        return 100;
-    }
-    printFooter(stdout, "psMetadata", "Test B - Set iterator at second index", true);
-
-
-    // Test C - Get next item at index
-    printPositiveTestHeader(stdout, "psMetadata", "Test C - Get next item at index");
-    item = psMetadataGetNext(metadata, NULL, 2);
-    if(item == NULL) {
-        printf("ERROR: Item should not be null\n");
-    } else {
-        printf("Found item named %s\n", item->name);
-    }
-    printFooter(stdout, "psMetadata", "Test C - Get next item at index", true);
-
-
-    // Test D - Get next item at index and string
-    printPositiveTestHeader(stdout, "psMetadata", "Test D - Get next item at index and string");
-    item = psMetadataGetNext(metadata, "myItem1", 1);
-    if(item == NULL) {
-        printf("ERROR: Item should not be null\n");
-    } else {
-        printf("Found item named %s\n", item->name);
-    }
-    printFooter(stdout, "psMetadata", "Test D - Get next item at index and string", true);
-
-
-    // Test E - Get previous item at index
-    printPositiveTestHeader(stdout, "psMetadata", "Test E - Get previous item at index");
-    item = psMetadataGetPrevious(metadata, NULL, 1);
-    if(item == NULL) {
-        printf("ERROR: Item should not be null\n");
-    } else {
-        printf("Found item named %s\n", item->name);
-    }
-    if( psMetadataGetPrevious(metadata,"myItem3",1) == NULL) {
-        psError(PS_ERR_UNKNOWN, true,"psMetadataGetPrevious did not return an item from metadata.");
-        return 45;
-    }
-    tmpList = metadata->list;
-    metadata->list = NULL;
-    if ( psMetadataGetPrevious(metadata,NULL,1) != NULL) {
-        psError(PS_ERR_UNKNOWN, true,"psMetadataGetPrevious did not return null for invalid metadata.");
-        return 50;
-    }
-    metadata->list = tmpList;
-    printFooter(stdout, "psMetadata", "Test E - Get previous item at index", true);
-
-
+    /*
+        // Test B - Set iterator at second index
+        printPositiveTestHeader(stdout, "psMetadata", "Test B - Set iterator at second index");
+        if (!psMetadataSetIterator(metadata, 2)) {
+            psError(PS_ERR_UNKNOWN,true,"Failed to set iterator");
+            return 100;
+        }
+        printFooter(stdout, "psMetadata", "Test B - Set iterator at second index", true);
+     
+     
+        // Test C - Get next item at index
+        printPositiveTestHeader(stdout, "psMetadata", "Test C - Get next item at index");
+        item = psMetadataGetNext(metadata, NULL, 2);
+        if(item == NULL) {
+            printf("ERROR: Item should not be null\n");
+        } else {
+            printf("Found item named %s\n", item->name);
+        }
+        printFooter(stdout, "psMetadata", "Test C - Get next item at index", true);
+     
+     
+        // Test D - Get next item at index and string
+        printPositiveTestHeader(stdout, "psMetadata", "Test D - Get next item at index and string");
+        item = psMetadataGetNext(metadata, "myItem1", 1);
+        if(item == NULL) {
+            printf("ERROR: Item should not be null\n");
+        } else {
+            printf("Found item named %s\n", item->name);
+        }
+        printFooter(stdout, "psMetadata", "Test D - Get next item at index and string", true);
+     
+     
+        // Test E - Get previous item at index
+        printPositiveTestHeader(stdout, "psMetadata", "Test E - Get previous item at index");
+        item = psMetadataGetPrevious(metadata, NULL, 1);
+        if(item == NULL) {
+            printf("ERROR: Item should not be null\n");
+        } else {
+            printf("Found item named %s\n", item->name);
+        }
+        if( psMetadataGetPrevious(metadata,"myItem3",1) == NULL) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetPrevious did not return an item from metadata.");
+            return 45;
+        }
+        tmpList = metadata->list;
+        metadata->list = NULL;
+        if ( psMetadataGetPrevious(metadata,NULL,1) != NULL) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetPrevious did not return null for invalid metadata.");
+            return 50;
+        }
+        metadata->list = tmpList;
+        printFooter(stdout, "psMetadata", "Test E - Get previous item at index", true);
+     
+    */
     // Test F - Write metadata item to file
     printPositiveTestHeader(stdout, "psMetadata", "Test F - Write metadata item to file");
@@ -167,11 +165,10 @@
         printf("ERROR: Couldn't open file for writing\n");
     }
-    psMetadataItemPrint(fd, "S32  = %ld\n", item2);
-    psMetadataItemPrint(fd, "BOL  = %ld\n", item3);
-    psMetadataItemPrint(fd, "F32  = %g\n", item5);
-    psMetadataItemPrint(fd, "F64  = %g\n", item6);
-    psMetadataItemPrint(fd, "STR  = %s\n", item7);
-    psMetadataItemPrint(fd, "UNK  = \n", item8);
-    printFooter(stdout, "psMetadata", "Test F - Write metadata item to file", true);
+    psMetadataItemPrint(fd, "S32 = %ld\n", item2);
+    psMetadataItemPrint(fd, "BOL = %ld\n", item3);
+    psMetadataItemPrint(fd, "F32 = %g\n", item5);
+    psMetadataItemPrint(fd, "F64 = %g\n", item6);
+    psMetadataItemPrint(fd, "STR = %s\n", item7);
+    psMetadataItemPrint(fd, "UNK = \n", item8);
     fclose(fd);
     fd = fopen("./tst_psMetadata05_OUT", "r");
@@ -179,68 +176,81 @@
         printf("ERROR: Couldn't open file for reading\n");
     }
-    fscanf(fd, "S64 = %lld\n", &data);
-    if(data != 55) {
-        printf("ERROR: Data in file is not as expected. Value: %lld. Should be: 55.\n", data);
-    }
-    fscanf(fd, "BOL = %lld\n", &data);
-    if(data != 0) {
-        printf("ERROR: Data in file is not as expected. Value: %lld. Should be: 0.\n", data);
-    }
-    fscanf(fd, "F32 = %g\n", &fpdata);
-    if ( (fpdata <= 3.1) || (fpdata >= 3.2) ) {
-        printf("ERROR: Data in file is not as expected. Value: %g. Should be: 3.14.\n", fpdata);
-    }
-    fscanf(fd, "F64 = %g\n", &fpdata);
-    if ( (fpdata <= 6.2) || ( fpdata >= 6.3) ) {
-        printf("ERROR: Data in file is not as expected. Value: %g. Should be: 6.28.\n", fpdata);
-    }
-    fscanf(fd, "STR = %s\n", str);
-    if ( strcmp(str,"GNIRTS") != 0 ) {
-        printf("ERROR: Data is file is not as expected. Value: %s. Should be: GNIRTS.\n", str);
-    }
+
+    char line[256];
+    char truth1[] = "S32 = 55";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth1, 8)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth1);
+    }
+
+    char truth2[] = "BOL = 0";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth2, 7)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth2);
+    }
+
+    char truth3[] = "F32 = 3.14";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth3, 10)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth3);
+    }
+
+    char truth4[] = "F64 = 6.28";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth4, 10)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth4);
+    }
+
+    char truth5[] = "STR = GNIRTS";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth5, 12)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth5);
+    }
+
     fclose(fd);
-
-    // Test G - Attempt to use null metadata with setIterator
-    printNegativeTestHeader(stdout,"psMetadata", "Test G - Attempt to use null metadata with setIterator",
-                            "Null metadata collection not allowed", 0);
-    if( psMetadataSetIterator(NULL, 0)) {
-        psError(PS_ERR_UNKNOWN,true,"Set iterator did not detect invalid parameter.");
-        return 101;
-    }
-    tmpList = metadata->list;
-    metadata->list = NULL;
-    if( psMetadataSetIterator(metadata,0)) {
-        psError(PS_ERR_UNKNOWN,true,"Set iterator did not detect null list.");
-        return 102;
-    }
-    metadata->list = tmpList;
-    printFooter(stdout, "psMetadata", "Test G - Attempt to use null metadata with setIterator", true);
-
-
-    // Test H - Attempt to use null metadata with getNext
-    printNegativeTestHeader(stdout,"psMetadata", "Test H - Attempt to use null metadata with getNext",
-                            "Null metadata collection not allowed", 0);
-    if( psMetadataGetNext(NULL, "myItem2", 0) != NULL ) {
-        psError(PS_ERR_UNKNOWN, true,"psMetadataGetNext did not return null for null metadata.");
-        return 40;
-    }
-    tmpList = metadata->list;
-    metadata->list = NULL;
-    if ( psMetadataGetNext(metadata, "myItem2", 0) != NULL ) {
-        psError(PS_ERR_UNKNOWN, true,"psMetadataGetNext did not return null for invalid metadata.");
-        return 41;
-    }
-    metadata->list = tmpList;
-
-    printFooter(stdout, "psMetadata", "Test H - Attempt to use null metadata with getNext", true);
-
-
-    // Test I - Attempt to use null metadata with getPrevious
-    printNegativeTestHeader(stdout,"psMetadata", "Test I - Attempt to use null metadata with getPrevious",
-                            "Null metadata collection not allowed", 0);
-    psMetadataGetPrevious(NULL, "myItem2", 0);
-    printFooter(stdout, "psMetadata", "Test I - Attempt to use null metadata with getPrevious", true);
-
-
+    printFooter(stdout, "psMetadata", "Test F - Write metadata item to file", true);
+    /*
+        // Test G - Attempt to use null metadata with setIterator
+        printNegativeTestHeader(stdout,"psMetadata", "Test G - Attempt to use null metadata with setIterator",
+                                "Null metadata collection not allowed", 0);
+        if( psMetadataSetIterator(NULL, 0)) {
+            psError(PS_ERR_UNKNOWN,true,"Set iterator did not detect invalid parameter.");
+            return 101;
+        }
+        tmpList = metadata->list;
+        metadata->list = NULL;
+        if( psMetadataSetIterator(metadata,0)) {
+            psError(PS_ERR_UNKNOWN,true,"Set iterator did not detect null list.");
+            return 102;
+        }
+        metadata->list = tmpList;
+        printFooter(stdout, "psMetadata", "Test G - Attempt to use null metadata with setIterator", true);
+     
+     
+        // Test H - Attempt to use null metadata with getNext
+        printNegativeTestHeader(stdout,"psMetadata", "Test H - Attempt to use null metadata with getNext",
+                                "Null metadata collection not allowed", 0);
+        if( psMetadataGetNext(NULL, "myItem2", 0) != NULL ) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetNext did not return null for null metadata.");
+            return 40;
+        }
+        tmpList = metadata->list;
+        metadata->list = NULL;
+        if ( psMetadataGetNext(metadata, "myItem2", 0) != NULL ) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetNext did not return null for invalid metadata.");
+            return 41;
+        }
+        metadata->list = tmpList;
+     
+        printFooter(stdout, "psMetadata", "Test H - Attempt to use null metadata with getNext", true);
+     
+     
+        // Test I - Attempt to use null metadata with getPrevious
+        printNegativeTestHeader(stdout,"psMetadata", "Test I - Attempt to use null metadata with getPrevious",
+                                "Null metadata collection not allowed", 0);
+        psMetadataGetPrevious(NULL, "myItem2", 0);
+        printFooter(stdout, "psMetadata", "Test I - Attempt to use null metadata with getPrevious", true);
+     
+    */
     // Test J - Attempt to use null file with itemPrint
     printNegativeTestHeader(stdout,"psMetadata", "Test J - Attempt to use null file with itemPrint",
Index: /trunk/psLib/test/collections/tst_psMetadata_06.c
===================================================================
--- /trunk/psLib/test/collections/tst_psMetadata_06.c	(revision 2606)
+++ /trunk/psLib/test/collections/tst_psMetadata_06.c	(revision 2607)
@@ -13,6 +13,6 @@
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.6 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-11-22 20:54:50 $
+*  @version $Revision: 1.7 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-12-03 23:19:07 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -24,36 +24,39 @@
 #include <string.h>
 
-static void printMetadataItem(psMetadataItem *item)
+static void printMetadataItem(psMetadataItem *metadataItem)
 {
-    printf("Key Name: %8s  ", item->name);
-    printf("Key Type: %2d  ", item->type);
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key pType: %2d  ", metadataItem->pType);
+    printf("Key mdType: %2d  ", metadataItem->type);
 
-    switch (item->type ) {
-    case PS_META_BOOL:
-        printf("Key Value: %15d  ", item->data.B);
+    switch (metadataItem->type) {
+    case PS_META_LIST:
+        printf("Key Value: %17c", ' ');
         break;
-    case PS_META_S32:
-        printf("Key Value: %15d  ", item->data.S32);
-        break;
-    case PS_META_F32:
-        printf("Key Value: %15.3f  ", item->data.F32);
-        break;
-    case PS_META_F64:
-        printf("Key Value: %15.3f  ", item->data.F64);
+    case PS_META_PRIMITIVE:
+        switch(metadataItem->pType) {
+        case PS_TYPE_BOOL:
+            printf("Key Value: %15d  ", metadataItem->data.B);
+            break;
+        case PS_TYPE_S32:
+            printf("Key Value: %15d  ", metadataItem->data.S32);
+            break;
+        case PS_TYPE_F32:
+            printf("Key Value: %15.3f  ", metadataItem->data.F32);
+            break;
+        case PS_TYPE_F64:
+            printf("Key Value: %15.3f  ", metadataItem->data.F64);
+            break;
+        default:
+            printf("Bad type: %d ", metadataItem->pType);
+        }
         break;
     case PS_META_STR:
-        printf("Key Value: %15s  ", (char*)item->data.V);
-        break;
-    case PS_META_IMG:
-    case PS_META_JPEG:
-    case PS_META_PNG:
-    case PS_META_ASTROM:
-    case PS_META_UNKNOWN:
-        printf("Value: unknown ");
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
         break;
     default:
-        printf("Bad type: %d ", item->type);
+        printf("Bad type: %d ", metadataItem->type);
     }
-    printf("Key Comment: %s\n", item->comment);
+    printf("Key Comment: %s\n", metadataItem->comment);
 }
 
@@ -71,9 +74,9 @@
     // Test A - Allocate metadata and items
     printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata and items");
-    item1a = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
-    item1b = psMetadataItemAlloc("myItem1", PS_META_S32, "I am a signed integer", 111);
-    item1c = psMetadataItemAlloc("myItem1", PS_META_S32, "I am a signed integer", 222);
-    item2a = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a signed integer", 333);
-    item2b = psMetadataItemAlloc("myItem2", PS_META_ITEM_SET, "I am a folder node", NULL);
+    item1a = psMetadataItemAlloc("myItem1", PS_TYPE_BOOL, PS_META_PRIMITIVE, "I am a boolean", true);
+    item1b = psMetadataItemAlloc("myItem1", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a signed integer", 111);
+    item1c = psMetadataItemAlloc("myItem1", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a signed integer", 222);
+    item2a = psMetadataItemAlloc("myItem2", PS_TYPE_S32, PS_META_PRIMITIVE, "I am a signed integer", 333);
+    item2b = psMetadataItemAlloc("myItem2", PS_TYPE_PTR, PS_META_LIST, "I am a folder node", NULL);
     metadata = psMetadataAlloc();
     printMetadataItem(item1a);
@@ -87,9 +90,9 @@
     // Test B - Add leaf node on top of existing leaf node
     printPositiveTestHeader(stdout, "psMetadata", "Test B - Add leaf node on top of existing leaf node");
-    if( ! psMetadataAddItem(metadata, item1a, PS_LIST_HEAD) ) {
+    if(!psMetadataAddItem(metadata, item1a, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
         return 20;
     }
-    if ( ! psMetadataAddItem(metadata, item1b, PS_LIST_HEAD) ) {
+    if (!psMetadataAddItem(metadata, item1b, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
         return 21;
@@ -101,5 +104,5 @@
     // Test C - Add leaf node to existing folder node
     printPositiveTestHeader(stdout, "psMetadata", "Test C - Add leaf node to existing folder node");
-    if ( ! psMetadataAddItem(metadata, item1c, PS_LIST_HEAD) ) {
+    if (!psMetadataAddItem(metadata, item1c, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem return false for adding a not to existing node.");
         return 22;
@@ -110,9 +113,9 @@
     // Test D - Add folder node on top of existing leaf node
     printPositiveTestHeader(stdout, "psMetadata", "Test D - Add folder node on top of existing leaf node");
-    if ( ! psMetadataAddItem(metadata, item2a, PS_LIST_HEAD) ) {
+    if (!psMetadataAddItem(metadata, item2a, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node to existing leaf node.");
         return 23;
     }
-    if ( ! psMetadataAddItem(metadata, item2b, PS_LIST_HEAD) ) {
+    if (!psMetadataAddItem(metadata, item2b, PS_LIST_HEAD)) {
         psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a nod to existing leaf node.");
         return 24;
