Index: /trunk/archive/pslib/include/psMetaData.h
===================================================================
--- /trunk/archive/pslib/include/psMetaData.h	(revision 185)
+++ /trunk/archive/pslib/include/psMetaData.h	(revision 185)
@@ -0,0 +1,86 @@
+#if !defined(PS_META_DATA_H)
+#define PS_META_DATA_H 1
+
+#include "psImage.h"			// for psImage
+#include "psAstrom.h"			// for psAstrom
+/*
+ * Possible types of metadata.  
+ */
+typedef enum {				// type of val is:
+    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)
+    PS_META_IMG,			// image (.v)
+    PS_META_JPEG,			// JPEG (.v)
+    PS_META_PNG,			// PNG (.v)
+    PS_META_ASTROM,			// astrometric coefficients (.v)
+    PS_META_UNKNOWN,			// other (.v)
+    PS_META_NTYPE			// Number of types; must be last
+} psMetaDataType;
+
+typedef 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
+} psMetaDataFlags;
+
+/*
+ * A struct to define a single item of metadata
+ */
+typedef struct {
+    const int id;			// unique ID for this item
+    
+    char *restrict name;		// Name of item
+    psMetaDataType type;		// type of this item
+    psMetaDataFlags flags;		// flags associated with this item
+    const union {
+	float f;			// floating value
+	int i;				// integer value
+	void *v;			// other type
+    } val;				// value of metadata
+    char *comment;			// optional comment ("", not NULL)
+    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;
+
+/*****************************************************************************/
+/*
+ * Constructors and destructors
+ */
+psMetaDataItem *psMetaDataItemAlloc(
+    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
+    const char *name,			// name of new item of metadata (may be an sprintf format)
+    ...);				// possible arguments for name format
+
+void psMetaDataItemFree(psMetaDataItem *ms); // piece of metadata to destroy
+
+psMetaDataSet *psMetaDataSetAlloc(void);   // make a new set of metadata
+void psMetaDataSetFree(psMetaDataSet *ms); // destroy a set of metadata
+
+/*****************************************************************************/
+/*
+ * Utilities
+ */
+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
