Index: /trunk/psLib/src/types/psMetadata.c
===================================================================
--- /trunk/psLib/src/types/psMetadata.c	(revision 4869)
+++ /trunk/psLib/src/types/psMetadata.c	(revision 4870)
@@ -12,6 +12,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.76 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-08-18 23:41:45 $
+*  @version $Revision: 1.77 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-08-24 22:00:53 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -427,7 +427,7 @@
 METADATA_ADD_TYPE(Array,psArray*,PS_META_ARRAY)
 
-psBool psMetadataRemove(psMetadata *md,
-                        long where,
-                        const char *key)
+bool psMetadataRemove(psMetadata *md,
+                      long where,
+                      const char *key)
 {
     PS_ASSERT_PTR_NON_NULL(md,NULL);
Index: /trunk/psLib/src/types/psMetadataConfig.c
===================================================================
--- /trunk/psLib/src/types/psMetadataConfig.c	(revision 4869)
+++ /trunk/psLib/src/types/psMetadataConfig.c	(revision 4870)
@@ -10,6 +10,6 @@
 *  @author Eric Van Alst, MHPCC
 *
-*  @version $Revision: 1.37 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-07-21 01:40:10 $
+*  @version $Revision: 1.38 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-08-24 22:00:53 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -58,4 +58,5 @@
 /** Maximum size of a string */
 #define MAX_STRING_LENGTH 256
+#define MAXSTR 256
 
 
@@ -1161,2 +1162,210 @@
 }
 
