Index: trunk/psLib/src/collections/psMetadata.c
===================================================================
--- trunk/psLib/src/collections/psMetadata.c	(revision 3298)
+++ trunk/psLib/src/collections/psMetadata.c	(revision 3341)
@@ -12,6 +12,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.52 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-02-18 22:17:20 $
+*  @version $Revision: 1.53 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-28 23:34:10 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -80,5 +80,5 @@
     psFree(metadataItem->name);
     psFree(metadataItem->comment);
-    if (type != PS_META_PRIMITIVE) {
+    if (! PS_META_IS_PRIMITIVE(type)) {
         psFree(metadataItem->data.V);
     }
@@ -98,5 +98,5 @@
 /*****************************************************************************/
 
-psMetadataItem* psMetadataItemAlloc(const char *name, psElemType pType, psMetadataType type,
+psMetadataItem* psMetadataItemAlloc(const char *name, psMetadataType type,
                                     const char *comment, ...)
 {
@@ -108,5 +108,5 @@
 
     // Call metadata item allocation
-    metadataItem = psMetadataItemAllocV(name, pType, type, comment, argPtr);
+    metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
 
     // Clean up stack after variable arguement has been used
@@ -116,5 +116,19 @@
 }
 
-psMetadataItem* psMetadataItemAllocV(const char *name, psElemType pType, psMetadataType type,
+#define METADATAITEM_ALLOC_TYPE(NAME,TYPE,METATYPE) \
+psMetadataItem* psMetadataItemAlloc##NAME(const char* name, \
+        const char* comment, \
+        TYPE value) \
+{ \
+    return psMetadataItemAlloc(name, METATYPE, comment, value); \
+}
+
+METADATAITEM_ALLOC_TYPE(Str,const char*,PS_META_STR)
+METADATAITEM_ALLOC_TYPE(F32,psF32,PS_META_F32)
+METADATAITEM_ALLOC_TYPE(F64,psF64,PS_META_F64)
+METADATAITEM_ALLOC_TYPE(S32,psS32,PS_META_S32)
+METADATAITEM_ALLOC_TYPE(Bool,psBool,PS_META_BOOL)
+
+psMetadataItem* psMetadataItemAllocV(const char *name, psMetadataType type,
                                      const char *comment, va_list argPtr)
 {
@@ -145,5 +159,4 @@
     // Set metadata item type
     metadataItem->type = type;
-    metadataItem->pType = pType;
 
     // Allocate and set metadata item name
@@ -153,23 +166,15 @@
     // Set metadata item value
     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;
-        }
+    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 = (psF64)va_arg(argPtr, psF64);
         break;
     case PS_META_STR:
@@ -186,5 +191,5 @@
     case PS_META_UNKNOWN:
         // Copy of input data not performed due to variability of data types
-        metadataItem->data.V = va_arg(argPtr, psPtr);
+        metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr));
         break;
     default:
@@ -256,5 +261,5 @@
 
             // Leaf node replaces another leaf. Make new folder node and add leaves.
-            newFolderEntry = psMetadataItemAlloc(key, PS_TYPE_PTR, PS_META_LIST, NULL, NULL);
+            newFolderEntry = psMetadataItemAlloc(key, PS_META_LIST, NULL, NULL);
             newFolderEntry->data.list = psListAlloc(NULL);
 
@@ -328,5 +333,5 @@
 }
 
