Index: trunk/archive/pslib/src/Metadata/metadata.c
===================================================================
--- trunk/archive/pslib/src/Metadata/metadata.c	(revision 156)
+++ trunk/archive/pslib/src/Metadata/metadata.c	(revision 164)
@@ -13,15 +13,15 @@
  * Handle sets of metadata
  */
-psMetaDataSet *psMetaDataSetNew(void)	// make a new set of metadata
+psMetaDataSet *psMetaDataSetAlloc(void)	// make a new set of metadata
 {
     psMetaDataSet *ms = psAlloc(sizeof(psMetaDataSet));
 
-    ms->list = psDlistNew(NULL);	// list of metadata
-    ms->table = psHashNew(128);		// hash table
+    ms->list = psDlistAlloc(NULL);	// list of metadata
+    ms->table = psHashAlloc(128);	// hash table
 
     return ms;
 }
 
-void psMetaDataSetDel(psMetaDataSet *ms) // destroy a set of metadata
+void psMetaDataSetFree(psMetaDataSet *ms) // destroy a set of metadata
 {
     if (ms == NULL) {
@@ -29,6 +29,6 @@
     }
     
-    psDlistDel(ms->list, (void (*)(void *))NULL);
-    psHashDel(ms->table, (void (*)(void *))psMetaDataItemDel);
+    psDlistFree(ms->list, (void (*)(void *))NULL);
+    psHashFree(ms->table, (void (*)(void *))psMetaDataItemFree);
 
     psFree(ms);
@@ -43,5 +43,5 @@
  * to the data will be kept.
  */
-psMetaDataItem *psMetaDataItemNew(
+psMetaDataItem *psMetaDataItemAlloc(
     int typeFlags,			// type of this piece of metadata + flags
     const void *data,			// value of new item
@@ -52,5 +52,5 @@
 {
     const psMetaDataType type = typeFlags & PS_META_TYPE_MASK; // the type part of typeFlags
-    const long flags = typeFlags & ~PS_META_TYPE_MASK;	       // the flags part of typeFlags
+    psMetaDataFlags flags = typeFlags & ~PS_META_TYPE_MASK;    // the flags part of typeFlags
     static int id = 0;			// unique ID for an item of metadata
     psMetaDataItem *ms = psAlloc(sizeof(psMetaDataItem));
@@ -94,5 +94,5 @@
       case PS_META_ITEM_SET:
 	*(void **)&ms->val.v = NULL;
-	ms->items = psDlistNew(NULL);
+	ms->items = psDlistAlloc(NULL);
 	break;
 
@@ -106,6 +106,5 @@
 	
       case PS_META_STR:
-	*(void **)&ms->val.v = psAlloc(strlen(data) + 1);
-	strcpy(ms->val.v, data);
+	*(void **)&ms->val.v = psStringCopy(data);
 	break;
 	
@@ -117,4 +116,5 @@
 	*(void **)&ms->val.v = (void *)data;
 	break;
+
       case PS_META_NTYPE:
 	psAbort(__FILE__, "You cannot get here (%d)\n", __LINE__);
@@ -125,5 +125,5 @@
 }
 
-void psMetaDataItemDel(psMetaDataItem *ms)	// piece of metadata to destroy
+void psMetaDataItemFree(psMetaDataItem *ms) // piece of metadata to destroy
 {
     if(ms == NULL) {
@@ -137,10 +137,12 @@
     switch (ms->type) {
       case PS_META_ITEM_SET:
-	psDlistDel(ms->items, (void (*)(void *))NULL); // they're still in the hash table
+	psDlistFree(ms->items, (void (*)(void *))NULL); // they're still in the hash table
 	ms->items = NULL;
 	break;
+	
       case PS_META_FLOAT:
       case PS_META_INT:
 	break;				// nothing to do
+	
       case PS_META_STR:
 	psFree(ms->val.v);
@@ -153,4 +155,5 @@
       case PS_META_UNKNOWN:
 	break;				// we don't own the memory
+	
       case PS_META_NTYPE:
 	psAbort(__FILE__, "You cannot get here (%d)\n", __LINE__);
@@ -177,5 +180,5 @@
 	psMetaDataItem *head = meta;
 	if (head == NULL) {		// this is the first item of this name
-	    head = psMetaDataAppend(ms, psMetaDataItemNew(PS_META_ITEM_SET, NULL, NULL, item->name));
+	    head = psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_ITEM_SET, NULL, NULL, item->name));
 	}	    
 
@@ -199,10 +202,10 @@
 
 	psDlistAppend(head->items, item);
-	psHashInsert(ms->table, item->name, item, (void (*)(void *))psMetaDataItemDel);
+	psHashInsert(ms->table, item->name, item, (void (*)(void *))psMetaDataItemFree);
 
 	return item;
     } else if (meta != NULL) {
 	psError(__func__, "Key \"%s\" is already present in the metaDataSet 0x%x", item->name, ms);
-	//psMetaDataItemDel(item);
+	//psMetaDataItemFree(item);
 
 	return NULL;
@@ -210,5 +213,5 @@
 
     psDlistAppend(ms->list, item);
-    psHashInsert(ms->table, item->name, item, (void (*)(void *))psMetaDataItemDel);
+    psHashInsert(ms->table, item->name, item, (void (*)(void *))psMetaDataItemFree);
 
     return item;
@@ -223,10 +226,24 @@
     assert (ms != NULL && ms->list != NULL && ms->table != NULL);
 
-    void *data = psHashRemove(ms->table, key);
-
-    if (data == NULL) {
+    psMetaDataItem *meta = psHashRemove(ms->table, key);
+
+    if (meta == NULL) {
 	return NULL;
     } else {
-	return psDlistRemove(ms->list, data, PS_DLIST_UNKNOWN);
+	if (meta->flags & PS_META_NON_UNIQUE) {	// it's on someone's ->items list; find that someone
+	    char baseKey[strlen(key) + 1];	// Name without the .nnn tacked on
+	    strcpy(baseKey, key);
+
+	    char *ptr = strrchr(baseKey, '.');
+	    assert (ptr != NULL);
+	    *ptr = '\0';
+
+	    psMetaDataItem *base = psHashLookup(ms->table, baseKey); // here's the non-qualified metadata
+	    assert (base != NULL);
+
+	    return psDlistRemove(base->items, meta, PS_DLIST_UNKNOWN);
+	} else {
+	    return psDlistRemove(ms->list, meta, PS_DLIST_UNKNOWN);
+	}
     }
 }
@@ -301,28 +318,37 @@
 	
 	break;
+	
       case PS_META_FLOAT:
 	fprintf(fd, "%g\n", ms->val.f);
 	break;
+	
       case PS_META_INT:
 	fprintf(fd, "%d\n", ms->val.i);
 	break;
+	
       case PS_META_STR:
 	fprintf(fd, "%s\n", (char *)ms->val.v);
 	break;
+	
       case PS_META_IMG:
 	fprintf(fd, "(IMG)\n");
 	break;
+	
       case PS_META_JPEG:
 	fprintf(fd, "(JPG)\n");
 	break;
+	
       case PS_META_PNG:
 	fprintf(fd, "(PNG)\n");
 	break;
+	
       case PS_META_ASTROM:
 	fprintf(fd, "(ASTROM)\n");
 	break;
+	
       case PS_META_UNKNOWN:
 	fprintf(fd, "(UNKNOWN)\n");
 	break;
+	
       case PS_META_NTYPE:
 	psAbort(__FILE__, "You cannot get here (%d)\n", __LINE__);
@@ -343,21 +369,23 @@
     psSetLogFormat("NM");		// suppress some of the psLogMsg verbosity
 
-    psMetaDataSet *ms = psMetaDataSetNew(); // set of metadata
+    psMetaDataSet *ms = psMetaDataSetAlloc(); // set of metadata
     psMetaDataItem *meta = NULL;	    // used to traverse a set of metadata
 
     for (int i = 0; i < 10; i += 5) {
 	float sqrti = sqrt(i);
-	psMetaDataAppend(ms, psMetaDataItemNew(PS_META_INT, &i, NULL, "const.%d", i));
-	psMetaDataAppend(ms, psMetaDataItemNew(PS_META_FLOAT, &sqrti, "square root", "const.sqrt%d", i));
-    }
-    psMetaDataAppend(ms, psMetaDataItemNew(PS_META_STR | PS_META_NON_UNIQUE,
+	psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_INT, &i, NULL, "const.%d", i));
+	psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_FLOAT, &sqrti, "square root", "const.sqrt%d", i));
+    }
+    psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE,
 					   "Bonjour", "French", "lang.hello"));
-    psMetaDataAppend(ms, psMetaDataItemNew(PS_META_STR | PS_META_NON_UNIQUE,
+    psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE,
 					   "Aloha", "Hawaiian", "lang.hello"));
-    psMetaDataAppend(ms, psMetaDataItemNew(PS_META_STR | PS_META_NON_UNIQUE,
+    psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE,
 					   "Good Morning", "English", "lang.hello"));
     /*
      * Print all metadata starting "lang"
      */
+    psMetaDataItemFree(psMetaDataRemove(ms, "lang.hello.0"));
+
     psMetaDataSetIterator(ms);
     while ((meta = psMetaDataGetNext(ms, "lang")) != NULL) {
@@ -367,5 +395,5 @@
      * Remove a key
      */
-    psMetaDataItemDel(psMetaDataRemove(ms, "lang.hello"));
+    psMetaDataItemFree(psMetaDataRemove(ms, "lang.hello"));
     /*
      * Print all metadata
@@ -388,5 +416,5 @@
      * Clean up
      */
-    psMetaDataSetDel(ms);
+    psMetaDataSetFree(ms);
     /*
      * Check for memory leaks
