changeset 74:b127045af21c

Modified miicv_set... and miicv_inq... routines for better type checking. Removed miicv_set and miicvinq. Routines are now miicv_set[dbl,int,long,str] and miicv_inq[dbl,int,long,str].
author neelin <neelin>
date Fri, 22 Jan 1993 11:37:35 +0000
parents d3c53d43b3ee
children 53402b5f4edd
files libsrc/image_conversion.c
diffstat 1 files changed, 351 insertions(+), 137 deletions(-) [+]
line wrap: on
line diff
--- a/libsrc/image_conversion.c
+++ b/libsrc/image_conversion.c
@@ -10,8 +10,12 @@
                  miicv_free
                  miicv_setdbl
                  miicv_setint
-                 miicv_set
-                 miicv_inq
+                 miicv_setlong
+                 miicv_setstr
+                 miicv_inqdbl
+                 miicv_inqint
+                 miicv_inqlong
+                 miicv_inqstr
                  miicv_ndattach
                  miicv_detach
                  miicv_get
@@ -28,11 +32,15 @@
                  MI_icv_coords_tovar
                  MI_icv_calc_scale
 @CREATED    : July 27, 1992. (Peter Neelin, Montreal Neurological Institute)
-@MODIFIED   : 
+@MODIFIED   : January 22, 1993 (P.N.)
+                 - Modified handling of icv properties with miicv_set<type>.
+                   Removed routine miicv_set. Use routines miicv_setdbl,
+                   miicv_setint, miicv_setlong, miicv_setstr instead (this
+                   gives type checking at compile time).
 ---------------------------------------------------------------------------- */
 
 #ifndef lint
-static char rcsid[] = "$Header: /private-cvsroot/minc/libsrc/image_conversion.c,v 1.8 1992-12-04 08:29:25 neelin Exp $ MINC (MNI)";
+static char rcsid[] = "$Header: /private-cvsroot/minc/libsrc/image_conversion.c,v 1.9 1993-01-22 11:37:35 neelin Exp $ MINC (MNI)";
 #endif
 
 #include <type_limits.h>
@@ -163,6 +171,8 @@
 @OUTPUT     : (none)
 @RETURNS    : MI_ERROR if an error occurs
 @DESCRIPTION: Sets a property of an icv to a given double value
+              Properties cannot be modified while the icv is attached to a 
+              cdf file and variable (see miicv_attach and miicv_detach).
 @METHOD     : 
 @GLOBALS    : 
 @CALLS      : 
