Index: /trunk/psLib/src/types/psMetadata.c
===================================================================
--- /trunk/psLib/src/types/psMetadata.c	(revision 12282)
+++ /trunk/psLib/src/types/psMetadata.c	(revision 12283)
@@ -12,6 +12,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.152 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-02-09 01:26:00 $
+ *  @version $Revision: 1.153 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-03-06 21:58:47 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -207,11 +207,9 @@
                                      va_list argPtr)
 {
-    psMetadataItem* metadataItem = NULL;
-
-
-    PS_ASSERT_PTR_NON_NULL(name,NULL);
+    PS_ASSERT_STRING_NON_EMPTY(name, NULL);
+    PS_ASSERT_INT_POSITIVE(type, NULL);
 
     // Allocate metadata item
-    metadataItem = (psMetadataItem*) p_psAlloc(file, lineno, func, sizeof(psMetadataItem));
+    psMetadataItem *metadataItem = (psMetadataItem*) p_psAlloc(file, lineno, func, sizeof(psMetadataItem));
     metadataItem->data.V = NULL;
 
@@ -360,5 +358,5 @@
                                      const psMetadataItem *in)
 {
-    PS_ASSERT_PTR_NON_NULL(in,NULL);
+    PS_ASSERT_METADATA_ITEM_NON_NULL(in,NULL);
 
     psMetadataItem *newItem = NULL;     // New metadata item, to be returned
@@ -437,15 +435,6 @@
                              const psMetadata *in)
 {
-
-    if (in == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true, "psMetadataCopy: 'in' cannot be NULL");
-        return NULL;
-    }
-
-    //    PS_ASSERT_PTR_NON_NULL(in->list,NULL);
-    if (in->list == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true, "psMetadataCopy: 'in' has NULL list");
-        return NULL;
-    }
+    PS_ASSERT_METADATA_NON_NULL(in, NULL);
+
     bool errorOccurred = false;
     bool outAlloced = false;
@@ -524,9 +513,6 @@
     psMetadataItem *existingEntry = NULL;
 
-    PS_ASSERT_PTR_NON_NULL(md,false);
-    PS_ASSERT_PTR_NON_NULL(md->hash,false);
-    PS_ASSERT_PTR_NON_NULL(md->list,false);
-    PS_ASSERT_PTR_NON_NULL(item,false);
-    PS_ASSERT_PTR_NON_NULL(item->name,false);
+    PS_ASSERT_METADATA_NON_NULL(md,false);
+    PS_ASSERT_METADATA_ITEM_NON_NULL(item,false);
 
     mdTable = md->hash;
