Index: trunk/archive/pslib/src/Metadata/metadata.c
===================================================================
--- trunk/archive/pslib/src/Metadata/metadata.c	(revision 707)
+++ trunk/archive/pslib/src/Metadata/metadata.c	(revision 753)
@@ -47,31 +47,27 @@
  */
 psMetadataItem *psMetadataItemAlloc(
-    int typeFlags,			// type of this piece of metadata + flags
-    const void *data,			// value of new item
+    const char *name,			// name of new item of metadata (may be an sprintf format)
+    int format,				// type of this piece of metadata + flags
     const char *comment,		// comment associated with item; may be NULL
+    ...)				// data + possible arguments for name format
+{
+    va_list ap;
+    va_start(ap, comment);
+
+    psMetadataItem *mi = psMetadataItemAllocV(name, format, comment, ap);
+
+    va_end(ap);
+
+    return mi;
+}
+
+psMetadataItem *psMetadataItemAllocV(
     const char *name,			// name of new item of metadata (may be an sprintf format)
-    ...					// possible arguments for name format
-    )
-{
-    va_list ap;
-    va_start(ap, name);
-
-    psMetadataItem *mi = psVMetadataItemAlloc(typeFlags, data, comment, name, ap);
-
-    va_end(ap);
-
-    return mi;
-}
-
-psMetadataItem *psVMetadataItemAlloc(
-    int typeFlags,			// type of this piece of metadata + flags
-    const void *data,			// value of new item
+    int format,				// type of this piece of metadata + flags
     const char *comment,		// comment associated with item; may be NULL
-    const char *name,			// name of new item of metadata (may be an sprintf format)
-    va_list ap				// possible arguments for name format
-    )
-{
-    const psMetadataType type = typeFlags & PS_META_TYPE_MASK; // the type part of typeFlags
-    psMetadataFlags flags = typeFlags & ~PS_META_TYPE_MASK;    // the flags part of typeFlags
+    va_list ap)				// possible arguments for name format
+{
+    const psMetadataType type = format & PS_META_TYPE_MASK; // the type part of format
+    psMetadataFlags flags = format & ~PS_META_TYPE_MASK;    // the flags part of format
     static int id = 0;			// unique ID for an item of metadata
     psMetadataItem *ms = psAlloc(sizeof(psMetadataItem));
@@ -94,35 +90,22 @@
     ms->items = NULL;
 
-    assert (name != NULL);
-    if (strchr(name, '%') != NULL) {
-	static char tmp[201];		// should be enough; we won't overflow even if it isn't
-
-	if(vsnprintf(tmp, sizeof(tmp), name, ap) > sizeof(tmp) - 1) {
-	    psTrace("metadata.name", 1, "Keyword \"%s\" was truncated to \"%s\" upon expansion\n", name, tmp);
-	}
-
-	name = tmp;	    
-    }
-    ms->name = psStringCopy(name);
-
-    ms->comment = psStringCopy(comment == NULL ? "" : comment);
-
     assert (type >= 0 && type < PS_META_NTYPE);
     switch (type) {
       case PS_META_ITEM_SET:
-	*(void **)&ms->val.v = NULL;
+	ms->data.V = NULL;
 	ms->items = psDlistAlloc(NULL);
 	break;
 
-      case PS_META_FLOAT:
-	*(float *)&ms->val.f = *(float *)data;
-	break;
-	
-      case PS_META_INT:
-	*(int *)&ms->val.i = *(int *)data;
+      case PS_META_F32:			// psF32 promoted to psF64 through ...
+      case PS_META_F64:
+	ms->data.F64 = va_arg (ap, psF64);
+	break;
+	
+      case PS_META_S32:
+	ms->data.S32 = va_arg (ap, psS32);
 	break;
 	
       case PS_META_STR:
-	*(void **)&ms->val.v = psStringCopy(data);
+	ms->data.V = psStringCopy(va_arg(ap, char *));
 	break;
 	
@@ -132,5 +115,5 @@
       case PS_META_ASTROM:
       case PS_META_UNKNOWN:
-	*(void **)&ms->val.v = (void *)data;
+	ms->data.V = va_arg(ap, void *);
 	break;
 
@@ -139,4 +122,18 @@
 	break;				// NOTREACHED
     }
+
+    assert (name != NULL);
+    if (strchr(name, '%') != NULL) {
+	static char tmp[201];		// should be enough; we won't overflow even if it isn't
+
+	if(vsnprintf(tmp, sizeof(tmp), name, ap) > sizeof(tmp) - 1) {
+	    psTrace("metadata.name", 1, "Keyword \"%s\" was truncated to \"%s\" upon expansion\n", name, tmp);
+	}
+
+	name = tmp;	    
+    }
+    ms->name = psStringCopy(name);
+
+    ms->comment = psStringCopy(comment == NULL ? "" : comment);
 
     return ms;
@@ -159,10 +156,11 @@
 	break;
 	
-      case PS_META_FLOAT:
-      case PS_META_INT:
+      case PS_META_F32:
+      case PS_META_F64:
+      case PS_META_S32:
 	break;				// nothing to do
 	
       case PS_META_STR:
-	psFree(ms->val.v);
+	psFree(ms->data.V);
 	break;
 	
@@ -198,5 +196,5 @@
 	psMetadataItem *head = meta;
 	if (head == NULL) {		// this is the first item of this name
-	    head = psMetadataAppend(ms, PS_META_ITEM_SET, NULL, NULL, item->name);
+	    head = psMetadataAppend(ms, item->name, PS_META_ITEM_SET, NULL);
 	}	    
 
@@ -224,5 +222,5 @@
 	return item;
     } else if (meta != NULL) {
-	psError(__func__, PS_ERR_UNKNOWN, PS_NEW_ERROR,
+	psError(__func__, PS_ERR_UNKNOWN, 1,
 		"Key \"%s\" is already present in the metaDataSet 0x%x", item->name, ms);
 	psMetadataItemFree(item);
@@ -242,17 +240,13 @@
  */
 psMetadataItem *psMetadataAppend(psMetadata *restrict md, ///< Metadata to add to
-				 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 in sprintf
-				                   ///< format)
-				 ...		   ///< possible arguments for name format
-    )
+    const char *name,			///< name of new item of metadata
+    int format,				///< type of this piece of metadata + flags
+    const char *comment,		///< comment associated with item
+    ...)				///< possible arguments for name format
 {
     va_list ap;
-    va_start(ap, name);
-
-    psMetadataItem *mi = psVMetadataItemAlloc(typeFlags, val, comment, name, ap);
+    va_start(ap, comment);
+
+    psMetadataItem *mi = psMetadataItemAllocV(name, format, comment, ap);
 
     va_end(ap);
@@ -363,14 +357,15 @@
 	break;
 	
-      case PS_META_FLOAT:
-	fprintf(fd, "%g\n", ms->val.f);
-	break;
-	
-      case PS_META_INT:
-	fprintf(fd, "%d\n", ms->val.i);
+      case PS_META_F64:
+      case PS_META_F32:
+	fprintf(fd, "%g\n", ms->data.F32);
+	break;
+	
+      case PS_META_S32:
+	fprintf(fd, "%d\n", ms->data.S32);
 	break;
 	
       case PS_META_STR:
-	fprintf(fd, "%s\n", (char *)ms->val.v);
+	fprintf(fd, "%s\n", (char *)ms->data.V);
 	break;
 	
