Index: /trunk/psLib/test/astronomy/tst_psMetadata_01.c
===================================================================
--- /trunk/psLib/test/astronomy/tst_psMetadata_01.c	(revision 1493)
+++ /trunk/psLib/test/astronomy/tst_psMetadata_01.c	(revision 1494)
@@ -7,14 +7,15 @@
 *     Test B - Read 2nd hdr from complex FITS file
 *     Test C - Read named hdr from complex FITS file
-*     Test D - Attempt to use null file descriptor
-*     Test E - Attempt to use two null inputs
-*     Test F - Attempt to use bad extNum/
-*     Test G - Attempt to use bad extNameTest
-*     Test H - Free psMetadataData
+*     Test D - Remove items with same name from all metadata
+*     Test E- Attempt to use null file descriptor
+*     Test F - Attempt to use two null inputs
+*     Test G - Attempt to use bad extNum/
+*     Test H - Attempt to use bad extNameTest
+*     Test I - Free psMetadataData
 *
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.6 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-08-10 23:47:28 $
+*  @version $Revision: 1.7 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-08-12 01:08:39 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -26,56 +27,93 @@
 #include <string.h>
 
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces);
+
+static void printMetadataItemList(psList *metadataItemList)
+{
+    psMetadataItem *entryChild = NULL;
+
+    psListSetIterator(metadataItemList, PS_LIST_HEAD);
+    entryChild = psListGetCurrent(metadataItemList);
+    while (entryChild != NULL) {
+        printMetadataItem(entryChild, "    ");
+        entryChild = psListGetNext(metadataItemList);
+    }
+}
+
+static void printMetadataList(psList *metadataItemList)
+{
+    psMetadataItem *entryChild = NULL;
+
+    psListSetIterator(metadataItemList, PS_LIST_HEAD);
+    entryChild = psListGetCurrent(metadataItemList);
+    while (entryChild != NULL) {
+        printMetadataItem(entryChild, " ");
+        entryChild = psListGetNext(metadataItemList);
+    }
+}
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
+{
+    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
+    printf("Key Type: %2d  ", metadataItem->type);
+
+    switch (metadataItem->type ) {
+    case PS_META_ITEM_SET:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_BOOL:
+        printf("Key Value: %15d  ", metadataItem->data.B);
+        break;
+    case PS_META_S32:
+        printf("Key Value: %15d  ", metadataItem->data.S32);
+        break;
+    case PS_META_F32:
+        printf("Key Value: %15.3f  ", metadataItem->data.F32);
+        break;
+    case PS_META_F64:
+        printf("Key Value: %15.3f  ", metadataItem->data.F64);
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    case PS_META_IMG:
+    case PS_META_JPEG:
+    case PS_META_PNG:
+    case PS_META_ASTROM:
+    case PS_META_UNKNOWN:
+        printf("Value: unknown ");
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+
+    if(metadataItem->items->size) {
+        printMetadataItemList(metadataItem->items);
+    }
+}
+
+static void printMetadataTable(psHash *mdTable)
+{
+    int i;
+    psHashBucket* ptr = NULL;
+    for(i=0; i<mdTable->nbucket; i++) {
+        ptr = mdTable->buckets[i];
+        while (ptr != NULL) {
+            printMetadataItem(ptr->data, " ");
+            ptr = ptr->next;
+        }
+    }
+}
+
 static void printMetadata(psMetadata *metadata)
 {
-    psList *mdList = NULL;
-    psHash *mdTable = NULL;
-    psMetadataItem *entryChild = NULL;
-
-    mdList = metadata->list;
-    mdTable = metadata->table;
-    if(mdList==NULL || mdTable==NULL) {
-        printf("ERROR: Null collection metadata found\n");
-    }
-
-    psListSetIterator( mdList, PS_LIST_HEAD );
-    entryChild = psListGetCurrent( mdList );
-    while ( entryChild != NULL ) {
-        printf("Key Name: %8s  ", entryChild->name);
-        printf("Key Type: %2d  ", entryChild->type);
-
-        switch (entryChild->type ) {
-        case PS_META_BOOL:
-            printf("Key Value: %15d  ", entryChild->data.B);
-            break;
-        case PS_META_S32:
-            printf("Key Value: %15d  ", entryChild->data.S32);
-            break;
-        case PS_META_F32:
-            printf("Key Value: %15.3f  ", entryChild->data.F32);
-            break;
-        case PS_META_F64:
-            printf("Key Value: %15.3f  ", entryChild->data.F64);
-            break;
-        case PS_META_STR:
-            printf("Key Value: %15s  ", (char*)entryChild->data.V);
-            break;
-        case PS_META_IMG:
-        case PS_META_JPEG:
-        case PS_META_PNG:
-        case PS_META_ASTROM:
-        case PS_META_UNKNOWN:
-            printf("Value: unknown ");
-            break;
-        default:
-            printf("Bad type: %d ", entryChild->type);
-        }
-        printf("Key Comment: %s\n", entryChild->comment);
-
-        entryChild = psListGetNext( mdList);
-    }
-}
-
-
-int main( int argc, char* argv[] )
+    printf("Contents of metadata list:\n");
+    printMetadataList(metadata->list);
+    printf("\nContents of metadata table:\n");
+    printMetadataTable(metadata->table);
+}
+
+
+int main(int argc, char* argv[])
 {
     int status = 0;
@@ -169,34 +207,42 @@
 
 
-    // Test D - Attempt to use null file descriptor
-    printNegativeTestHeader(stdout,"psMetadata", "Test D - Attempt to use null file descriptor",
+    // Test D - Remove items with same name from all metadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test D - Remove items with same name from all metadata");
+    printf("Removed HISTORY from all metadata from prior test. Resulting metadata:\n\n");
+    psMetadataRemove(metadata3, 0, "HISTORY");
+    printMetadata(metadata3);
+    printFooter(stdout, "psMetadata", "Test D - Remove items with same name from all metadata", true);
+
+
+    // Test E - Attempt to use null file descriptor
+    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to use null file descriptor",
                             "Null FITS file descriptor not allowed", 0);
     psMetadataFReadHeader(NULL, NULL, 1, NULL);
-    printFooter(stdout, "psMetadata", "Test D - Attempt to use null file descriptor", true);
-
-
-    // Test E - Attempt to use two null inputs
-    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to use two null inputs",
+    printFooter(stdout, "psMetadata", "Test E - Attempt to use null file descriptor", true);
+
+
+    // Test F - Attempt to use two null inputs
+    printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to use two null inputs",
                             "Null extName and extNum = 0 not allowed", 0);
     psMetadataFReadHeader(NULL, NULL, 0, fptr);
