Index: trunk/psLib/src/collections/psMetadataIO.c
===================================================================
--- trunk/psLib/src/collections/psMetadataIO.c	(revision 3341)
+++ trunk/psLib/src/collections/psMetadataIO.c	(revision 3381)
@@ -9,6 +9,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.21 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-02-28 23:34:10 $
+*  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-03-07 20:58:50 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -410,18 +410,22 @@
         switch (keyType) {
         case 'I':
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_S32,
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_S32 | PS_META_DUPLICATE_OK,
                                     keyComment, atoi(keyValue));
             break;
         case 'F':
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_F64,
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_F64 | PS_META_DUPLICATE_OK,
                                     keyComment, atof(keyValue));
             break;
         case 'C':
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_STR,
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_STR | PS_META_DUPLICATE_OK,
                                     keyComment, keyValue);
             break;
         case 'L':
             tempBool = (keyValue[0] == 'T') ? 1 : 0;
-            success = psMetadataAdd(output, PS_LIST_TAIL, keyName, PS_META_BOOL,
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_BOOL | PS_META_DUPLICATE_OK,
                                     keyComment, tempBool);
             break;
@@ -456,9 +460,9 @@
     psF64 tempDbl = 0.0;
     psS32 tempInt = 0.0;
-    psMetadataItem *metadataItem = NULL;
     psVector *tempVec = NULL;
     FILE *fp = NULL;
     psMetadataType mdType;
-
+    psMetadataFlags flags;
+    psBool addStatus;
 
     // Check for nulls
@@ -516,4 +520,6 @@
             }
 
+            flags = (overwrite) ? PS_META_REPLACE : PS_META_DEFAULT;
+
             // Get the metadata item type
             strType = getToken(&linePtr, " ", &status);
@@ -524,21 +530,27 @@
                         fileName);
                 continue;
-            } else if(!strncmp(strType, "*", 1)) {
-                mdType = PS_META_LIST;
-            } else if(!strncmp(strType, "STR", 3)) {
-                mdType = PS_META_STR;
-            } else if(!strncmp(strType, "BOOL", 4)) {
-                mdType = PS_META_BOOL;
-            } else if(!strncmp(strType, "S32", 3)) {
-                mdType = PS_META_S32;
-            } else if(!strncmp(strType, "F32", 3)) {
-                mdType = PS_META_F32;
-            } else if(!strncmp(strType, "F64", 3)) {
-                mdType = PS_META_F64;
             } else {
-                (*nFail)++;
-                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineCount,
-                        fileName);
-                continue;
+                char* tempStrType = strType;
+                if(*strType == '*') {
+                    flags = PS_META_DUPLICATE_OK;
+                    tempStrType = strType+1;
+                }
+
+                if(!strncmp(tempStrType, "STR", 3)) {
+                    mdType = PS_META_STR;
+                } else if(!strncmp(tempStrType, "BOOL", 4)) {
+                    mdType = PS_META_BOOL;
+                } else if(!strncmp(tempStrType, "S32", 3)) {
+                    mdType = PS_META_S32;
+                } else if(!strncmp(tempStrType, "F32", 3)) {
+                    mdType = PS_META_F32;
+                } else if(!strncmp(tempStrType, "F64", 3)) {
+                    mdType = PS_META_F64;
+                } else {
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineCount,
+                            fileName);
+                    continue;
+                }
             }
 
@@ -548,17 +560,22 @@
             }
 
-            // Get the metadata item value if there is one. Lines with * don't have values.
-            if(mdType != PS_META_LIST) {
-                strValue = getToken(&linePtr, "#", &status);
-                if(strValue==NULL) {
-                    (*nFail)++;
-                    status = 0;
-                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "value", lineCount,
-                            fileName);
-                    continue;
-                }
-            }
-
-            // Get the metadata item value if there is one. Not all lines will have comments, so NULL is ok.
+            // Get the metadata item value if there is one.
+            strValue = getToken(&linePtr, "#", &status);
+            if(status) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "comment", lineCount,
+                        fileName);
+                continue;
+            }
+            if(strValue==NULL) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "value", lineCount,
+                        fileName);
+                continue;
+            }
+
+            // Not all lines will have comments, so NULL is ok.
             strComment = getToken(&linePtr,"~", &status);
             if(status) {
@@ -570,33 +587,17 @@
             }
 