+psString psMetadataConfigFormat(psMetadata *md)
+{
+    PS_ASSERT_PTR_NON_NULL(md, NULL);
+
+    psString newString = NULL;
+    psString newStr = NULL;
+    char mdString[2048];
+    psMetadataItem *item = NULL;
+    psMetadataIterator *iter = psMetadataIteratorAlloc(md, PS_LIST_HEAD, NULL);
+    psDataType type = PS_DATA_UNKNOWN;
+    //    int size = 0;
+    int i = 0;
+    char content[MAXSTR];
+    char buffer[MAXSTR];
+    char *buffer2;
+    strcpy(content, "\0");
+    strcpy(mdString, "\0");
+
+    while ( (item = psMetadataGetAndIncrement(iter)) ) {
+        type = item->type;
+        if ( type == 65537)
+            type = PS_DATA_STRING;
+        if ( type == 65538)
+            type = PS_DATA_VECTOR;
+        if ( type == 65547)
+            type = PS_DATA_METADATA;
+
+        switch (type) {
+        case PS_DATA_BOOL:
+            //            size = strlen(item->name);
+            snprintf(content, MAXSTR, "%s BOOL  ", item->name);
+            strncat(mdString, content, MAXSTR);
+            if ( item->data.B )
+                strncat(mdString, "TRUE", MAXSTR);
+            else
+                strncat(mdString, "FALSE", MAXSTR);
+            if ( item->comment != NULL ) {
+                //                size = strlen(item->comment);
+                snprintf(content, MAXSTR, " #%s \n", item->comment);
+                strncat(mdString, content, MAXSTR);
+            } else {
+                snprintf(content, MAXSTR, "\n");
+                strncat(mdString, content, MAXSTR);
+            }
+            break;
+        case PS_DATA_S32:
+            //            size = strlen(item->name);
+            snprintf(content, MAXSTR, "%s S32  ", item->name);
+            strncat(mdString, content, MAXSTR);
+            snprintf(content, MAXSTR, "%d ", item->data.S32);
+            strncat(mdString, content, MAXSTR);
+            if ( item->comment != NULL ) {
+                //                size = strlen(item->comment);
+                snprintf(content, MAXSTR, " #%s \n", item->comment);
+                strncat(mdString, content, MAXSTR);
+            } else {
+                snprintf(content, MAXSTR, "\n");
+                strncat(mdString, content, MAXSTR);
+            }
+            break;
+        case PS_DATA_F32:
+            //            size = strlen(item->name);
+            snprintf(content, MAXSTR, "%s F32  ", item->name);
+            strncat(mdString, content, MAXSTR);
+            snprintf(content, MAXSTR, "%f ", item->data.F32);
+            strncat(mdString, content, MAXSTR);
+            if ( item->comment != NULL ) {
+                //                size = strlen(item->comment);
+                snprintf(content, MAXSTR, " #%s \n", item->comment);
+                strncat(mdString, content, MAXSTR);
+            } else {
+                snprintf(content, MAXSTR, "\n");
+                strncat(mdString, content, MAXSTR);
+            }
+            break;
+        case PS_DATA_F64:
+            //            size = strlen(item->name);
+            snprintf(content, MAXSTR, "%s F64  ", item->name);
+            strncat(mdString, content, MAXSTR);
+            snprintf(content, MAXSTR, "%f ", item->data.F64);
+            strncat(mdString, content, MAXSTR);
+            if ( item->comment != NULL ) {
+                //                size = strlen(item->comment);
+                snprintf(content, MAXSTR, " #%s \n", item->comment);
+                strncat(mdString, content, MAXSTR);
+            } else {
+                snprintf(content, MAXSTR, "\n");
+                strncat(mdString, content, MAXSTR);
+            }
+            break;
+        case PS_DATA_STRING:
+            //            size = strlen(item->name);
+            snprintf(content, MAXSTR, "%s STR  ", item->name);
+            strncat(mdString, content, MAXSTR);
+            //            size = strlen(((char *)(item->data.V)));
+            snprintf(content, MAXSTR, "%s ", ((char *)(item->data.V)));
+            strncat(mdString, content, MAXSTR);
+            if ( item->comment != NULL ) {
+                //                size = strlen(item->comment);
+                snprintf(content, MAXSTR, " #%s \n", item->comment);
+                strncat(mdString, content, MAXSTR);
+            } else {
+                snprintf(content, MAXSTR, "\n");
+                strncat(mdString, content, MAXSTR);
+            }
+            break;
+        case PS_DATA_METADATA:
+            snprintf(content, MAXSTR, "\n%s  METADATA  ", item->name);
+            strncat(mdString, content, MAXSTR);
+
+            newStr = psMetadataConfigFormat(item->data.md);
+            strncpy(buffer, (char *)newStr, MAXSTR);
+            buffer2 = strtok(buffer, "\n");
+            while( buffer2 != NULL ) {
+                snprintf(content, MAXSTR, "\n   %s", buffer2);
+                strncat(mdString, content, MAXSTR);
+                buffer2 = strtok(NULL, "\n");
+            }
+            if ( item->comment != NULL ) {
+                snprintf(content, MAXSTR, "\nEND   #%s\n\n", item->comment);
+                strncat(mdString, content, MAXSTR);
+            } else {
+                snprintf(content, MAXSTR, "\nEND\n\n");
+                strncat(mdString, content, MAXSTR);
+            }
+            psFree(newStr);
+            break;
+        case PS_DATA_VECTOR:
+            //            size = strlen(item->name);
+            snprintf(content, MAXSTR, "@%s ", item->name);
+            strncat(mdString, content, MAXSTR);
+            type = ((psVector*)(item->data.V))->type.type;
+            switch (type) {
+            case PS_DATA_S32:
+                strncat(mdString, "S32 ", MAXSTR);
+                for (i = 0; ((psVector*)(item->data.V))->data.S32[i] != 0; i++) {
+                    snprintf(content, MAXSTR, "%d",
+                             ((psVector*)(item->data.V))->data.S32[i]);
+                    if ( ((psVector*)(item->data.V))->data.S32[i+1] != 0 ) {
+                        strncat(content, ", ", MAXSTR);
+                    }
+                    strncat(mdString, content, MAXSTR);
+                }
+                break;
+            case PS_DATA_F32:
+                strncat(mdString, "F32 ", MAXSTR);
+                for (i = 0; ((psVector*)(item->data.V))->data.F32[i] != 0; i++) {
+                    snprintf(content, MAXSTR, "%f",
+                             ((psVector*)(item->data.V))->data.F32[i]);
+                    if ( ((psVector*)(item->data.V))->data.F32[i+1] != 0 ) {
+                        strncat(content, ", ", MAXSTR);
+                    }
+                    strncat(mdString, content, MAXSTR);
+                }
+                break;
+            case PS_DATA_F64:
+                strncat(mdString, "F64 ", MAXSTR);
+                for (i = 0; ((psVector*)(item->data.V))->data.F64[i] != 0; i++) {
+                    snprintf(content, MAXSTR, "%lf",
+                             ((psVector*)(item->data.V))->data.F64[i]);
+                    if ( ((psVector*)(item->data.V))->data.F64[i+1] != 0 ) {
+                        strncat(content, ", ", MAXSTR);
+                    }
+                    strncat(mdString, content, MAXSTR);
+                }
+                break;
+            case PS_DATA_UNKNOWN:
+            default:
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                        PS_ERRORTEXT_psMetadata_METATYPE_INVALID, type);
+                psFree(iter);
+                return NULL;
+            }
+            if ( item->comment != NULL ) {
+                //                size = strlen(item->comment);
+                snprintf(content, MAXSTR, " #%s \n", item->comment);
+                strncat(mdString, content, MAXSTR);
+            } else {
+                snprintf(content, MAXSTR, "\n");
+                strncat(mdString, content, MAXSTR);
+            }
+            break;
+        case PS_DATA_UNKNOWN:
+        default:
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psMetadata_METATYPE_INVALID, type);
+            psFree(iter);
+            return NULL;
+        }
+    }
+    newString = psStringNCopy(mdString, 2048);
+    psFree(iter);
+    return newString;
+}
+
+bool psMetadataConfigWrite(psMetadata *md,
+                           const char *filename)
+{
+    psString fileString = NULL;
+    FILE *file;
+    file = fopen(filename, "w");
+    fileString = psMetadataConfigFormat(md);
+    fprintf(file, "%s", fileString);
+    fclose(file);
+    psFree(fileString);
+    return true;
+}
+
Index: /trunk/psLib/src/types/psMetadataConfig.h
===================================================================
--- /trunk/psLib/src/types/psMetadataConfig.h	(revision 4869)
+++ /trunk/psLib/src/types/psMetadataConfig.h	(revision 4870)
@@ -10,6 +10,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.18 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-07-21 01:40:10 $
+ *  @version $Revision: 1.19 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-08-24 22:00:53 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -86,4 +86,24 @@
 );
 
