Index: trunk/psLib/src/astronomy/psMetadataIO.c
===================================================================
--- trunk/psLib/src/astronomy/psMetadataIO.c	(revision 2525)
+++ 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;
     }
 