-            /* If metadata item is found, is not a folder node, and overwrite is allowed, then remove existing
-            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);
-            if(metadataItem != NULL) {
-                if(metadataItem->type!=PS_META_LIST) {
-                    if(overwrite) {
-                        psMetadataRemove(md, INT_MIN, strName);
-                    } else {
-                        (*nFail)++;
-                        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineCount,
-                                fileName);
-                        continue;
-                    }
-                }
-            }
-
             // Create and add metadata item to metadata and parse values
             switch (mdType) {
-            case PS_META_LIST:
-                psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, NULL);
-                break;
             case PS_META_STR:
-                psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, strValue);
+                addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                          mdType | flags,
+                                          strComment, strValue);
                 break;
             case PS_META_VEC:
                 tempVec = parseVector(strValue, vecType, &status);
                 if(!status) {
-                    psMetadataAdd(md, PS_LIST_TAIL, strName+1, mdType, strComment, tempVec);
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName+1,
+                                              mdType | flags,
+                                              strComment, tempVec);
                 } else {
                     status = 0;
@@ -611,5 +612,7 @@
                 tempBool = parseBool(strValue, &status);
                 if(!status) {
-                    psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, tempBool);
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempBool);
                 } else {
                     status = 0;
@@ -623,5 +626,7 @@
                 tempInt = (psS32)parseValue(strValue, &status);
                 if(!status) {
-                    psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, tempInt);
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempInt);
                 } else {
                     status = 0;
@@ -636,5 +641,7 @@
                 tempDbl = parseValue(strValue, &status);
                 if(!status) {
-                    psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, strComment, tempDbl);
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempDbl);
                 } else {
                     status = 0;
@@ -652,4 +659,10 @@
                 continue;
             } // switch
+            if (! addStatus) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineCount,
+                        fileName);
+            }
+
         } // if ignoreLine
     } // while loop
@@ -725,5 +738,7 @@
     // Add attributes to metadata
 
-    psMetadataAdd(md, PS_LIST_TAIL, "htAtts", PS_META_HASH, NULL, htAtts);
+    psMetadataAdd(md, PS_LIST_TAIL, "htAtts",
+                  PS_META_HASH | PS_META_DUPLICATE_OK,
+                  NULL, htAtts);
 
     psFree(psTagName);
@@ -828,13 +843,19 @@
     switch(mdType) {
     case PS_META_LIST:
-        psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, NULL);
+        psMetadataAdd(md, PS_LIST_TAIL, strName,
+                      mdType | PS_META_DUPLICATE_OK,
+                      NULL, NULL);
         break;
     case PS_META_STR:
-        psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, strValue);
+        psMetadataAdd(md, PS_LIST_TAIL, strName,
+                      mdType | PS_META_DUPLICATE_OK,
+                      NULL, strValue);
         break;
     case PS_META_BOOL:
         tempBool = parseBool((char*)strValue, &status);
         if(!status) {
-            psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, tempBool);
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempBool);
         } else {
             status = 0;
@@ -846,5 +867,7 @@
         tempInt = (psS32)parseValue((char*)strValue, &status);
         if(!status) {
-            psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, tempInt);
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempInt);
         } else {
             status = 0;
@@ -857,5 +880,7 @@
         tempDbl = parseValue((char*)strValue, &status);
         if(!status) {
-            psMetadataAdd(md, PS_LIST_TAIL, strName, mdType, NULL, tempDbl);
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempDbl);
         } else {
             status = 0;
@@ -966,5 +991,7 @@
     vec = parseVector((char*)strValue, pType, &status);
     if(!status) {
-        psMetadataAdd(md, PS_LIST_TAIL, strName+1, PS_META_VEC, NULL, vec);
+        psMetadataAdd(md, PS_LIST_TAIL, strName+1,
+                      PS_META_VEC | PS_META_DUPLICATE_OK,
+                      NULL, vec);
     } else {
         psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