@@ -171,71 +181,10 @@
 ---------------------------------------------------------------------------- */
 public int miicv_setdbl(int icvid, int icv_property, double value)
 {
-   MI_SAVE_ROUTINE_NAME("miicv_setdbl");
-
-   MI_CHK_ERR(miicv_set(icvid, icv_property, &value));
-
-   MI_RETURN(MI_NOERROR);
-}
-
-/* ----------------------------- MNI Header -----------------------------------
-@NAME       : miicv_setint
-@INPUT      : icvid        - icv id
-              icv_property - property of icv to set
-              value        - value to set it to
-@OUTPUT     : (none)
-@RETURNS    : MI_ERROR if an error occurs
-@DESCRIPTION: Sets a property of an icv to a given integer value. Note
-              that MI_ICV_ADIM_SIZE and MI_ICV_BDIM_SIZE are converted
-              to long.
-@METHOD     : 
-@GLOBALS    : 
-@CALLS      : 
-@CREATED    : August 7, 1992 (Peter Neelin)
-@MODIFIED   : 
----------------------------------------------------------------------------- */
-public int miicv_setint(int icvid, int icv_property, int value)
-{
-   long lvalue;
-
-   MI_SAVE_ROUTINE_NAME("miicv_setint");
-
-   if ((icv_property==MI_ICV_ADIM_SIZE) || (icv_property==MI_ICV_BDIM_SIZE) ||
-       ((icv_property>=MI_ICV_DIM_SIZE) && 
-        (icv_property<MI_ICV_DIM_SIZE+MI_MAX_IMGDIMS))) {
-      lvalue = (long) value;
-      MI_CHK_ERR(miicv_set(icvid, icv_property, &lvalue))
-   }
-   else
-      MI_CHK_ERR(miicv_set(icvid, icv_property, &value))
-
-   MI_RETURN(MI_NOERROR);
-}
-
-/* ----------------------------- MNI Header -----------------------------------
-@NAME       : miicv_set
-@INPUT      : icvid        - icv id
-              icv_property - property of icv to set
-              value        - value to set it to (note that this is a pointer
-                 so that different types can be passed to the routine, no
-                 value is returned).
-@OUTPUT     : (none)
-@RETURNS    : MI_ERROR if an error occurs
-@DESCRIPTION: Sets a property of an icv to a given value. Properties cannot
-              be modified while the icv is attached to a cdf file and 
-              variable (see miicv_attach and miicv_detach).
-@METHOD     : 
-@GLOBALS    : 
-@CALLS      : 
-@CREATED    : August 7, 1992 (Peter Neelin)
-@MODIFIED   : 
----------------------------------------------------------------------------- */
-public int miicv_set(int icvid, int icv_property, void *value)
-{
    int ival, idim;
    mi_icv_type *icvp;
 
-   MI_SAVE_ROUTINE_NAME("miicv_set");
+   MI_SAVE_ROUTINE_NAME("miicv_setdbl");
 
    /* Check icv id */
    if ((icvp=MI_icv_chkid(icvid)) == NULL) MI_RETURN_ERROR(MI_ERROR);
@@ -250,55 +199,48 @@
    /* Set the property */
    switch (icv_property) {
    case MI_ICV_TYPE:
-      icvp->user_type   = *((nc_type *) value);
+      icvp->user_type   = value;
       icvp->user_typelen= nctypelen(icvp->user_type);
       icvp->user_vmax   = MI_get_default_range(MIvalid_max, icvp->user_type,
                                                icvp->user_sign);
       icvp->user_vmin   = MI_get_default_range(MIvalid_min, icvp->user_type,
                                                icvp->user_sign);
       break;
-   case MI_ICV_SIGN:
-      icvp->user_sign   = MI_get_sign_from_string(icvp->user_type, value);
-      icvp->user_vmax   = MI_get_default_range(MIvalid_max, icvp->user_type,
-                                               icvp->user_sign);
-      icvp->user_vmin   = MI_get_default_range(MIvalid_min, icvp->user_type,
-                                               icvp->user_sign);
-      break;
    case MI_ICV_DO_RANGE:
-      icvp->user_do_range = *((int *) value); break;
+      icvp->user_do_range = value; break;
    case MI_ICV_VALID_MAX:
-      icvp->user_vmax   = *((double *) value); break;
+      icvp->user_vmax   = value; break;
    case MI_ICV_VALID_MIN:
-      icvp->user_vmin   = *((double *) value); break;
+      icvp->user_vmin   = value; break;
    case MI_ICV_DO_NORM:
-      icvp->user_do_norm = *((int *) value); break;
+      icvp->user_do_norm = value; break;
    case MI_ICV_USER_NORM:
-      icvp->user_user_norm = *((int *) value); break;
+      icvp->user_user_norm = value; break;
    case MI_ICV_IMAGE_MAX:
-      icvp->user_imgmax = *((double *) value); break;
+      icvp->user_imgmax = value; break;
    case MI_ICV_IMAGE_MIN:
-      icvp->user_imgmin = *((double *) value); break;
+      icvp->user_imgmin = value; break;
    case MI_ICV_DO_DIM_CONV:
-      icvp->user_do_dimconv = *((int *) value); break;
+      icvp->user_do_dimconv = value; break;
    case MI_ICV_DO_SCALAR:
-      icvp->user_do_scalar = *((int *) value); break;
+      icvp->user_do_scalar = value; break;
    case MI_ICV_XDIM_DIR: 
-      ival = *((int *) value);
+      ival = value;
       icvp->user_xdim_dir = ((ival==MI_ICV_POSITIVE) || 
                              (ival==MI_ICV_NEGATIVE)) ? ival : MI_ICV_ANYDIR;
       break;
    case MI_ICV_YDIM_DIR:
-      ival = *((int *) value);
+      ival = value;
       icvp->user_ydim_dir = ((ival==MI_ICV_POSITIVE) || 
                              (ival==MI_ICV_NEGATIVE)) ? ival : MI_ICV_ANYDIR;
       break;
    case MI_ICV_ZDIM_DIR:
-      ival = *((int *) value);
+      ival = value;
       icvp->user_zdim_dir = ((ival==MI_ICV_POSITIVE) || 
                              (ival==MI_ICV_NEGATIVE)) ? ival : MI_ICV_ANYDIR;
       break;
    case MI_ICV_NUM_IMGDIMS:
-      ival = *((int *) value);
+      ival = value;
       if ((ival<0) || (ival>MI_MAX_IMGDIMS)) {
          MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,
                            "MI_ICV_NUM_IMGDIMS out of range");
@@ -307,17 +249,156 @@
       icvp->user_num_imgdims = ival;
       break;
    case MI_ICV_ADIM_SIZE:
-      icvp->user_dim_size[0] = *((long *) value); break;
+      icvp->user_dim_size[0] = value; break;
    case MI_ICV_BDIM_SIZE:
-      icvp->user_dim_size[1] = *((long *) value); break;
+      icvp->user_dim_size[1] = value; break;
    case MI_ICV_KEEP_ASPECT:
-      icvp->user_keep_aspect = *((int *) value); break;
+      icvp->user_keep_aspect = value; break;
+   case MI_ICV_SIGN:
+      MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,
+                        "Tried to set icv string property to a number");
+      MI_RETURN_ERROR(MI_ERROR);
+      break;
    default:
       /* Check for image dimension properties */
       if ((icv_property>=MI_ICV_DIM_SIZE) && 
           (icv_property<MI_ICV_DIM_SIZE+MI_MAX_IMGDIMS)) {
          idim = icv_property - MI_ICV_DIM_SIZE;
-         icvp->user_dim_size[idim] = *((long *) value);
+         icvp->user_dim_size[idim] = value;
+      }
+      else {
+         MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,
+                           "Tried to set unknown or illegal icv property");
+         MI_RETURN_ERROR(MI_ERROR);
+      }
+      break;
+   }
+
+   MI_RETURN(MI_NOERROR);
+}
+
+/* ----------------------------- MNI Header -----------------------------------
+@NAME       : miicv_setint
+@INPUT      : icvid        - icv id
+              icv_property - property of icv to set
+              value        - value to set it to
+@OUTPUT     : (none)
+@RETURNS    : MI_ERROR if an error occurs
+@DESCRIPTION: Sets a property of an icv to a given integer value.
+              Properties cannot be modified while the icv is attached to a 
+              cdf file and variable (see miicv_attach and miicv_detach).
+@METHOD     : 
+@GLOBALS    : 
+@CALLS      : 
+@CREATED    : August 7, 1992 (Peter Neelin)
+@MODIFIED   : January 22, 1993 (P.N.)
+                 - modified handling of icv properties
+---------------------------------------------------------------------------- */
+public int miicv_setint(int icvid, int icv_property, int value)
+{
+
+   MI_SAVE_ROUTINE_NAME("miicv_setint");
+
+   {MI_CHK_ERR(miicv_setdbl(icvid, icv_property, (double) value))}
+
+   MI_RETURN(MI_NOERROR);
+}
+
+/* ----------------------------- MNI Header -----------------------------------
+@NAME       : miicv_setlong
+@INPUT      : icvid        - icv id
+              icv_property - property of icv to set
+              value        - value to set it to
+@OUTPUT     : (none)
+@RETURNS    : MI_ERROR if an error occurs
+@DESCRIPTION: Sets a property of an icv to a given long integer value.
+              Properties cannot be modified while the icv is attached to a 
+              cdf file and variable (see miicv_attach and miicv_detach).
+@METHOD     : 
+@GLOBALS    : 
+@CALLS      : 
+@CREATED    : January 22, 1993 (Peter Neelin)
+@MODIFIED   : 
+---------------------------------------------------------------------------- */
+public int miicv_setlong(int icvid, int icv_property, long value)
+{
+
+   MI_SAVE_ROUTINE_NAME("miicv_setlong");
+
+   {MI_CHK_ERR(miicv_setdbl(icvid, icv_property, (double) value))}
+
+   MI_RETURN(MI_NOERROR);
+}
+
+/* ----------------------------- MNI Header -----------------------------------
+@NAME       : miicv_setstr
+@INPUT      : icvid        - icv id
+              icv_property - property of icv to set
+              value        - value to set it to
+@OUTPUT     : (none)
+@RETURNS    : MI_ERROR if an error occurs
+@DESCRIPTION: Sets a property of an icv to a given string value. 
+              Properties cannot be modified while the icv is attached to a 
+              cdf file and variable (see miicv_attach and miicv_detach).
+@METHOD     : 
+@GLOBALS    : 
+@CALLS      : 
+@CREATED    : January 22, 1993 (Peter Neelin)
+@MODIFIED   : 
+---------------------------------------------------------------------------- */
+public int miicv_setstr(int icvid, int icv_property, char *value)
+{
+   mi_icv_type *icvp;
+
+   MI_SAVE_ROUTINE_NAME("miicv_setstr");
+
+   /* Check icv id */
+   if ((icvp=MI_icv_chkid(icvid)) == NULL) MI_RETURN_ERROR(MI_ERROR);
+
+   /* Check that the icv is not attached to a file */
+   if (icvp->cdfid != MI_ERROR) {
+      MI_LOG_PKG_ERROR2(MI_ERR_ICVATTACHED, 
+         "Attempt to modify an attached image conversion variable");
+      MI_RETURN_ERROR(MI_ERROR);
+   }
+
+   /* Set the property */
+   switch (icv_property) {
+   case MI_ICV_SIGN:
+      icvp->user_sign   = MI_get_sign_from_string(icvp->user_type, value);
+      icvp->user_vmax   = MI_get_default_range(MIvalid_max, icvp->user_type,
+                                               icvp->user_sign);
+      icvp->user_vmin   = MI_get_default_range(MIvalid_min, icvp->user_type,
+                                               icvp->user_sign);
+      break;
+   case MI_ICV_TYPE:
+   case MI_ICV_DO_RANGE:
+   case MI_ICV_VALID_MAX:
+   case MI_ICV_VALID_MIN:
+   case MI_ICV_DO_NORM:
+   case MI_ICV_USER_NORM:
+   case MI_ICV_IMAGE_MAX:
+   case MI_ICV_IMAGE_MIN:
+   case MI_ICV_DO_DIM_CONV:
+   case MI_ICV_DO_SCALAR:
+   case MI_ICV_XDIM_DIR: 
+   case MI_ICV_YDIM_DIR:
+   case MI_ICV_ZDIM_DIR:
+   case MI_ICV_NUM_IMGDIMS:
+   case MI_ICV_ADIM_SIZE:
+   case MI_ICV_BDIM_SIZE:
+   case MI_ICV_KEEP_ASPECT:
+      MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,
+                        "Tried to set icv numeric property to a string");
+      MI_RETURN_ERROR(MI_ERROR);
+      break;
+   default:
+      /* Check for image dimension properties */
+      if ((icv_property>=MI_ICV_DIM_SIZE) && 
+          (icv_property<MI_ICV_DIM_SIZE+MI_MAX_IMGDIMS)) {
+         MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,
+                           "Tried to set icv numeric property to a string");
+         MI_RETURN_ERROR(MI_ERROR);
       }
       else {
          MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,
@@ -331,7 +412,7 @@
 }
 
 /* ----------------------------- MNI Header -----------------------------------
-@NAME       : miicv_inq
+@NAME       : miicv_inqdbl
 @INPUT      : icvid        - icv id
               icv_property - icv property to get
 @OUTPUT     : value        - value returned
@@ -340,88 +421,221 @@
 @METHOD     : 
 @GLOBALS    : 
 @CALLS      : 
+@CREATED    : January 22, 1993 (Peter Neelin)
+@MODIFIED   : 
+---------------------------------------------------------------------------- */
+public int miicv_inqdbl(int icvid, int icv_property, double *value)
+{
+   int idim;
+   mi_icv_type *icvp;
+
+   MI_SAVE_ROUTINE_NAME("miicv_inqdbl");
+
+   /* Check icv id */
+   if ((icvp=MI_icv_chkid(icvid)) == NULL) MI_RETURN_ERROR(MI_ERROR);
+
+   /* Set the property */
+   switch (icv_property) {
+   case MI_ICV_TYPE:
+      *value = icvp->user_type; break;
+   case MI_ICV_DO_RANGE:
+      *value = icvp->user_do_range; break;
+   case MI_ICV_VALID_MAX:
+      *value = icvp->user_vmax; break;
+   case MI_ICV_VALID_MIN:
+      *value = icvp->user_vmin; break;
+   case MI_ICV_DO_NORM:
+      *value = icvp->user_do_norm; break;
+   case MI_ICV_USER_NORM:
+      *value = icvp->user_user_norm; break;
+   case MI_ICV_IMAGE_MAX:
+      *value = icvp->user_imgmax; break;
+   case MI_ICV_IMAGE_MIN:
+      *value = icvp->user_imgmin; break;
+   case MI_ICV_NORM_MAX:
+      *value = icvp->derv_imgmax; break;
+   case MI_ICV_NORM_MIN:
+      *value = icvp->derv_imgmin; break;
+   case MI_ICV_DO_DIM_CONV:
+      *value = icvp->user_do_dimconv; break;
+   case MI_ICV_DO_SCALAR:
+      *value = icvp->user_do_scalar; break;
+   case MI_ICV_XDIM_DIR: 
+      *value = icvp->user_xdim_dir; break;
+   case MI_ICV_YDIM_DIR:
+      *value = icvp->user_ydim_dir; break;
+   case MI_ICV_ZDIM_DIR:
+      *value = icvp->user_zdim_dir; break;
+   case MI_ICV_NUM_IMGDIMS:
+      *value = icvp->user_num_imgdims; break;
+   case MI_ICV_ADIM_SIZE:
+      *value = icvp->user_dim_size[0]; break;
+   case MI_ICV_BDIM_SIZE:
+      *value = icvp->user_dim_size[1]; break;
+   case MI_ICV_ADIM_STEP:
+      *value = icvp->derv_dim_step[0]; break;
+   case MI_ICV_BDIM_STEP:
+      *value = icvp->derv_dim_step[1]; break;
+   case MI_ICV_ADIM_START:
+      *value = icvp->derv_dim_start[0]; break;
+   case MI_ICV_BDIM_START:
+      *value = icvp->derv_dim_start[1]; break;
+   case MI_ICV_KEEP_ASPECT:
+      *value = icvp->user_keep_aspect; break;
+   case MI_ICV_SIGN:
+      MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,
+                   "Tried to inquire about icv string property as a number");
+      MI_RETURN_ERROR(MI_ERROR);
+      break;
+   default:
+      /* Check for image dimension properties */
+      if ((icv_property>=MI_ICV_DIM_SIZE) && 
+          (icv_property<MI_ICV_DIM_SIZE+MI_MAX_IMGDIMS)) {
+         idim = icv_property - MI_ICV_DIM_SIZE;
+         *value = icvp->user_dim_size[idim];
+      }
+      else if ((icv_property>=MI_ICV_DIM_STEP) && 
+               (icv_property<MI_ICV_DIM_STEP+MI_MAX_IMGDIMS)) {
+         idim = icv_property - MI_ICV_DIM_STEP;
+         *value = icvp->derv_dim_step[idim];
+      }
+      else if ((icv_property>=MI_ICV_DIM_START) && 
+               (icv_property<MI_ICV_DIM_START+MI_MAX_IMGDIMS)) {
+         idim = icv_property - MI_ICV_DIM_START;
+         *value = icvp->derv_dim_start[idim];
+      }
+      else {
+         MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,
+                           "Tried to inquire about unknown icv property");
+         MI_RETURN_ERROR(MI_ERROR);
+      }
+      break;
+   }
+
+   MI_RETURN(MI_NOERROR);
+}
+
+/* ----------------------------- MNI Header -----------------------------------
+@NAME       : miicv_inqint
+@INPUT      : icvid        - icv id
+              icv_property - icv property to get
+@OUTPUT     : value        - value returned
+@RETURNS    : MI_ERROR if an error occurs
+@DESCRIPTION: Gets the value of an icv property
+@METHOD     : 
+@GLOBALS    : 
+@CALLS      : 
+@CREATED    : January 22, 1993 (Peter Neelin)
+@MODIFIED   : 
+---------------------------------------------------------------------------- */
+public int miicv_inqint(int icvid, int icv_property, int *value)
+{
+   double dvalue;
+
+   MI_SAVE_ROUTINE_NAME("miicv_inqint");
+
+   {MI_CHK_ERR(miicv_inqdbl(icvid, icv_property, &dvalue))}
+   *value = dvalue;
+
+   MI_RETURN(MI_NOERROR);
+}
+
+/* ----------------------------- MNI Header -----------------------------------
+@NAME       : miicv_inqlong
+@INPUT      : icvid        - icv id
+              icv_property - icv property to get
+@OUTPUT     : value        - value returned
+@RETURNS    : MI_ERROR if an error occurs
+@DESCRIPTION: Gets the value of an icv property
+@METHOD     : 
+@GLOBALS    : 
+@CALLS      : 
+@CREATED    : January 22, 1993 (Peter Neelin)
+@MODIFIED   : 
+---------------------------------------------------------------------------- */
+public int miicv_inqlong(int icvid, int icv_property, long *value)
+{
+   double dvalue;
+
+   MI_SAVE_ROUTINE_NAME("miicv_inqlong");
+
+   {MI_CHK_ERR(miicv_inqdbl(icvid, icv_property, &dvalue))}
+   *value = dvalue;
+
+   MI_RETURN(MI_NOERROR);
+}
+
+/* ----------------------------- MNI Header -----------------------------------
+@NAME       : miicv_inqstr
+@INPUT      : icvid        - icv id
+              icv_property - icv property to get
+@OUTPUT     : value        - value returned. Caller must allocate enough 
+                 space for return string.
+@RETURNS    : MI_ERROR if an error occurs
+@DESCRIPTION: Gets the value of an icv property
+@METHOD     : 
+@GLOBALS    : 
+@CALLS      : 
 @CREATED    : 
 @MODIFIED   : 
 ---------------------------------------------------------------------------- */