-psBool psMetadataAdd(psMetadata *md, psS32 where, const char *name, psElemType pType,
+psBool psMetadataAdd(psMetadata *md, psS32 where, const char *name,
                      psMetadataType type, const char *comment, ...)
 {
@@ -335,5 +340,5 @@
 
     va_start(argPtr, comment);
-    metadataItem = psMetadataItemAllocV(name, pType, type, comment, argPtr);
+    metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
     va_end(argPtr);
 
@@ -348,4 +353,21 @@
     return true;
 }
+
+#define METADATA_ADD_TYPE(NAME,TYPE,METATYPE) \
+psBool psMetadataAdd##NAME(psMetadata* md, psS32 where, const char* name, \
+                           const char* comment, TYPE value) { \
+    return psMetadataAdd(md,where,name, METATYPE,comment,value); \
+}
+
+METADATA_ADD_TYPE(S32,psS32,PS_META_S32)
+METADATA_ADD_TYPE(F32,psF32,PS_META_F32)
+METADATA_ADD_TYPE(F64,psF64,PS_META_F64)
+METADATA_ADD_TYPE(List,psList*,PS_META_LIST)
+METADATA_ADD_TYPE(Str,const char*,PS_META_STR)
+METADATA_ADD_TYPE(Vector,psVector*,PS_META_VEC)
+METADATA_ADD_TYPE(Image,psImage*,PS_META_IMG)
+METADATA_ADD_TYPE(Hash,psHash*,PS_META_HASH)
+METADATA_ADD_TYPE(LookupTable,psLookupTable*,PS_META_LOOKUPTABLE)
+METADATA_ADD_TYPE(Unknown,void*,PS_META_UNKNOWN)
 
 psBool psMetadataRemove(psMetadata *md, psS32 where, const char *key)
@@ -435,12 +457,11 @@
     }
 
-    if(metadataItem->type == PS_META_PRIMITIVE && metadataItem->pType != PS_TYPE_PTR) {
+    if(PS_META_IS_PRIMITIVE(metadataItem->type)) {
         if (status) {
             *status = false;
         }
         psError(PS_ERR_BAD_PARAMETER_VALUE, true,
-                PS_ERRORTEXT_psMetadata_METATYPE_MISMATCH,
-                metadataItem->pType,
-                PS_TYPE_PTR);
+                PS_ERRORTEXT_psMetadata_METATYPE_INVALID,
+                metadataItem->type);
         return NULL;
     } else {
@@ -467,31 +488,25 @@
     } \
     \
