Index: trunk/psModules/src/astrom/pmFPAConstruct.c
===================================================================
--- trunk/psModules/src/astrom/pmFPAConstruct.c	(revision 6873)
+++ trunk/psModules/src/astrom/pmFPAConstruct.c	(revision 6874)
@@ -104,4 +104,6 @@
         return NULL;
     }
+    // XXX EAM test
+    fprintf (stderr, "phu name: %s == %s\n", keyword, name);
     return psMetadataItemParseString(resultItem);
 }
Index: trunk/psModules/src/objects/psEllipse.c
===================================================================
--- trunk/psModules/src/objects/psEllipse.c	(revision 6873)
+++ 	(revision )
@@ -1,62 +1,0 @@
-# include "pslib.h"
-# include "psEllipse.h"
-
-EllipseAxes EllipseMomentsToAxes (EllipseMoments moments)
-{
-
-    EllipseAxes axes;
-
-    double f = sqrt (0.25*PS_SQR(moments.x2 - moments.y2) + PS_SQR(moments.xy));
-    if (f > (moments.x2 + moments.y2) / 2.0) {
-        f = 0.98*(moments.x2 + moments.y2) / 2.0;
-    }
-
-    axes.major = sqrt (0.5*(moments.x2 + moments.y2) + f);
-    axes.minor = sqrt (0.5*(moments.x2 + moments.y2) - f);
-    axes.theta = atan2 (2*moments.xy, moments.x2 - moments.y2) / 2;
-    // theta in radians
-
-    return (axes);
-}
-
-EllipseShape EllipseAxesToShape (EllipseAxes axes)
-{
-
-    EllipseShape shape;
-
-    double r1 = 1.0 / PS_SQR(axes.major) + 1.0 / PS_SQR(axes.minor);
-    double r2 = 1.0 / PS_SQR(axes.major) - 1.0 / PS_SQR(axes.minor);
-
-    double sxr = r1 + r2*cos(2*axes.theta);
-    double syr = r1 - r2*cos(2*axes.theta);
-
-    shape.sx = 1.0 / sqrt(sxr);
-    shape.sy = 1.0 / sqrt(syr);
-    shape.sxy = r2*sin(2*axes.theta);
-
-    return (shape);
-}
-
-EllipseAxes EllipseShapeToAxes (EllipseShape shape)
-{
-
-    EllipseAxes axes;
-
-    double f1 = 1.0 / PS_SQR(shape.sx) + 1.0 / PS_SQR(shape.sy);
-    double f2 = 1.0 / PS_SQR(shape.sx) - 1.0 / PS_SQR(shape.sy);
-
-    // force the axis ratio to be less than 10
-    double r1 = 0.5*0.95*sqrt (PS_SQR(f1) - PS_SQR(f2));
-
-    shape.sxy = PS_MIN(PS_MAX(shape.sxy, -r1), r1);
-
-    axes.theta = atan2 (-2.0*shape.sxy, f2) / 2.0;
-
-    double Ar = 0.25*f1 + 0.25*sqrt(PS_SQR(f2) + 4*PS_SQR(shape.sxy));
-    double Br = 0.25*f1 - 0.25*sqrt(PS_SQR(f2) + 4*PS_SQR(shape.sxy));
-
-    axes.minor = 1.0 / sqrt (Ar);
-    axes.major = 1.0 / sqrt (Br);
-
-    return (axes);
-}
Index: trunk/psModules/src/objects/psEllipse.h
===================================================================
--- trunk/psModules/src/objects/psEllipse.h	(revision 6873)
+++ 	(revision )
@@ -1,30 +1,0 @@
-// strucures to define elliptical shape parameters
-typedef struct
-{
-    double major;
-    double minor;
-    double theta;
-}
-EllipseAxes;
-
-typedef struct
-{
-    double x2;
-    double y2;
-    double xy;
-}
-EllipseMoments;
-
-typedef struct
-{
-    double sx;
-    double sy;
-    double sxy;
-}
-EllipseShape;
-
-// conversions between elliptical shape representations
-EllipseAxes EllipseMomentsToAxes (EllipseMoments moments);
-EllipseShape EllipseAxesToShape (EllipseAxes axes);
-EllipseAxes EllipseShapeToAxes (EllipseShape shape);
-
Index: trunk/psModules/src/pslib/psMetadataItemParse.c
===================================================================
--- trunk/psModules/src/pslib/psMetadataItemParse.c	(revision 6873)
+++ 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