-public int miicv_inq(int icvid, int icv_property, void *value)
+public int miicv_inqstr(int icvid, int icv_property, char *value)
 {
-   int idim;
    mi_icv_type *icvp;
 
-   MI_SAVE_ROUTINE_NAME("miicv_inq");
+   MI_SAVE_ROUTINE_NAME("miicv_inqstr");
 
    /* Check icv id */
    if ((icvp=MI_icv_chkid(icvid)) == NULL) MI_RETURN_ERROR(MI_ERROR);
 
    /* Set the property */
    switch (icv_property) {
+   case MI_ICV_SIGN:
+      if (icvp->user_sign==MI_PRIV_SIGNED)
+         (void) strcpy(value, MI_SIGNED);
+      else if (icvp->user_sign==MI_PRIV_UNSIGNED)
+         (void) strcpy(value, MI_UNSIGNED);
+      else
+         (void) strcpy(value, MI_EMPTY_STRING);
+      break;
    case MI_ICV_TYPE:
-      *((nc_type *) value) = icvp->user_type; break;
-   case MI_ICV_SIGN:
-      *((char **) value) = (icvp->user_sign==MI_PRIV_SIGNED)   ? MI_SIGNED :
-                           (icvp->user_sign==MI_PRIV_UNSIGNED) ? MI_UNSIGNED :
-                                                             MI_EMPTY_STRING;
-      break;
    case MI_ICV_DO_RANGE:
-      *((int *) value) = icvp->user_do_range; break;
    case MI_ICV_VALID_MAX:
-      *((double *) value) = icvp->user_vmax; break;
    case MI_ICV_VALID_MIN:
-      *((double *) value) = icvp->user_vmin; break;
    case MI_ICV_DO_NORM:
-      *((int *) value) = icvp->user_do_norm; break;
    case MI_ICV_USER_NORM:
-      *((int *) value) = icvp->user_user_norm; break;
    case MI_ICV_IMAGE_MAX:
-      *((double *) value) = icvp->user_imgmax; break;
    case MI_ICV_IMAGE_MIN:
-      *((double *) value) = icvp->user_imgmin; break;
    case MI_ICV_NORM_MAX:
-      *((double *) value) = icvp->derv_imgmax; break;
    case MI_ICV_NORM_MIN:
-      *((double *) value) = icvp->derv_imgmin; break;
    case MI_ICV_DO_DIM_CONV:
-      *((int *) value) = icvp->user_do_dimconv; break;
    case MI_ICV_DO_SCALAR:
-      *((int *) value) = icvp->user_do_scalar; break;
    case MI_ICV_XDIM_DIR: 
-      *((int *) value) = icvp->user_xdim_dir; break;
    case MI_ICV_YDIM_DIR:
-      *((int *) value) = icvp->user_ydim_dir; break;
    case MI_ICV_ZDIM_DIR:
-      *((int *) value) = icvp->user_zdim_dir; break;
    case MI_ICV_NUM_IMGDIMS:
-      *((int *) value) = icvp->user_num_imgdims; break;
    case MI_ICV_ADIM_SIZE:
-      *((long *) value) = icvp->user_dim_size[0]; break;
    case MI_ICV_BDIM_SIZE:
-      *((long *) value) = icvp->user_dim_size[1]; break;
    case MI_ICV_ADIM_STEP:
-      *((double *) value) = icvp->derv_dim_step[0]; break;
    case MI_ICV_BDIM_STEP:
-      *((double *) value) = icvp->derv_dim_step[1]; break;
    case MI_ICV_ADIM_START:
-      *((double *) value) = icvp->derv_dim_start[0]; break;
    case MI_ICV_BDIM_START:
-      *((double *) value) = icvp->derv_dim_start[1]; break;
    case MI_ICV_KEEP_ASPECT:
-      *((int *) value) = icvp->user_keep_aspect; break;
+      MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,
+                  "Tried to inquire about icv numeric property as a string");
+      MI_RETURN_ERROR(MI_ERROR);
+      break;
    default:
       /* Check for image dimension properties */
-      if ((icv_property>=MI_ICV_DIM_SIZE) && 
-          (icv_property<MI_ICV_DIM_SIZE+MI_MAX_IMGDIMS)) {
-         idim = icv_property - MI_ICV_DIM_SIZE;
-         *((long *) value) = icvp->user_dim_size[idim];
-      }
-      else if ((icv_property>=MI_ICV_DIM_STEP) && 
-               (icv_property<MI_ICV_DIM_STEP+MI_MAX_IMGDIMS)) {
-         idim = icv_property - MI_ICV_DIM_STEP;
-         *((double *) value) = icvp->derv_dim_step[idim];
-      }
-      else if ((icv_property>=MI_ICV_DIM_START) && 
-               (icv_property<MI_ICV_DIM_START+MI_MAX_IMGDIMS)) {
-         idim = icv_property - MI_ICV_DIM_START;
-         *((double *) value) = icvp->derv_dim_start[idim];
+      if (((icv_property>=MI_ICV_DIM_SIZE) && 
+           (icv_property<MI_ICV_DIM_SIZE+MI_MAX_IMGDIMS)) ||
+          ((icv_property>=MI_ICV_DIM_STEP) && 
+           (icv_property<MI_ICV_DIM_STEP+MI_MAX_IMGDIMS)) ||
+          ((icv_property>=MI_ICV_DIM_START) && 
+           (icv_property<MI_ICV_DIM_START+MI_MAX_IMGDIMS))) {
+         MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,
+                  "Tried to inquire about icv numeric property as a string");
+         MI_RETURN_ERROR(MI_ERROR);
       }
       else {
          MI_LOG_PKG_ERROR2(MI_ERR_BADPROP,