Index: trunk/archive/pslib/src/Metadata/psMetaData.h
===================================================================
--- trunk/archive/pslib/src/Metadata/psMetaData.h	(revision 141)
+++ trunk/archive/pslib/src/Metadata/psMetaData.h	(revision 156)
@@ -8,5 +8,6 @@
  */
 typedef enum {				// type of val is:
-    PS_META_FLOAT = 0,			// float (.f)
+    PS_META_ITEM_SET = 0,		// NULL; metadata is in psMetaDataType.items
+    PS_META_FLOAT,			// float (.f)
     PS_META_INT,			// int (.i)
     PS_META_STR,			// string (.v)
@@ -19,4 +20,10 @@
 } psMetaDataType;
 
+enum {
+    PS_META_TYPE_MASK =     0xffff,	// the type enum must fit in this mask
+    PS_META_UNIQUE =       0x10000,	// the name must be unique (default)
+    PS_META_NON_UNIQUE =   0x20000,	// the name may be repeated, and should be disambiguated for us
+};
+
 /*
  * A struct to define a single item of metadata
@@ -25,6 +32,7 @@
     const int id;			// unique ID for this item
     
-    char *name;				// Name of item
+    char *restrict name;		// Name of item
     psMetaDataType type;		// type of this item
+    int flags;				// flags associated with this item
     const union {
 	float f;			// floating value
@@ -33,5 +41,14 @@
     } val;				// value of metadata
     char *comment;			// optional comment ("", not NULL)
-} psMetaData;
+    psDlist *restrict items;		// list of psMetaDataItems with the same name
+} psMetaDataItem;
+
+/*
+ * A set of metadata
+ */
+typedef struct {
+    psDlist *restrict list;		// list of psMetaDataItem
+    psHash *restrict table;		// hash table of the same metadata
+} psMetaDataSet;
 
 /*****************************************************************************/
@@ -39,14 +56,17 @@
  * Constructors and destructors
  */
-psMetaData *psMetaDataNew(
-    const char *name,			// name of new item of metadata
-    psMetaDataType type,		// type of this piece of metadata
+psMetaDataItem *psMetaDataItemNew(
+    int typeFlags,			// type of this piece of metadata + flags
     const void *val,			// value of new item
     					// N.b. a pointer even if the item
     					// is of type e.g. int
     const char *comment,		// comment associated with item
-    int copy);				// always copy data; NOTUSED
+    const char *name,			// name of new item of metadata (may be an sprintf format)
+    ...);				// possible arguments for name format
 
-void psMetaDataDel(psMetaData *ms);	// piece of metadata to destroy
+void psMetaDataItemDel(psMetaDataItem *ms); // piece of metadata to destroy
+
+psMetaDataSet *psMetaDataSetNew(void);	  // make a new set of metadata
+void psMetaDataSetDel(psMetaDataSet *ms); // destroy a set of metadata
 
 /*****************************************************************************/
@@ -54,7 +74,13 @@
  * Utilities
  */
-void psMetaDataPrint(FILE *fd,		// file descriptor to write to
-		     const psMetaData *ms); // item of metadata to print
+psMetaDataItem *psMetaDataAppend(psMetaDataSet *restrict ms, psMetaDataItem *restrict item);
+psMetaDataItem *psMetaDataRemove(psMetaDataSet *restrict ms, const char *restrict key);
 
+void psMetaDataSetIterator(psMetaDataSet *ms);
+psMetaDataItem *psMetaDataGetNext(psMetaDataSet *restrict ms, const char *restrict match);
+psMetaDataItem *psMetaDataLookup(const psMetaDataSet *restrict ms, const char *restrict key);
 
+void psMetaDataItemPrint(FILE *fd,		// file descriptor to write to
+			 const psMetaDataItem *restrict ms, // item of metadata to print
+			 const char *prefix);	   // print this at the beginning of each line
 #endif