-    if (metadataItem->type == PS_META_PRIMITIVE) { \
-        switch (metadataItem->pType) { \
-        case PS_TYPE_S32: \
-            value = (ps##TYPE)metadataItem->data.S32; \
-            break; \
-        case PS_TYPE_F32: \
-            value = (ps##TYPE)metadataItem->data.F32; \
-            break; \
-        case PS_TYPE_F64: \
-            value = (ps##TYPE)metadataItem->data.F64; \
-            break; \
-        case PS_TYPE_BOOL: \
-            if (metadataItem->data.B) { \
-                value = 1; \
-            } \
-            break; \
-        default: \
-            /* if you get to this point, the value is not a number. */ \
-            if (status) { \
-                *status = false; \
-            } \
-            break; \
+    switch (metadataItem->type) { \
+    case PS_META_S32: \
+        value = (ps##TYPE)metadataItem->data.S32; \
+        break; \
+    case PS_META_F32: \
+        value = (ps##TYPE)metadataItem->data.F32; \
+        break; \
+    case PS_META_F64: \
+        value = (ps##TYPE)metadataItem->data.F64; \
+        break; \
+    case PS_META_BOOL: \
+        if (metadataItem->data.B) { \
+            value = 1; \
         } \
-    } else { \
+        break; \
+    default: \
+        /* if you get to this point, the value is not a number. */ \
         if (status) { \
             *status = false; \
         } \
+        break; \
     } \
     \
Index: trunk/psLib/src/collections/psMetadata.h
===================================================================
--- trunk/psLib/src/collections/psMetadata.h	(revision 3298)
+++ trunk/psLib/src/collections/psMetadata.h	(revision 3341)
@@ -11,6 +11,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.37 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-02-17 19:26:23 $
+*  @version $Revision: 1.38 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-28 23:34:10 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -24,4 +24,6 @@
 #include "psHash.h"
 #include "psList.h"
+#include "psImage.h"
+#include "psLookupTable.h"
 
 /// @addtogroup Metadata
@@ -33,5 +35,8 @@
  */
 typedef enum {
-    PS_META_PRIMITIVE,                 ///< Primitive data.
+    PS_META_S32,                       ///< Primitive data.
+    PS_META_F32,                       ///< Primitive data.
+    PS_META_F64,                       ///< Primitive data.
+    PS_META_BOOL,                       ///< Primitive data.
     PS_META_LIST,                      ///< List data (Stored as item.data.list).
     PS_META_STR,                       ///< String data (Stored as item.data.V).
@@ -47,4 +52,16 @@
 } psMetadataType;
 
+#define PS_META_IS_PRIMITIVE(TYPE) \
+(TYPE == PS_META_S32 || \
+ TYPE == PS_META_F32 || \
+ TYPE == PS_META_F64 || \
+ TYPE == PS_META_BOOL)
+
+#define PS_META_PRIMITIVE_TYPE(METATYPE) ( \
+        (METATYPE==PS_META_S32) ? PS_TYPE_S32 : \
+        (METATYPE==PS_META_F32) ? PS_TYPE_F32 : \
+        (METATYPE==PS_META_F64) ? PS_TYPE_F64 : \
+        (METATYPE==PS_META_BOOL) ? PS_TYPE_BOOL : PS_TYPE_PTR )
+
 /** Option flags for psMetadata functions
  *
@@ -55,5 +72,5 @@
 typedef enum {
     PS_META_DEFAULT = 0,               ///< default behaviour (duplicate entry is an error)
-    PS_META_REPLACE                    ///< allow entry to be replaced
+    PS_META_REPLACE = 0x10000          ///< allow entry to be replaced
 } psMetadataFlags;
 
@@ -82,5 +99,4 @@
     char *name;                        ///< Name of metadata item.
     psMetadataType type;               ///< Type of metadata item.
-    psElemType pType;                  ///< Primitive data type
     union {
         psBool B;                      ///< boolean data
@@ -113,8 +129,37 @@
 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.
     ...                                ///< Arguments for name formatting and metadata item data.
+);
+
+psMetadataItem* psMetadataItemAllocStr(
+    const char* name,
+    const char* comment,
+    const char* value
+);
+
+psMetadataItem* psMetadataItemAllocF32(
+    const char* name,
+    const char* comment,
+    psF32 value
+);
+
+psMetadataItem* psMetadataItemAllocF64(
+    const char* name,
+    const char* comment,
+    psF64 value
+);
+
+psMetadataItem* psMetadataItemAllocS32(
+    const char* name,
+    const char* comment,
+    psS32 value
+);
+
+psMetadataItem* psMetadataItemAllocBool(
+    const char* name,
+    const char* comment,
+    psBool value
 );
 
@@ -137,5 +182,4 @@
 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.
@@ -161,7 +205,7 @@
  */
 psBool psMetadataAddItem(
-    psMetadata*  md,          ///< Metadata collection to insert metadat item.
-    psMetadataItem*  item,    ///< Metadata item to be added.
-    psS32 location            ///< Location to be added.
+    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
+    psMetadataItem*  item,             ///< Metadata item to be added.
+    psS32 location                     ///< Location to be added.
 );
 
@@ -173,12 +217,33 @@
  */
 psBool psMetadataAdd(
-    psMetadata* md,           ///< Metadata collection to insert metadat item.
-    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.
-    ...                       ///< Arguments for name formatting and metadata item data.
-);
+    psMetadata* md,                    ///< Metadata collection to insert metadat item.
+    psS32 where,                       ///< Location to be added.
+    const char *name,                  ///< Name of metadata item.
+    psMetadataType type,               ///< Type of metadata item.
+    const char *comment,               ///< Comment for metadata item.
+    ...                                ///< Arguments for name formatting and metadata item data.
+);
+
+psBool psMetadataAddS32(psMetadata* md, psS32 where, const char* name,
+                        const char* comment, psS32 value);
+psBool psMetadataAddF32(psMetadata* md, psS32 where, const char* name,
+                        const char* comment, psF32 value);
+psBool psMetadataAddF64(psMetadata* md, psS32 where, const char* name,
+                        const char* comment, psF64 value);
+psBool psMetadataAddList(psMetadata* md, psS32 where, const char* name,
+                         const char* comment, psList* value);
+psBool psMetadataAddStr(psMetadata* md, psS32 where, const char* name,
+                        const char* comment, const char* value);
+psBool psMetadataAddVector(psMetadata* md, psS32 where, const char* name,
+                           const char* comment, psVector* value);
+psBool psMetadataAddImage(psMetadata* md, psS32 where, const char* name,
+                          const char* comment, psImage* value);
+psBool psMetadataAddHash(psMetadata* md, psS32 where, const char* name,
+                         const char* comment, psHash* value);
+psBool psMetadataAddLookupTable(psMetadata* md, psS32 where, const char* name,
+                                const char* comment, psLookupTable* value);
+psBool psMetadataAddUnknown(psMetadata* md, psS32 where, const char* name,
+                            const char* comment, psPtr value);
+
 
 /** Remove an item from metadata collection.
Index: trunk/psLib/src/collections/psMetadataIO.c
===================================================================
--- trunk/psLib/src/collections/psMetadataIO.c	(revision 3298)
+++ trunk/psLib/src/collections/psMetadataIO.c	(revision 3341)
@@ -9,6 +9,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.20 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-02-17 19:26:23 $
+*  @version $Revision: 1.21 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-28 23:34:10 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -101,8 +101,8 @@
 /*****************************************************************************/
 
-static void p_saxEndElement(void *ctx, const xmlChar *tagName);
-static void p_psInitVectorXml(void *ctx, char *tagName);
-static void p_psInitMetadataItemXml(void *ctx, char *tagName);
-static void p_saxStartElement(void *ctx, const xmlChar *tagName, const xmlChar **atts);
+static void saxEndElement(void *ctx, const xmlChar *tagName);
+static void initVectorXml(void *ctx, char *tagName);
+static void initMetadataItemXml(void *ctx, char *tagName);
+static void saxStartElement(void *ctx, const xmlChar *tagName, const xmlChar **atts);
 
 /** Determines if a line is blank (whitespace only) or a commentline. It returns true if so. The input string
@@ -307,5 +307,4 @@
 {
     psMetadataType type;
-    psElemType pType;
     psBool success = true;
 
@@ -315,25 +314,17 @@
 
     type = metadataItem->type;
-    pType = metadataItem->pType;
 
     switch(type) {
-    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);
-            success = false;
-        }
+    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);
         break;
     case PS_META_STR:
@@ -419,19 +410,19 @@
         switch (keyType) {
         case 'I':
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_TYPE_S32, PS_META_PRIMITIVE,
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_S32,
                                     keyComment, atoi(keyValue));
             break;
         case 'F':
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_TYPE_F64, PS_META_PRIMITIVE,
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_F64,
                                     keyComment, atof(keyValue));
             break;
         case 'C':
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_TYPE_PTR, PS_META_STR, keyComment,
-                                    keyValue);
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_STR,
+                                    keyComment, keyValue);
             break;
         case 'L':
             tempBool = (keyValue[0] == 'T') ? 1 : 0;
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_TYPE_BOOL, PS_META_PRIMITIVE, keyComment,
-                                    tempBool);
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_BOOL,
+                                    keyComment, tempBool);
             break;
         case 'U':
@@ -460,4 +451,5 @@
     char *strComment = NULL;
     char *linePtr = NULL;
+    psElemType vecType = PS_TYPE_PTR;
     psS32 status = 0;
     psU32 lineCount = 0;
@@ -467,5 +459,4 @@
     psVector *tempVec = NULL;
     FILE *fp = NULL;
-    psElemType pType;
     psMetadataType mdType;
 
@@ -535,20 +526,14 @@
             } else if(!strncmp(strType, "*", 1)) {
                 mdType = PS_META_LIST;
-                pType = PS_TYPE_PTR;
             } else if(!strncmp(strType, "STR", 3)) {
                 mdType = PS_META_STR;
-                pType = PS_TYPE_PTR;
-            } else if(!strncmp(strType, "BOOL", 3)) {
-                mdType = PS_META_PRIMITIVE;
-                pType = PS_TYPE_BOOL;
+            } else if(!strncmp(strType, "BOOL", 4)) {
+                mdType = PS_META_BOOL;
             } else if(!strncmp(strType, "S32", 3)) {
-                mdType = PS_META_PRIMITIVE;
-                pType = PS_TYPE_S32;
+                mdType = PS_META_S32;
             } else if(!strncmp(strType, "F32", 3)) {
-                mdType = PS_META_PRIMITIVE;
-                pType = PS_TYPE_F32;
+                mdType = PS_META_F32;
             } else if(!strncmp(strType, "F64", 3)) {
-                mdType = PS_META_PRIMITIVE;
-                pType = PS_TYPE_F64;
+                mdType = PS_META_F64;
             } else {
                 (*nFail)++;
@@ -559,4 +544,5 @@
 
             if(*strName == '@') {
+                vecType = PS_META_PRIMITIVE_TYPE(mdType);
                 mdType = PS_META_VEC;
             }
@@ -604,13 +590,26 @@
             switch (mdType) {
             case PS_META_LIST:
-                psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, NULL, NULL);
+                psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, NULL);
                 break;
             case PS_META_STR:
-                psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, strComment, strValue);
+                psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, strValue);
                 break;
             case PS_META_VEC:
-                tempVec = parseVector(strValue, pType, &status);
+                tempVec = parseVector(strValue, vecType, &status);
                 if(!status) {
-                    psMetadataAdd(md, PS_LIST_TAIL, strName+1, pType, mdType, strComment, tempVec);
+                    psMetadataAdd(md, PS_LIST_TAIL, strName+1, mdType, strComment, tempVec);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
+                    continue;
+                }
+                psFree(tempVec);
+                break;
+            case PS_META_BOOL:
+                tempBool = parseBool(strValue, &status);
+                if(!status) {
+                    psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, tempBool);
                 } else {
                     status = 0;
@@ -621,50 +620,29 @@
                 }
                 break;
-            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:
+            case PS_META_S32:
+                tempInt = (psS32)parseValue(strValue, &status);
+                if(!status) {
+                    psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, tempInt);
+                } else {
+                    status = 0;
                     (*nFail)++;
-                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, mdType, lineCount,
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, 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;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true,
+                            PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType, lineCount,
                             fileName);
                     continue;
-                } // switch
+                }
                 break;
             default:
@@ -682,5 +660,5 @@
 }
 
-static void p_saxStartElement(void *ctx, const xmlChar *tagName, const xmlChar **atts)
+static void saxStartElement(void *ctx, const xmlChar *tagName, const xmlChar **atts)
 {
     psU64 i = 0;
@@ -709,4 +687,5 @@
     // Metadata containter for housing element attributes used by other SAX events
     htAtts = psHashAlloc(10);
+
 
     // Get tag name
@@ -745,12 +724,14 @@
 
     // Add attributes to metadata
-    psMetadataAdd(md, PS_LIST_TAIL, "htAtts", PS_TYPE_PTR, PS_META_HASH, NULL, htAtts);
+
+    psMetadataAdd(md, PS_LIST_TAIL, "htAtts", PS_META_HASH, NULL, htAtts);
 
     psFree(psTagName);
+    psFree(htAtts);
 
     return;
 }
 
-static void p_psInitMetadataItemXml(void *ctx, char *tagName)
+static void initMetadataItemXml(void *ctx, char *tagName)
 {
     psBool overwrite = false;
@@ -760,6 +741,5 @@
     psF64 tempDbl = 0.0;
     psS32 tempInt = 0.0;
-    psElemType pType = PS_TYPE_PTR;
-    psMetadataType mdType = PS_META_PRIMITIVE;
+    psMetadataType mdType = PS_META_UNKNOWN;
     char *fileName = NULL;
     char *strName = NULL;
@@ -802,17 +782,12 @@
         if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psString")) {
             mdType = PS_META_STR;
-            pType = PS_TYPE_PTR;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
-            mdType = PS_META_PRIMITIVE;
-            pType = PS_TYPE_U8;
+            mdType = PS_META_BOOL;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psS32")) {
-            mdType = PS_META_PRIMITIVE;
-            pType = PS_TYPE_S32;
+            mdType = PS_META_S32;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF32")) {
-            mdType = PS_META_PRIMITIVE;
-            pType = PS_TYPE_F32;
+            mdType = PS_META_F32;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF64")) {
-            mdType = PS_META_PRIMITIVE;
-            pType = PS_TYPE_F64;
+            mdType = PS_META_F64;
         } else {
             psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE, strType, lineNumber,
@@ -853,45 +828,39 @@
     switch(mdType) {
     case PS_META_LIST:
-        psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, NULL, NULL);
+        psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, NULL);
         break;
     case PS_META_STR:
-        psMetadataAdd(md, PS_LIST_TAIL, strName, pType, mdType, NULL, strValue);
+        psMetadataAdd(md, PS_LIST_TAIL, strName, 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
+    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);
+        }
         break;
     default:
@@ -899,10 +868,9 @@
     } // End switch
 
-
     return;
 }
 
 
-static void p_psInitVectorXml(void *ctx, char *tagName)
+static void initVectorXml(void *ctx, char *tagName)
 {
     bool overwrite = false;
@@ -910,5 +878,4 @@
     psU32 lineNumber = 0;
     psElemType pType = PS_TYPE_PTR;
-    psMetadataType mdType = PS_META_PRIMITIVE;
     char *strName = NULL;
     char *strType = NULL;
@@ -952,18 +919,11 @@
     strType = psHashLookup(htAtts, "psType");
     if(strType!= NULL) {
-        if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psString")) {
-            mdType = PS_META_STR;
-            pType = PS_TYPE_PTR;
-        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
-            mdType = PS_META_PRIMITIVE;
+        if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
             pType = PS_TYPE_U8;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psS32")) {
-            mdType = PS_META_PRIMITIVE;
             pType = PS_TYPE_S32;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF32")) {
-            mdType = PS_META_PRIMITIVE;
             pType = PS_TYPE_F32;
         } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF64")) {
-            mdType = PS_META_PRIMITIVE;
             pType = PS_TYPE_F64;
         } else {
@@ -1006,5 +966,5 @@
     vec = parseVector((char*)strValue, pType, &status);
     if(!status) {
-        psMetadataAdd(md, PS_LIST_TAIL, strName+1, pType, mdType, NULL, vec);
+        psMetadataAdd(md, PS_LIST_TAIL, strName+1, PS_META_VEC, NULL, vec);
     } else {
         psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
@@ -1014,5 +974,5 @@
 }
 
-static void p_saxEndElement(void *ctx, const xmlChar *tagName)
+static void saxEndElement(void *ctx, const xmlChar *tagName)
 {
     char *psStartTagName = NULL;
@@ -1052,7 +1012,7 @@
     // Initialize psLib structs
     if(!strcmp(psEndTagName, "psMetadataItem")) {
-        p_psInitMetadataItemXml(ctx, psEndTagName);
+        initMetadataItemXml(ctx, psEndTagName);
     } else if(!strcmp(psEndTagName, "psVector")) {
-        p_psInitVectorXml(ctx, psEndTagName);
+        initVectorXml(ctx, psEndTagName);
     } else if(strcmp(psEndTagName, "psRoot")) {
         psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TAG_UNKNOWN, psEndTagName);
@@ -1095,6 +1055,6 @@
     saxHandler.startDocument            = NULL;
     saxHandler.endDocument              = NULL;
-    saxHandler.startElement             = p_saxStartElement;
-    saxHandler.endElement               = p_saxEndElement;
+    saxHandler.startElement             = saxStartElement;
+    saxHandler.endElement               = saxEndElement;
     saxHandler.reference                = NULL;
     saxHandler.characters               = NULL;