-    printFooter(stdout, "psMetadata", "Test E - Attempt to use two null inputs", true);
-
-
-    // Test F - Attempt to use bad extNum
-    printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to use bad extNum",
+    printFooter(stdout, "psMetadata", "Test F - Attempt to use two null inputs", true);
+
+
+    // Test G - Attempt to use bad extNum
+    printNegativeTestHeader(stdout,"psMetadata", "Test G - Attempt to use bad extNum",
                             "FITS error while locating header 22: tried to move past end of file", 0);
     psMetadataFReadHeader(metadata1, NULL, 22, fptr);
-    printFooter(stdout, "psMetadata", "Test F - Attempt to use bad extNum", true);
-
-
-    // Test G - Attempt to use bad extName
-    printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to use bad extName",
+    printFooter(stdout, "psMetadata", "Test G - Attempt to use bad extNum", true);
+
+
+    // Test H - Attempt to use bad extName
+    printNegativeTestHeader(stdout,"psMetadata", "Test H - Attempt to use bad extName",
                             "FITS error while locating header AARGH: illegal HDU number", 0);
     psMetadataFReadHeader(metadata1, "AARGH", 0, fptr);
-    printFooter(stdout, "psMetadata", "Test F - Attempt to use bad extName", true);
-
-
-    // Test H - Free psMetadata
-    printPositiveTestHeader(stdout, "psMetadata", "Test H - Free psMetadata");
+    printFooter(stdout, "psMetadata", "Test H - Attempt to use bad extName", true);
+
+
+    // Test I- Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test I - Free psMetadata");
     psFree(metadata1);
     psFree(metadata2);
@@ -208,5 +254,5 @@
         printf("ERROR: Found %d bad memory blocks\n", nBad);
     }
-    printFooter(stdout, "psMetadata", "Test H - Free psMetadata", true);
+    printFooter(stdout, "psMetadata", "Test I - Free psMetadata", true);
 
     return 0;
