Index: /trunk/psLib/src/astronomy/psMetadata.c
===================================================================
--- /trunk/psLib/src/astronomy/psMetadata.c	(revision 1323)
+++ /trunk/psLib/src/astronomy/psMetadata.c	(revision 1324)
@@ -11,6 +11,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-28 23:51:42 $
+ *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-29 02:04:20 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -60,5 +60,5 @@
 /*  FUNCTION IMPLEMENTATION - LOCAL                                          */
 /*****************************************************************************/
-static void p_psMetadataItemFree(psMetadataItem *metadataItem)
+static void metadataItemFree(psMetadataItem *metadataItem)
 {
     psMetadataType type;
@@ -81,5 +81,5 @@
 }
 
-static void p_psMetadataFree(psMetadata *metadata)
+static void metadataFree(psMetadata *metadata)
 {
     if (metadata == NULL) {
@@ -97,5 +97,5 @@
 psMetadataItem *psMetadataItemAlloc(const char *name, psMetadataType type, const char *comment, ...)
 {
-    va_list argPtr = NULL;
+    va_list argPtr;
     psMetadataItem *metadataItem = NULL;
 
@@ -128,5 +128,5 @@
 
     // Set deallocator
-    p_psMemSetDeallocator(metadataItem,(psFreeFcn)p_psMetadataItemFree);
+    p_psMemSetDeallocator(metadataItem,(psFreeFcn)metadataItemFree);
 
     // Allocate and set metadata item comment
@@ -140,5 +140,5 @@
 
     // Set metadata item id
-    *(int*)metadataItem->id = ++metadataId;
+    *(int*)(&metadataItem->id) = ++metadataId;
 
     // Set metadata item type
@@ -191,5 +191,5 @@
 
     // Set deallocator
-    p_psMemSetDeallocator(metadata,(psFreeFcn)p_psMetadataFree);
+    p_psMemSetDeallocator(metadata,(psFreeFcn)metadataFree);
 
     // Allocate internal containers
@@ -250,5 +250,5 @@
 
         // The key was found and the new metadata item is a leaf node (its type isn't PS_META_ITEM_SET), so
-        // add the new metadata item as a child of the existing metadata item folder node.
+        // add the new metadata item to hash as a child of the existing metadata item folder node.
         if(!psListAdd(value->items, metadataItem, where)) {
             psError(__func__, "Couldn't add metadata item to items list. Name: %s",
@@ -265,5 +265,5 @@
     } else {
 
-        // Duplicate key not found. Add new metadata item to metadata collection's hash and list containers
+        // Duplicate key not found. Add new metadata item to metadata collection's hash
         if(!psHashAdd(mdTable, key, metadataItem)) {
             psError(__func__, "Couldn't add metadata item to metadata collection table. Name: %s",
@@ -271,10 +271,11 @@
             return false;
         }
-
-        if(!psListAdd(md->list, metadataItem, where)) {
-            psError(__func__, "Couldn't add metadata item to metadata collection list. Name: %s",
-                    metadataItem->name);
-            return false;
-        }
+    }
+
+    // Add all items to metadata collection's list, even if they have the same metadata item names
+    if(!psListAdd(md->list, metadataItem, where)) {
+        psError(__func__, "Couldn't add metadata item to metadata collection list. Name: %s",
+                metadataItem->name);
+        return false;
     }
 
@@ -285,5 +286,5 @@
                    const char *comment, ...)
 {
-    va_list argPtr = NULL;
+    va_list argPtr;
     psMetadataItem *metadataItem = NULL;
 
@@ -294,2 +295,79 @@
     return psMetadataAddItem(md, where, metadataItem);
 }
+
+/** Remove an item from metadata collection.
+ *
+ * Items may be removed from metadata by specifing a key or location. If the key is null, the where argument
+ * is used instead. If name is not null, where is set to PS_LIST_UNKNOWN. If the item is found, it is removed
+ * from the metadata and true is returned.  If the key is not unique, then all items corresponding to it are
+ * removed.
+ *
+ * @return bool: True for success, false for failure.
+ */
+bool psMetadataRemove(psMetadata *restrict md, int where, const char *restrict key)
+{
+    /*    int i = 0;
+        int numChildren = 0;
+        psList mdList = NULL;
+        psHash mdHash = NULL;
+        psMetadataItem *entry = NULL;
+        psMetadataItem *entryChild = NULL;
+     
+        mdList = md->list
+        if(mdList == NULL) {
+            psError(__func__, "Null metadata list not allowed");
+            return false;
+        }
+     
+        mdTable = md->table;
+        if(mdTable == NULL) {
+            psError(__func__, "Null metadata table not allowed");
+            return false;
+        }
+     
+        // Select removal by key or index
+        if(key != NULL){
+     
+            // Remove by key name
+            entry = (psMetadataItem*)psHashLookup(mdTable, key);
+            if(entry == NULL) {
+                psError(__func__, "Couldn't find metadata item remove. Name: %s", key);
+                return false;
+            }
+     
+            numChildren = entry->items->size;
+            if(entry->type==PS_META_ITEM_SET && numChildren>0){
+     
+                // Table entry has children. Entry and children must be removed from metadata collection's list
+                psListSetIterator(list, PS_LIST_HEAD);
+                entryChild = psListGetCurrent(list);
+                while (entryChild != NULL) {
+                    if(!psListRemove(mdList, entry, PS_LIST_UNKNOWN)) {
+                        psError(__func__, "Couldn't remove metadata item from list. Name: %s", key);
+                        return false;
+                    }
+                }
+                entryChild = psListGetNext(list);
+            } else {
+     
+                // Table entry does not have children. Entry only must be removed from metadata collection's list
+                if(!psListRemove(mdList, entry, PS_LIST_UNKNOWN)) {
+                    psError(__func__, "Couldn't remove metadata item from list. Name: %s", key);
+                    return false;
+                }
+     
+            }
+     
+            // Remove entry from table once duplictes have been removed from the metadata collection's list
+            if(!psHashRemove(mdHash, key)) {
+                psError(__func__, "Couldn't remove metadata item from table. Name: %s", key);
+                return false;
+            }
+        } else {
+            // Remove by index
+     
+        }*/
+
+    return true;
+}
+
Index: /trunk/psLib/src/collections/psMetadata.c
===================================================================
--- /trunk/psLib/src/collections/psMetadata.c	(revision 1323)
+++ /trunk/psLib/src/collections/psMetadata.c	(revision 1324)
@@ -11,6 +11,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-28 23:51:42 $
+ *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-29 02:04:20 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -60,5 +60,5 @@
 /*  FUNCTION IMPLEMENTATION - LOCAL                                          */
 /*****************************************************************************/
-static void p_psMetadataItemFree(psMetadataItem *metadataItem)
+static void metadataItemFree(psMetadataItem *metadataItem)
 {
     psMetadataType type;
@@ -81,5 +81,5 @@
 }
 
-static void p_psMetadataFree(psMetadata *metadata)
+static void metadataFree(psMetadata *metadata)
 {
     if (metadata == NULL) {
@@ -97,5 +97,5 @@
 psMetadataItem *psMetadataItemAlloc(const char *name, psMetadataType type, const char *comment, ...)
 {
-    va_list argPtr = NULL;
+    va_list argPtr;
     psMetadataItem *metadataItem = NULL;
 
@@ -128,5 +128,5 @@
 
     // Set deallocator
-    p_psMemSetDeallocator(metadataItem,(psFreeFcn)p_psMetadataItemFree);
+    p_psMemSetDeallocator(metadataItem,(psFreeFcn)metadataItemFree);
 
     // Allocate and set metadata item comment
@@ -140,5 +140,5 @@
 
     // Set metadata item id
-    *(int*)metadataItem->id = ++metadataId;
+    *(int*)(&metadataItem->id) = ++metadataId;
 
     // Set metadata item type
@@ -191,5 +191,5 @@
 
     // Set deallocator
-    p_psMemSetDeallocator(metadata,(psFreeFcn)p_psMetadataFree);
+    p_psMemSetDeallocator(metadata,(psFreeFcn)metadataFree);
 
     // Allocate internal containers
@@ -250,5 +250,5 @@
 
         // The key was found and the new metadata item is a leaf node (its type isn't PS_META_ITEM_SET), so
-        // add the new metadata item as a child of the existing metadata item folder node.
+        // add the new metadata item to hash as a child of the existing metadata item folder node.
         if(!psListAdd(value->items, metadataItem, where)) {
             psError(__func__, "Couldn't add metadata item to items list. Name: %s",
@@ -265,5 +265,5 @@
     } else {
 
-        // Duplicate key not found. Add new metadata item to metadata collection's hash and list containers
+        // Duplicate key not found. Add new metadata item to metadata collection's hash
         if(!psHashAdd(mdTable, key, metadataItem)) {
             psError(__func__, "Couldn't add metadata item to metadata collection table. Name: %s",
@@ -271,10 +271,11 @@
             return false;
         }
-
-        if(!psListAdd(md->list, metadataItem, where)) {
-            psError(__func__, "Couldn't add metadata item to metadata collection list. Name: %s",
-                    metadataItem->name);
-            return false;
-        }
+    }
+
+    // Add all items to metadata collection's list, even if they have the same metadata item names
+    if(!psListAdd(md->list, metadataItem, where)) {
+        psError(__func__, "Couldn't add metadata item to metadata collection list. Name: %s",
+                metadataItem->name);
+        return false;
     }
 
@@ -285,5 +286,5 @@
                    const char *comment, ...)
 {
-    va_list argPtr = NULL;
+    va_list argPtr;
     psMetadataItem *metadataItem = NULL;
 
@@ -294,2 +295,79 @@
     return psMetadataAddItem(md, where, metadataItem);
 }
+
+/** Remove an item from metadata collection.
+ *
+ * Items may be removed from metadata by specifing a key or location. If the key is null, the where argument
+ * is used instead. If name is not null, where is set to PS_LIST_UNKNOWN. If the item is found, it is removed
+ * from the metadata and true is returned.  If the key is not unique, then all items corresponding to it are
+ * removed.
+ *
+ * @return bool: True for success, false for failure.
+ */
+bool psMetadataRemove(psMetadata *restrict md, int where, const char *restrict key)
+{
+    /*    int i = 0;
+        int numChildren = 0;
+        psList mdList = NULL;
+        psHash mdHash = NULL;
+        psMetadataItem *entry = NULL;
+        psMetadataItem *entryChild = NULL;
+     
+        mdList = md->list
+        if(mdList == NULL) {
+            psError(__func__, "Null metadata list not allowed");
+            return false;
+        }
+     
+        mdTable = md->table;
+        if(mdTable == NULL) {
+            psError(__func__, "Null metadata table not allowed");
+            return false;
+        }
+     
+        // Select removal by key or index
+        if(key != NULL){
+     
+            // Remove by key name
+            entry = (psMetadataItem*)psHashLookup(mdTable, key);
+            if(entry == NULL) {
+                psError(__func__, "Couldn't find metadata item remove. Name: %s", key);
+                return false;
+            }
+     
+            numChildren = entry->items->size;
+            if(entry->type==PS_META_ITEM_SET && numChildren>0){
+     
+                // Table entry has children. Entry and children must be removed from metadata collection's list
+                psListSetIterator(list, PS_LIST_HEAD);
+                entryChild = psListGetCurrent(list);
+                while (entryChild != NULL) {
+                    if(!psListRemove(mdList, entry, PS_LIST_UNKNOWN)) {
+                        psError(__func__, "Couldn't remove metadata item from list. Name: %s", key);
+                        return false;
+                    }
+                }
+                entryChild = psListGetNext(list);
+            } else {
+     
+                // Table entry does not have children. Entry only must be removed from metadata collection's list
+                if(!psListRemove(mdList, entry, PS_LIST_UNKNOWN)) {
+                    psError(__func__, "Couldn't remove metadata item from list. Name: %s", key);
+                    return false;
+                }
+     
+            }
+     
+            // Remove entry from table once duplictes have been removed from the metadata collection's list
+            if(!psHashRemove(mdHash, key)) {
+                psError(__func__, "Couldn't remove metadata item from table. Name: %s", key);
+                return false;
+            }
+        } else {
+            // Remove by index
+     
+        }*/
+
+    return true;
+}
+
Index: /trunk/psLib/src/types/psMetadata.c
===================================================================
--- /trunk/psLib/src/types/psMetadata.c	(revision 1323)
+++ /trunk/psLib/src/types/psMetadata.c	(revision 1324)
@@ -11,6 +11,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-28 23:51:42 $
+ *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-29 02:04:20 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -60,5 +60,5 @@
 /*  FUNCTION IMPLEMENTATION - LOCAL                                          */
 /*****************************************************************************/
-static void p_psMetadataItemFree(psMetadataItem *metadataItem)
+static void metadataItemFree(psMetadataItem *metadataItem)
 {
     psMetadataType type;
@@ -81,5 +81,5 @@
 }
 
-static void p_psMetadataFree(psMetadata *metadata)
+static void metadataFree(psMetadata *metadata)
 {
     if (metadata == NULL) {
@@ -97,5 +97,5 @@
 psMetadataItem *psMetadataItemAlloc(const char *name, psMetadataType type, const char *comment, ...)
 {
-    va_list argPtr = NULL;
+    va_list argPtr;
     psMetadataItem *metadataItem = NULL;
 
@@ -128,5 +128,5 @@
 
     // Set deallocator
-    p_psMemSetDeallocator(metadataItem,(psFreeFcn)p_psMetadataItemFree);
+    p_psMemSetDeallocator(metadataItem,(psFreeFcn)metadataItemFree);
 
     // Allocate and set metadata item comment
@@ -140,5 +140,5 @@
 
     // Set metadata item id
-    *(int*)metadataItem->id = ++metadataId;
+    *(int*)(&metadataItem->id) = ++metadataId;
 
     // Set metadata item type
@@ -191,5 +191,5 @@
 
     // Set deallocator
-    p_psMemSetDeallocator(metadata,(psFreeFcn)p_psMetadataFree);
+    p_psMemSetDeallocator(metadata,(psFreeFcn)metadataFree);
 
     // Allocate internal containers
@@ -250,5 +250,5 @@
 
         // The key was found and the new metadata item is a leaf node (its type isn't PS_META_ITEM_SET), so
-        // add the new metadata item as a child of the existing metadata item folder node.
+        // add the new metadata item to hash as a child of the existing metadata item folder node.
         if(!psListAdd(value->items, metadataItem, where)) {
             psError(__func__, "Couldn't add metadata item to items list. Name: %s",
@@ -265,5 +265,5 @@
     } else {
 
-        // Duplicate key not found. Add new metadata item to metadata collection's hash and list containers
+        // Duplicate key not found. Add new metadata item to metadata collection's hash
         if(!psHashAdd(mdTable, key, metadataItem)) {
             psError(__func__, "Couldn't add metadata item to metadata collection table. Name: %s",
@@ -271,10 +271,11 @@
             return false;
         }
-
-        if(!psListAdd(md->list, metadataItem, where)) {
-            psError(__func__, "Couldn't add metadata item to metadata collection list. Name: %s",
-                    metadataItem->name);
-            return false;
-        }
+    }
+
+    // Add all items to metadata collection's list, even if they have the same metadata item names
+    if(!psListAdd(md->list, metadataItem, where)) {
+        psError(__func__, "Couldn't add metadata item to metadata collection list. Name: %s",
+                metadataItem->name);
+        return false;
     }
 
@@ -285,5 +286,5 @@
                    const char *comment, ...)
 {
-    va_list argPtr = NULL;
+    va_list argPtr;
     psMetadataItem *metadataItem = NULL;
 
@@ -294,2 +295,79 @@
     return psMetadataAddItem(md, where, metadataItem);
 }
+
+/** Remove an item from metadata collection.
+ *
+ * Items may be removed from metadata by specifing a key or location. If the key is null, the where argument
+ * is used instead. If name is not null, where is set to PS_LIST_UNKNOWN. If the item is found, it is removed
+ * from the metadata and true is returned.  If the key is not unique, then all items corresponding to it are
+ * removed.
+ *
+ * @return bool: True for success, false for failure.
+ */
+bool psMetadataRemove(psMetadata *restrict md, int where, const char *restrict key)
+{
+    /*    int i = 0;
+        int numChildren = 0;
+        psList mdList = NULL;
+        psHash mdHash = NULL;
+        psMetadataItem *entry = NULL;
+        psMetadataItem *entryChild = NULL;
+     
+        mdList = md->list
+        if(mdList == NULL) {
+            psError(__func__, "Null metadata list not allowed");
+            return false;
+        }
+     
+        mdTable = md->table;
+        if(mdTable == NULL) {
+            psError(__func__, "Null metadata table not allowed");
+            return false;
+        }
+     
+        // Select removal by key or index
+        if(key != NULL){
+     
+            // Remove by key name
+            entry = (psMetadataItem*)psHashLookup(mdTable, key);
+            if(entry == NULL) {
+                psError(__func__, "Couldn't find metadata item remove. Name: %s", key);
+                return false;
+            }
+     
+            numChildren = entry->items->size;
+            if(entry->type==PS_META_ITEM_SET && numChildren>0){
+     
+                // Table entry has children. Entry and children must be removed from metadata collection's list
+                psListSetIterator(list, PS_LIST_HEAD);
+                entryChild = psListGetCurrent(list);
+                while (entryChild != NULL) {
+                    if(!psListRemove(mdList, entry, PS_LIST_UNKNOWN)) {
+                        psError(__func__, "Couldn't remove metadata item from list. Name: %s", key);
+                        return false;
+                    }
+                }
+                entryChild = psListGetNext(list);
+            } else {
+     
+                // Table entry does not have children. Entry only must be removed from metadata collection's list
+                if(!psListRemove(mdList, entry, PS_LIST_UNKNOWN)) {
+                    psError(__func__, "Couldn't remove metadata item from list. Name: %s", key);
+                    return false;
+                }
+     
+            }
+     
+            // Remove entry from table once duplictes have been removed from the metadata collection's list
+            if(!psHashRemove(mdHash, key)) {
+                psError(__func__, "Couldn't remove metadata item from table. Name: %s", key);
+                return false;
+            }
+        } else {
+            // Remove by index
+     
+        }*/
+
+    return true;
+}
+
