Index: /trunk/psLib/src/types/psMetadataConfig.c
===================================================================
--- /trunk/psLib/src/types/psMetadataConfig.c	(revision 9920)
+++ /trunk/psLib/src/types/psMetadataConfig.c	(revision 9921)
@@ -10,6 +10,6 @@
 *  @author Eric Van Alst, MHPCC
 *
-*  @version $Revision: 1.117 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2006-11-09 04:06:16 $
+*  @version $Revision: 1.118 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2006-11-09 04:51:54 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -93,5 +93,4 @@
     psArray*    templateArray;         ///< array of user type templates
     psMetadata* metadata;              ///< metadata container
-    char*       name;                  ///< name of key
 }
 p_psParseLevelInfo;
@@ -102,5 +101,4 @@
     psFree(info->typeArray);
     psFree(info->templateArray);
-    psFree(info->name);
     psFree(info->metadata);
 }
@@ -116,5 +114,4 @@
     info->templateArray = psArrayAllocEmpty(INITIAL_LENGTH);
     info->metadata = NULL;
-    info->name = NULL;
 
     return info;
@@ -1060,17 +1057,23 @@
         psFree(tempStr);
         break;
-    case PS_DATA_METADATA:
-        // Create next level info
-        nextLevelInfo = p_psParseLevelInfoAlloc();
-        // Create new metadata
-        nextLevelInfo->metadata = psMetadataAlloc();
-        // Save name of metadata
-        nextLevelInfo->name = psStringCopy(keyName);
-        // Add next level to levelArray
-        levelArray = psArrayAdd(levelArray,0,nextLevelInfo);
-        psFree(nextLevelInfo);
-        // Increment level counter
-        addStatus = true;
-        break;
+    case PS_DATA_METADATA: {
+            // create the nested metadata
+            psMetadata *newScope = psMetadataAlloc();
+
+            // Create next level info
+            nextLevelInfo = p_psParseLevelInfoAlloc();
+
+            // switch to the scope to the new metadata
+            nextLevelInfo->metadata = newScope;
+
+            // Add next level to levelArray
+            levelArray = psArrayAdd(levelArray, 0, nextLevelInfo);
+            psFree(nextLevelInfo);
+
+            addStatus = psMetadataAdd(md, PS_LIST_TAIL, keyName,
+                                      mdType | flags,
+                                      strComment, newScope);
+            break;
+        }
     default:
         psError(PS_ERR_IO, true,
@@ -1266,46 +1269,10 @@
     }
 
-    p_psParseLevelInfo *upperLevelInfo = ((p_psParseLevelInfo*)(levelArray->data[level - 1]));
-    p_psParseLevelInfo *lowerLevelInfo = ((p_psParseLevelInfo*)(levelArray->data[level]));
-
-    // Check name in nonunique list
-    for (psS32 k = 0; k < psArrayLength(upperLevelInfo->nonUniqueKeyArray); k++) {
-        if (strcmp(upperLevelInfo->nonUniqueKeyArray->data[k], lowerLevelInfo->name) == 0) {
-            flags = PS_META_DUPLICATE_OK;
-            break;
-        }
-    }
-
-    char *strValue = NULL;
-    psS32 status = 0;
-    strValue = getToken(&linePtr, "#", &status, true);
-    char *strComment = NULL;
-    // XXX why is there a ~ here?
-    strComment = getToken(&linePtr, "~", &status, true);
-
-    // Add metadata to upper level metadata
-    if (!psMetadataAdd(upperLevelInfo->metadata,
-                       PS_LIST_TAIL, lowerLevelInfo->name,
-                       PS_DATA_METADATA | flags,
-                       strComment, //"",
-                       lowerLevelInfo->metadata)) {
-        // This is pretty much a non-recoverable error - perhaps there
-        // should be a way of signalling non-recoverable parse errors
-        psError(PS_ERR_UNKNOWN, false, "failed to add metadata item");
-        psFree(strValue);
-        psFree(strComment);
-        return false;
-    }
-
     // the END just moved us up one nesting level
     // Remove lower info level
     if(!psArrayRemoveIndex(levelArray, level)) {
         psError(PS_ERR_UNKNOWN, false, "failed to remove array item");
-        psFree(strValue);
-        psFree(strComment);
-    }
-
-    psFree(strValue);
-    psFree(strComment);
+        return false;
+    }
 
     return true;
@@ -1576,23 +1543,25 @@
         psStringAppend(&content, " \n");
         break;
-    case PS_DATA_METADATA:
-        psStringAppend(&content, "\n%s  METADATA  ", item->name);
-        psString newStr = psMetadataConfigFormat(item->data.md);
-        // XXX need to check for NULL return value, implying error
-        //     from a lower level
-
-        // add 3 extra spaces to each metadata folder item
-        char *buffer2 = strtok(newStr, "\n");
-        while( buffer2 != NULL ) {
-            psStringAppend(&content, "\n   %s", buffer2);
-            buffer2 = strtok(NULL, "\n");
-        }
-        if ( strncmp(item->comment,"",2) ) {
-            psStringAppend(&content, "\nEND  # %s\n", item->comment);
-        } else {
+    case PS_DATA_METADATA: {
+            if (item->comment) {
+                psStringAppend(&content, "\n%s  METADATA  # %s", item->name, item->comment);
+            } else {
+                psStringAppend(&content, "\n%s  METADATA  ", item->name);
+            }
+
+            psString newStr = psMetadataConfigFormat(item->data.md);
+            if (newStr) {
+                // add 3 extra spaces to each metadata folder item
+                char *buf = strtok(newStr, "\n");
+                while (buf != NULL) {
+                    psStringAppend(&content, "\n   %s", buf);
+                    buf = strtok(NULL, "\n");
+                }
+                psFree(newStr);
+            }
+
             psStringAppend(&content, "\nEND\n");
-        }
-        psFree(newStr);
-        break;
+            break;
+        }
     case PS_DATA_TIME:
         psStringAppend(&content, "%-15s  ", item->name);