Index: /trunk/psLib/test/collections/tst_psMetadata_01.c
===================================================================
--- /trunk/psLib/test/collections/tst_psMetadata_01.c	(revision 1493)
+++ /trunk/psLib/test/collections/tst_psMetadata_01.c	(revision 1494)
@@ -7,14 +7,15 @@
 *     Test B - Read 2nd hdr from complex FITS file
 *     Test C - Read named hdr from complex FITS file
-*     Test D - Attempt to use null file descriptor
-*     Test E - Attempt to use two null inputs
-*     Test F - Attempt to use bad extNum/
-*     Test G - Attempt to use bad extNameTest
-*     Test H - Free psMetadataData
+*     Test D - Remove items with same name from all metadata
+*     Test E- Attempt to use null file descriptor
+*     Test F - Attempt to use two null inputs
+*     Test G - Attempt to use bad extNum/
+*     Test H - Attempt to use bad extNameTest
+*     Test I - Free psMetadataData
 *
 *  @author  Ross Harman, MHPCC
 *
-*  @version $Revision: 1.6 $  $Name: not supported by cvs2svn $
-*  @date  $Date: 2004-08-10 23:47:28 $
+*  @version $Revision: 1.7 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2004-08-12 01:08:39 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -26,56 +27,93 @@
 #include <string.h>
 
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces);
+
+static void printMetadataItemList(psList *metadataItemList)
+{
+    psMetadataItem *entryChild = NULL;
+
+    psListSetIterator(metadataItemList, PS_LIST_HEAD);
+    entryChild = psListGetCurrent(metadataItemList);
+    while (entryChild != NULL) {
+        printMetadataItem(entryChild, "    ");
+        entryChild = psListGetNext(metadataItemList);
+    }
+}
+
+static void printMetadataList(psList *metadataItemList)
+{
+    psMetadataItem *entryChild = NULL;
+
+    psListSetIterator(metadataItemList, PS_LIST_HEAD);
+    entryChild = psListGetCurrent(metadataItemList);
+    while (entryChild != NULL) {
+        printMetadataItem(entryChild, " ");
+        entryChild = psListGetNext(metadataItemList);
+    }
+}
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
+{
+    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
+    printf("Key Type: %2d  ", metadataItem->type);
+
+    switch (metadataItem->type ) {
+    case PS_META_ITEM_SET:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_BOOL:
+        printf("Key Value: %15d  ", metadataItem->data.B);
+        break;
+    case PS_META_S32:
+        printf("Key Value: %15d  ", metadataItem->data.S32);
+        break;
+    case PS_META_F32:
+        printf("Key Value: %15.3f  ", metadataItem->data.F32);
+        break;
+    case PS_META_F64:
+        printf("Key Value: %15.3f  ", metadataItem->data.F64);
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    case PS_META_IMG:
+    case PS_META_JPEG:
+    case PS_META_PNG:
+    case PS_META_ASTROM:
+    case PS_META_UNKNOWN:
+        printf("Value: unknown ");
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+
+    if(metadataItem->items->size) {
+        printMetadataItemList(metadataItem->items);
+    }
+}
+
+static void printMetadataTable(psHash *mdTable)
+{
+    int i;
+    psHashBucket* ptr = NULL;
+    for(i=0; i<mdTable->nbucket; i++) {
+        ptr = mdTable->buckets[i];
+        while (ptr != NULL) {
+            printMetadataItem(ptr->data, " ");
+            ptr = ptr->next;
+        }
+    }
+}
+
 static void printMetadata(psMetadata *metadata)
 {
-    psList *mdList = NULL;
-    psHash *mdTable = NULL;
-    psMetadataItem *entryChild = NULL;
-
-    mdList = metadata->list;
-    mdTable = metadata->table;
-    if(mdList==NULL || mdTable==NULL) {
-        printf("ERROR: Null collection metadata found\n");
-    }
-
-    psListSetIterator( mdList, PS_LIST_HEAD );
-    entryChild = psListGetCurrent( mdList );
-    while ( entryChild != NULL ) {
-        printf("Key Name: %8s  ", entryChild->name);
-        printf("Key Type: %2d  ", entryChild->type);
-
-        switch (entryChild->type ) {
-        case PS_META_BOOL:
-            printf("Key Value: %15d  ", entryChild->data.B);
-            break;
-        case PS_META_S32:
-            printf("Key Value: %15d  ", entryChild->data.S32);
-            break;
-        case PS_META_F32:
-            printf("Key Value: %15.3f  ", entryChild->data.F32);
-            break;
-        case PS_META_F64:
-            printf("Key Value: %15.3f  ", entryChild->data.F64);
-            break;
-        case PS_META_STR:
-            printf("Key Value: %15s  ", (char*)entryChild->data.V);
-            break;
-        case PS_META_IMG:
-        case PS_META_JPEG:
-        case PS_META_PNG:
-        case PS_META_ASTROM:
-        case PS_META_UNKNOWN:
-            printf("Value: unknown ");
-            break;
-        default:
-            printf("Bad type: %d ", entryChild->type);
-        }
-        printf("Key Comment: %s\n", entryChild->comment);
-
-        entryChild = psListGetNext( mdList);
-    }
-}
-
-
-int main( int argc, char* argv[] )
+    printf("Contents of metadata list:\n");
+    printMetadataList(metadata->list);
+    printf("\nContents of metadata table:\n");
+    printMetadataTable(metadata->table);
+}
+
+
+int main(int argc, char* argv[])
 {
     int status = 0;
@@ -169,34 +207,42 @@
 
 
-    // Test D - Attempt to use null file descriptor
-    printNegativeTestHeader(stdout,"psMetadata", "Test D - Attempt to use null file descriptor",
+    // Test D - Remove items with same name from all metadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test D - Remove items with same name from all metadata");
+    printf("Removed HISTORY from all metadata from prior test. Resulting metadata:\n\n");
+    psMetadataRemove(metadata3, 0, "HISTORY");
+    printMetadata(metadata3);
+    printFooter(stdout, "psMetadata", "Test D - Remove items with same name from all metadata", true);
+
+
+    // Test E - Attempt to use null file descriptor
+    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to use null file descriptor",
                             "Null FITS file descriptor not allowed", 0);
     psMetadataFReadHeader(NULL, NULL, 1, NULL);
-    printFooter(stdout, "psMetadata", "Test D - Attempt to use null file descriptor", true);
-
-
-    // Test E - Attempt to use two null inputs
-    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to use two null inputs",
+    printFooter(stdout, "psMetadata", "Test E - Attempt to use null file descriptor", true);
+
+
+    // Test F - Attempt to use two null inputs
+    printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to use two null inputs",
                             "Null extName and extNum = 0 not allowed", 0);
     psMetadataFReadHeader(NULL, NULL, 0, fptr);
