Index: trunk/psModules/src/pslib/psMetadataItemParse.c
===================================================================
--- trunk/psModules/src/pslib/psMetadataItemParse.c	(revision 6872)
+++ trunk/psModules/src/pslib/psMetadataItemParse.c	(revision 6874)
@@ -1,4 +1,8 @@
 #include <stdio.h>
 #include "pslib.h"
+
+# define PS_METADATA_ITEM_PARSE_NUMBER(INTYPE,OUTTYPE) \
+case PS_DATA_##INTYPE: { \
+    return (ps##OUTTYPE)(item->data.INTYPE); } \
 
 psF32 psMetadataItemParseF32(psMetadataItem *item
@@ -6,12 +10,12 @@
 {
     switch (item->type) {
-    case PS_DATA_F32:
-        return item->data.F32;
-    case PS_DATA_F64:
-        // Assume it's OK to truncate to floating point from double
-        return (float)item->data.F64;
-    case PS_DATA_S32:
-        // Promote to float
-        return (float)item->data.S32;
+        PS_METADATA_ITEM_PARSE_NUMBER (F32, F32);
+        PS_METADATA_ITEM_PARSE_NUMBER (F64, F32);
+        PS_METADATA_ITEM_PARSE_NUMBER (S8,  F32);
+        PS_METADATA_ITEM_PARSE_NUMBER (S16, F32);
+        PS_METADATA_ITEM_PARSE_NUMBER (S32, F32);
+        PS_METADATA_ITEM_PARSE_NUMBER (U8,  F32);
+        PS_METADATA_ITEM_PARSE_NUMBER (U16, F32);
+        PS_METADATA_ITEM_PARSE_NUMBER (U32, F32);
     default:
         psError(PS_ERR_IO, true, "Item %s (%s) is not of floating point type (%x) --- treating as NaN.\n",
@@ -25,12 +29,12 @@
 {
     switch (item->type) {
-    case PS_TYPE_F64:
-        return item->data.F64;
-    case PS_TYPE_F32:
-        // Promote to double
-        return (double)item->data.F32;
-    case PS_TYPE_S32:
-        // Promote to double
-        return (double)item->data.S32;
+        PS_METADATA_ITEM_PARSE_NUMBER (F32, F64);
+        PS_METADATA_ITEM_PARSE_NUMBER (F64, F64);
+        PS_METADATA_ITEM_PARSE_NUMBER (S8,  F64);
+        PS_METADATA_ITEM_PARSE_NUMBER (S16, F64);
+        PS_METADATA_ITEM_PARSE_NUMBER (S32, F64);
+        PS_METADATA_ITEM_PARSE_NUMBER (U8,  F64);
+        PS_METADATA_ITEM_PARSE_NUMBER (U16, F64);
+        PS_METADATA_ITEM_PARSE_NUMBER (U32, F64);
     default:
         psError(PS_ERR_IO, true, "Item %s (%s) is not of double-precision floating point type (%x) "
@@ -61,4 +65,10 @@
 }
 
+# define PS_METADATA_ITEM_PARSE_STRING(TYPE,MODE) \
+case PS_DATA_##TYPE: { \
+    psString value = NULL; \
+    psStringAppend(&value, MODE, item->data.TYPE); \
+    return value; } \
+
 psString psMetadataItemParseString(psMetadataItem *item
                                   )
@@ -67,14 +77,14 @@
     case PS_DATA_STRING:
         return psMemIncrRefCounter(item->data.V);
-    case PS_DATA_F32: {
-            psString value = NULL;    // String to return
-            psStringAppend(&value, "%f", item->data.F32);
-            return value;
-        }
-    case PS_DATA_S32: {
-            psString value = NULL;    // String to return
-            psStringAppend(&value, "%d", item->data.S32);
-            return value;
-        }
+
+        PS_METADATA_ITEM_PARSE_STRING(F32, "%f");
+        PS_METADATA_ITEM_PARSE_STRING(F64, "%f");
+        PS_METADATA_ITEM_PARSE_STRING(S8,  "%d");
+        PS_METADATA_ITEM_PARSE_STRING(S16, "%d");
+        PS_METADATA_ITEM_PARSE_STRING(S32, "%d");
+        PS_METADATA_ITEM_PARSE_STRING(U8,  "%d");
+        PS_METADATA_ITEM_PARSE_STRING(U16, "%d");
+        PS_METADATA_ITEM_PARSE_STRING(U32, "%d");
+
     default:
         psError(PS_ERR_IO, true, "Item %s (%s) is not of string type (%x) --- treating as "
@@ -84,2 +94,17 @@
 }
 
+
+# if 0
+case PS_DATA_F32:
+{
+psString value = NULL;    // String to return
+psStringAppend(&value, "%f", item->data.F32);
+    return value;
+}
+case PS_DATA_S32:
+{
+    psString value = NULL;    // String to return
+    psStringAppend(&value, "%d", item->data.S32);
+    return value;
+}
+# endif
