Index: trunk/psLib/src/types/psMetadata.c
===================================================================
--- trunk/psLib/src/types/psMetadata.c	(revision 4858)
+++ 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 4858)
+++ 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 4858)
+++ 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
+);
+
 /// @}
 