+/** Converts a psMetadata structure (including any nested psMetadata) into a
+ *  configuration file formatted string.
+ *
+ *  A NULL shall be returned on error.
+ *  @return psString:       a Configuration File formatted string.
+ */
+psString psMetadataConfigFormat(
+    psMetadata *md                     ///< The metadata to convert
+);
+
+/** Converts a psMetadata structure (including any nested psMetadata) into a
+ *  configuration file formatted string that is written out to filename.
+ *
+ *  @return bool:       True if successful, otherwise false.
+ */
+bool psMetadataConfigWrite(
+    psMetadata *md,                    ///< The metadata to convert
+    const char *filename               ///< Name of file to write
+);
+
 /// @}
 
Index: /trunk/psLib/test/types/tst_psMetadataIO.c
===================================================================
--- /trunk/psLib/test/types/tst_psMetadataIO.c	(revision 4869)
+++ /trunk/psLib/test/types/tst_psMetadataIO.c	(revision 4870)
@@ -13,6 +13,6 @@
  *  @author  Eric Van Alst, MHPCC
  *
- *  @version $Revision: 1.1 $  $Name: not supported by cvs2svn $
- *  @date  $Date: 2005-07-13 02:47:01 $
+ *  @version $Revision: 1.2 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-08-24 22:00:57 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -29,4 +29,5 @@
 static psS32 testMetadataParseConfig3(void);
 static psS32 testMetadataParseConfig4(void);
+static psS32 testMetadataPrint(void);
 
 testDescription tests[] = {
@@ -36,4 +37,5 @@
                               {testMetadataParseConfig3,000,"psMetadataConfigParse",0,false},
                               {testMetadataParseConfig4,000,"psMetadataConfigParse",0,false},
+                              {testMetadataPrint,000,"psMetadataPrint",0,false},
                               {NULL}
                           };
@@ -48,4 +50,5 @@
 static psBool checkItemType(psMetadataItem* mdItem, psS32 expectedType, char* configFile);
 static psBool checkItemComment(psMetadataItem* mdItem, char* expectedComment, char* configFile);
+static psMetadata *setupMeta(void);
 
 #define ERROR_TOL  0.0001
@@ -236,4 +239,18 @@
         0, 0, 0, 24
     };