@@ -642,8 +628,7 @@
                    const char *comment,...)
 {
-    PS_ASSERT_PTR_NON_NULL(md,false);
-    PS_ASSERT_PTR_NON_NULL(md->list,false);
+    PS_ASSERT_METADATA_NON_NULL(md, false);
+
     va_list argPtr;
-
     va_start(argPtr, comment);
     bool result = psMetadataAddV(md,location,name,format,comment,argPtr);
@@ -660,9 +645,7 @@
                     va_list list)
 {
-    PS_ASSERT_PTR_NON_NULL(md,false);
-    PS_ASSERT_PTR_NON_NULL(md->list,false);
-    psMetadataItem* metadataItem = NULL;
-
-    metadataItem = psMetadataItemAllocV(name, format & PS_METADATA_TYPE_MASK, comment, list);
+    PS_ASSERT_METADATA_NON_NULL(md,false);
+
+    psMetadataItem* metadataItem = psMetadataItemAllocV(name, format & PS_METADATA_TYPE_MASK, comment, list);
 
     if (!psMetadataAddItem(md, metadataItem, location, format & PS_METADATA_FLAGS_MASK)) {
@@ -717,14 +700,9 @@
                          const char *key)
 {
-    PS_ASSERT_PTR_NON_NULL(md, false);
-
-    PS_ASSERT_PTR_NON_NULL(md->list, false);
+    PS_ASSERT_METADATA_NON_NULL(md, false);
+    PS_ASSERT_STRING_NON_EMPTY(key, false);
+
     psList* mdList = md->list;
-
-    PS_ASSERT_PTR_NON_NULL(md->hash,false);
     psHash* mdTable = md->hash;
-
-    PS_ASSERT_PTR_NON_NULL(key, false);
-    PS_ASSERT_INT_POSITIVE(strlen(key), false);
 
     psMetadataItem* entry = psHashLookup(mdTable,key);
@@ -757,10 +735,7 @@
                            long location)
 {
-    PS_ASSERT_PTR_NON_NULL(md, false);
-
-    PS_ASSERT_PTR_NON_NULL(md->list, false);
+    PS_ASSERT_METADATA_NON_NULL(md, false);
+
     psList* mdList = md->list;
-
-    PS_ASSERT_PTR_NON_NULL(md->hash,false);
     psHash* mdTable = md->hash;
 
@@ -802,16 +777,8 @@
                                  const char *key)
 {
-    psHash* mdTable = NULL;
-    psMetadataItem* entry = NULL;
-
-
-    PS_ASSERT_PTR_NON_NULL(md,NULL);
-    PS_ASSERT_PTR_NON_NULL(md->hash,NULL);
-    PS_ASSERT_PTR_NON_NULL(key,NULL);
-
-    mdTable = md->hash;
-    entry = (psMetadataItem*)psHashLookup(mdTable, key);
-
-    return entry;
+    PS_ASSERT_METADATA_NON_NULL(md,NULL);
+    PS_ASSERT_STRING_NON_EMPTY(key,NULL);
+
+    return (psMetadataItem*)psHashLookup(md->hash, key);
 }
 
@@ -820,7 +787,5 @@
                           const char *key)
 {
-    PS_ASSERT_PTR_NON_NULL(md,NULL);
-    PS_ASSERT_PTR_NON_NULL(md->list,NULL);
-    psMetadataItem *metadataItem = NULL;
+    PS_ASSERT_METADATA_NON_NULL(md,NULL);
 
     if (status) {
@@ -828,6 +793,6 @@
     }
 
-    metadataItem = psMetadataLookup(md, key);
-    if(metadataItem == NULL) {
+    psMetadataItem *metadataItem = psMetadataLookup(md, key);
+    if (metadataItem == NULL) {
         if (status) {
             *status = false;
@@ -944,6 +909,5 @@
     psMetadataItem* entry = NULL;
 
-    PS_ASSERT_PTR_NON_NULL(md,NULL);
-    PS_ASSERT_PTR_NON_NULL(md->list,NULL);
+    PS_ASSERT_METADATA_NON_NULL(md,NULL);
 
     entry = (psMetadataItem*) psListGet(md->list, location);
@@ -964,6 +928,5 @@
                                               const char* regex)
 {
-    PS_ASSERT_PTR_NON_NULL(md,NULL);
-    PS_ASSERT_PTR_NON_NULL(md->list,NULL);
+    PS_ASSERT_METADATA_NON_NULL(md,NULL);
 
     psMetadataIterator* newIter = p_psAlloc(file, lineno, func, sizeof(psMetadataIterator));
@@ -999,7 +962,6 @@
                            long location)
 {
-    PS_ASSERT_PTR_NON_NULL(iterator, NULL);
+    PS_ASSERT_METADATA_ITERATOR_NON_NULL(iterator, NULL);
     psListIterator *listIter = iterator->iter;
-    PS_ASSERT_PTR_NON_NULL(listIter, NULL);
 
     regex_t *regex = iterator->regex;
@@ -1050,8 +1012,6 @@
 psMetadataItem* psMetadataGetAndIncrement(psMetadataIterator* iterator)
 {
-    PS_ASSERT_PTR_NON_NULL(iterator,NULL);
+    PS_ASSERT_METADATA_ITERATOR_NON_NULL(iterator,NULL);
     psListIterator* listIter = iterator->iter;
-    PS_ASSERT_PTR_NON_NULL(listIter,NULL);
-
     regex_t* regex = iterator->regex;
 
@@ -1074,8 +1034,6 @@
 psMetadataItem* psMetadataGetAndDecrement(psMetadataIterator* iterator)
 {
-    PS_ASSERT_PTR_NON_NULL(iterator, NULL);
+    PS_ASSERT_METADATA_ITERATOR_NON_NULL(iterator, NULL);
     psListIterator* listIter = iterator->iter;
-    PS_ASSERT_PTR_NON_NULL(listIter, NULL);
-
     regex_t* regex = iterator->regex;
 
@@ -1100,6 +1058,5 @@
                                      const char *key)
 {
-    PS_ASSERT_PTR_NON_NULL(md,NULL);
-    PS_ASSERT_PTR_NON_NULL(md->list,NULL);
+    PS_ASSERT_METADATA_NON_NULL(md,NULL);
     psMetadataItem *item = psMetadataLookup((psMetadata*)md, key); // The metadata with instruments
     psMetadata *value = NULL;  // The value to return
@@ -1133,6 +1090,5 @@
                              const char *key)
 {
-    PS_ASSERT_PTR_NON_NULL(md,NULL);
-    PS_ASSERT_PTR_NON_NULL(md->list,NULL);
+    PS_ASSERT_METADATA_NON_NULL(md,NULL);
 
     psMetadataItem *item = psMetadataLookup((psMetadata*)md, key);
@@ -1170,6 +1126,6 @@
                              const char *key)
 {
-    PS_ASSERT_PTR_NON_NULL(md,NULL);
-    PS_ASSERT_PTR_NON_NULL(md->list,NULL);
+    PS_ASSERT_METADATA_NON_NULL(md,NULL);
+
     psMetadataItem *item = psMetadataLookup((psMetadata*)md, key); // The metadata with instruments
     //    char *value = NULL;   // The value to return
@@ -1200,4 +1156,17 @@
 }
 
+psList *psMetadataKeys(psMetadata *md)
+{
+    PS_ASSERT_METADATA_NON_NULL(md, NULL);
+
+    psList *list = psListAlloc(NULL);   // List with the keys
+    psMetadataIterator *iter = psMetadataIteratorAlloc(md, PS_LIST_HEAD, false);
+    psMetadataItem *item;               // Item from iteration
+    while ((item = psMetadataGetAndIncrement(iter))) {
+        psListAdd(list, PS_LIST_TAIL, item->name);
+    }
+    return list;
+}
+
 
 bool psMetadataPrint(FILE *fd,
@@ -1205,5 +1174,5 @@
                      int level)
 {
-    PS_ASSERT_PTR_NON_NULL(md,false);
+    PS_ASSERT_METADATA_NON_NULL(md,false);
     if (fd == NULL) {
         fd = stdout;
Index: /trunk/psLib/src/types/psMetadata.h
===================================================================
--- /trunk/psLib/src/types/psMetadata.h	(revision 12282)
+++ /trunk/psLib/src/types/psMetadata.h	(revision 12283)
@@ -9,6 +9,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.98 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2007-02-09 01:26:00 $
+*  @version $Revision: 1.99 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2007-03-06 21:58:47 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -1189,4 +1189,7 @@
 );
 
+/// Return a list of keys for a metadata
+psList *psMetadataKeys(psMetadata *md   ///< Metadata for which to return keys
+                       );
 
 /** Prints metadata collection.
@@ -1202,6 +1205,4 @@
     int level                          ///< the level of metadata items.
 );
-
-
 
 /// Assert on metadata with extant hash and list components
@@ -1214,4 +1215,23 @@
 }
 
+/// Assert on metadata item with extant name and type
+///
+/// The data contained within the metadata item is permitted to be NULL.
+#define PS_ASSERT_METADATA_ITEM_NON_NULL(NAME, RVAL) \
+if (!(NAME) || !(NAME)->name || !(NAME)->type) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: Metadata item %s or its name or type is NULL.", \
+            #NAME); \
+    return RVAL; \
+}
+
+#define PS_ASSERT_METADATA_ITERATOR_NON_NULL(NAME, RVAL) \
+if (!(NAME) || !(NAME)->iter) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: Metadata iterator %s or its component is NULL.", \
+            #NAME); \
+    return RVAL; \
+}
+
 /// @}
 #endif // #ifndef PS_METADATA_H