-    printFooter(stdout, "psMetadata", "Test E - Attempt to use two null inputs", true);
-
-
-    // Test F - Attempt to use bad extNum
-    printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to use bad extNum",
+    printFooter(stdout, "psMetadata", "Test F - Attempt to use two null inputs", true);
+
+
+    // Test G - Attempt to use bad extNum
+    printNegativeTestHeader(stdout,"psMetadata", "Test G - Attempt to use bad extNum",
                             "FITS error while locating header 22: tried to move past end of file", 0);
     psMetadataFReadHeader(metadata1, NULL, 22, fptr);
-    printFooter(stdout, "psMetadata", "Test F - Attempt to use bad extNum", true);
-
-
-    // Test G - Attempt to use bad extName
-    printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to use bad extName",
+    printFooter(stdout, "psMetadata", "Test G - Attempt to use bad extNum", true);
+
+
+    // Test H - Attempt to use bad extName
+    printNegativeTestHeader(stdout,"psMetadata", "Test H - Attempt to use bad extName",
                             "FITS error while locating header AARGH: illegal HDU number", 0);
     psMetadataFReadHeader(metadata1, "AARGH", 0, fptr);
-    printFooter(stdout, "psMetadata", "Test F - Attempt to use bad extName", true);
-
-
-    // Test H - Free psMetadata
-    printPositiveTestHeader(stdout, "psMetadata", "Test H - Free psMetadata");
+    printFooter(stdout, "psMetadata", "Test H - Attempt to use bad extName", true);
+
+
+    // Test I- Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test I - Free psMetadata");
     psFree(metadata1);
     psFree(metadata2);
@@ -208,5 +254,5 @@
         printf("ERROR: Found %d bad memory blocks\n", nBad);
     }
-    printFooter(stdout, "psMetadata", "Test H - Free psMetadata", true);
+    printFooter(stdout, "psMetadata", "Test I - Free psMetadata", true);
 
     return 0;