+
+static psMetadata *setupMeta(void)
+{
+    psMetadata *md = NULL;
+    md = psMetadataAlloc();
+
+    psMetadataAddBool(md, PS_LIST_TAIL, "item1", "I am a boolean", true);
+    psMetadataAddS32(md, PS_LIST_TAIL, "item2", "I am a integer", 55);
+    psMetadataAddF32(md, PS_LIST_TAIL, "item3", "I am a float", 3.14);
+    psMetadataAddF64(md, PS_LIST_TAIL, "item4", "I am a double", 6.28);
+    psMetadataAddStr(md, PS_LIST_TAIL, "item5", "I am a string", "GNIRTS");
+
+    return md;
+}
 
 static void writeMetadata(psMetadata* metadata, char* indentStr)
@@ -1020,2 +1037,10 @@
 }
 
+psS32 testMetadataPrint(void)
+{
+    psMetadata *meta = NULL;
+    meta = setupMeta();
+    psMetadataPrint(meta, 0);
+    psFree(meta);
+    return 0;
+}
Index: /trunk/psLib/test/types/tst_psMetadata_07.c
===================================================================
--- /trunk/psLib/test/types/tst_psMetadata_07.c	(revision 4869)
+++ /trunk/psLib/test/types/tst_psMetadata_07.c	(revision 4870)
@@ -8,9 +8,10 @@
 *     Test C - Get and Increment a psMetadataIterator
 *     Test D - Get and Decrement a psMetadataIterator
+*     Test E - psMetadataConfigWrite (also tests psMetadataConfigFormat)
 *
 *  @author  David Robbins, MHPCC
 *
-*  @version $Revision: 1.4 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2005-08-23 02:48:31 $
+*  @version $Revision: 1.5 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-08-24 22:00:57 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -20,10 +21,12 @@
 #include "pslib_strict.h"
 #include "psTest.h"
-#include "psMetadata.h"
+//#include "psMetadata.h"
 
-static psS32 testMetaIter00(void);
+static psS32 testMetaIter(void);
+static psS32 testMetaWrite(void);
 
 testDescription tests[] = {
-                              {testMetaIter00, 0, "Test psMetadataIterator fxns", 0, false},
+                              {testMetaIter, 0, "Test psMetadataIterator fxns", 0, false},
+                              {testMetaWrite, 0, "Test psMetadataConfigWrite", 0, false},
                               {NULL}
                           };
@@ -34,6 +37,13 @@
 {
     psMetadata *md = NULL;
+    psVector *vec = NULL;
+    psMetadata *newMD = NULL;
+    int i = 0;
     md = psMetadataAlloc();
-
+    newMD = psMetadataAlloc();
+    vec = psVectorAlloc(60, PS_DATA_S32);
+    for (i = 0; i < 5; i++) {
+        vec->data.S32[i] = i+1;
+    }
     psMetadataAddBool(md, PS_LIST_TAIL, "item1", "I am a boolean", true);
     psMetadataAddS32(md, PS_LIST_TAIL, "item2", "I am a integer", 55);
@@ -41,5 +51,20 @@
     psMetadataAddF64(md, PS_LIST_TAIL, "item4", "I am a double", 6.28);
     psMetadataAddStr(md, PS_LIST_TAIL, "item5", "I am a string", "GNIRTS");
+    psMetadataAddVector(md, PS_LIST_TAIL, "vector6", "I am a vector", vec);
 
+    psMetadataAddS32(newMD, PS_LIST_TAIL, "ITEM01", "I AM INT", 666);
+    psMetadata *newestMD = NULL;
+    newestMD = psMetadataAlloc();
+    psMetadataAddVector(newestMD, PS_LIST_TAIL, "VECTORNEW", "Newest VECTOR", vec);
+    psMetadataAddStr(newestMD, PS_LIST_TAIL, "cell", "I am a p-Star", "pStArRs");
+    psMetadataAddMetadata(newMD, PS_LIST_TAIL, "META NEW", "I AM Newest METADATA", newestMD);
+    psMetadataAddF32(newMD, PS_LIST_TAIL, "ITEM02", "I AM FLOAT", 666.6);
+    psMetadataAddF64(newMD, PS_LIST_TAIL, "ITEM03", "I AM DOUBLE", 666.666);
+
+    psMetadataAddMetadata(md, PS_LIST_TAIL, "metadata7", "I am a metadata", newMD);
+
+    psFree(newestMD);
+    psFree(vec);
+    psFree(newMD);
     return md;
 }
@@ -47,41 +72,13 @@
 int main(int argc, char* argv[])
 {
-
     psLogSetLevel( PS_LOG_INFO );
-
     if( !runTestSuite(stderr,"psMetadata_07",tests,argc,argv)) {
         return 1;
     }
-
-
-    // Test A - Read an XML config file
-    //    printPositiveTestHeader(stdout, "psMetadata", "Test A - Read an XML config file");
-    /*
-        int res = 0;
-        psU32 nFail = 0;
-        psMetadata *md = NULL;
-        md = psMetadataConfigParseXml(md, &nFail, XML_CONFIG_FILE, true);
-        if (nFail != 0) {
-            printf("psMetadataConfigParseXml returned error %d\n", res);
-        }
-
-        psFree(md);
-    */
-    //    printFooter(stdout, "psMetadata", "Test A - Read an XML config file", true);
-    /*
-        // Test B - Free data
-        printPositiveTestHeader(stdout, "psMetadata", "Test B - Free data");
-        psMemCheckLeaks(0, NULL, stdout, false);
-        psS32 nBad = psMemCheckCorruption(0);
-        if(nBad) {
-            printf("ERROR: Found %d bad memory blocks\n", nBad);
-        }
-        printFooter(stdout, "psMetadata", "Test B - Free data", true);
-    */
     return 0;
 }
 
 //Set a psMetadataIterator //
-static psS32 testMetaIter00(void)
+static psS32 testMetaIter(void)
 {
     psMetadata *metadata = NULL;
@@ -116,9 +113,20 @@
     }
     printFooter(stdout, "psMetadata", "Test D - Get and Decrement Iterator", true);
-    //    psFree(item1);
-    //    psFree(item2);
-    //    psFree(item3);
     psFree(iter);
     psFree(metadata);
     return 0;
 }
+
+static psS32 testMetaWrite(void)
+{
+    psMetadata *newMD = NULL;
+    newMD = setupMeta();
+    printPositiveTestHeader(stdout, "psMetadata", "Test E - psMetadataConfigWrite");
+    if ( !psMetadataConfigWrite(newMD, "mdcfgwrt.out") ) {
+        fprintf(stderr, "Failed test point E - Failed to write metadata to file. \n");
+    }
+
+    printFooter(stdout, "psMetadata", "Test E - psMetadataConfigWrite", true);
+    psFree(newMD);
+    return 0;
+}
Index: /trunk/psLib/test/types/verified/tst_psMetadataIO.stderr
===================================================================
--- /trunk/psLib/test/types/verified/tst_psMetadataIO.stderr	(revision 4869)
+++ /trunk/psLib/test/types/verified/tst_psMetadataIO.stderr	(revision 4870)
@@ -116,2 +116,11 @@
 ---> TESTPOINT PASSED (psMetadataConfigParse{psMetadataConfigParse} | tst_psMetadataIO.c)
 
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadataIO.c                                         *
+*            TestPoint: psMetadataConfigParse{psMetadataPrint}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadataConfigParse{psMetadataPrint} | tst_psMetadataIO.c)
+
Index: /trunk/psLib/test/types/verified/tst_psMetadataIO.stdout
===================================================================
--- /trunk/psLib/test/types/verified/tst_psMetadataIO.stdout	(revision 4869)
+++ /trunk/psLib/test/types/verified/tst_psMetadataIO.stdout	(revision 4870)
@@ -221,2 +221,7 @@
     c                         STR                                          z
 END
+item1 (I am a boolean): True
+item2 (I am a integer): 55
+item3 (I am a float): 3.140000
+item4 (I am a double): 6.280000
+item5 (I am a string): GNIRTS
Index: /trunk/psLib/test/types/verified/tst_psMetadata_07.stdout
===================================================================
--- /trunk/psLib/test/types/verified/tst_psMetadata_07.stdout	(revision 4869)
+++ /trunk/psLib/test/types/verified/tst_psMetadata_07.stdout	(revision 4870)
@@ -35,2 +35,11 @@
 ---> TESTPOINT PASSED (psMetadata{Test D - Get and Decrement Iterator} | tst_psMetadata_07.c)
 
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_07.c                                        *
+*            TestPoint: psMetadata{Test E - psMetadataConfigWrite}                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test E - psMetadataConfigWrite} | tst_psMetadata_07.c)
+
