summaryrefslogtreecommitdiffstats
path: root/src/H5Znbit.c
diff options
context:
space:
mode:
authorXiaowen Wu <wuxiaowe@ncsa.uiuc.edu>2005-02-27 03:58:02 (GMT)
committerXiaowen Wu <wuxiaowe@ncsa.uiuc.edu>2005-02-27 03:58:02 (GMT)
commit67ad854d9dfb9f19af713dac01915f2668332d41 (patch)
treee31860ad11be7bf006d3f340860d4e8ee895de5c /src/H5Znbit.c
parentd7883f21bf2d0d4b7b21397b42520a381364f30f (diff)
downloadhdf5-67ad854d9dfb9f19af713dac01915f2668332d41.zip
hdf5-67ad854d9dfb9f19af713dac01915f2668332d41.tar.gz
hdf5-67ad854d9dfb9f19af713dac01915f2668332d41.tar.bz2
[svn-r10099] Purpose:
Modifications of nbit filter. Description: The nbit filter does not support datatypes other than integer, floating-point as well as array datatype and compound datatype consisting of integer or floating-point. Solution: Change the nbit filter to accept all datatype at the top level, and if the datatype is not what described above, the filter will not do anything to the data instead of generating errors. Slight improvements of the filter's performance. Platforms tested: heping, copper Misc. update:
Diffstat (limited to 'src/H5Znbit.c')
-rw-r--r--src/H5Znbit.c182
1 files changed, 86 insertions, 96 deletions
diff --git a/src/H5Znbit.c b/src/H5Znbit.c
index 96830d4..16b5a2e 100644
--- a/src/H5Znbit.c
+++ b/src/H5Znbit.c
@@ -24,12 +24,14 @@
#ifdef H5_HAVE_FILTER_NBIT
-/* Struct of parameters needed for compressing/decompressing one atomic datatype */
+/* Struct of parameters needed for compressing/decompressing
+ * one nbit atomic datatype: integer or floating-point
+ */
typedef struct {
- size_t size;
- int order;
- int precision;
- int offset;
+ size_t size; /* size of datatype */
+ int order; /* datatype endianness order */
+ int precision; /* datatype precision */
+ int offset; /* datatype offset */
} parms_atomic;
/* Local function prototypes */
@@ -46,27 +48,27 @@ static herr_t H5Z_set_parms_atomic(hid_t type_id, unsigned cd_values[]);
static herr_t H5Z_set_parms_array(hid_t type_id, unsigned cd_values[]);
static herr_t H5Z_set_parms_compound(hid_t type_id, unsigned cd_values[]);
-void H5Z_nbit_next_byte(size_t *j, int *buf_len);
-void H5Z_nbit_decompress_one_byte(void *data, size_t data_offset, int k, int begin_i,
+static void H5Z_nbit_next_byte(size_t *j, int *buf_len);
+static void H5Z_nbit_decompress_one_byte(unsigned char *data, size_t data_offset, int k, int begin_i,
int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int datatype_len);
-void H5Z_nbit_compress_one_byte(void *data, size_t data_offset, int k, int begin_i,
+static void H5Z_nbit_compress_one_byte(unsigned char *data, size_t data_offset, int k, int begin_i,
int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int datatype_len);
-void H5Z_nbit_decompress_one_atomic(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, parms_atomic p);
-void H5Z_nbit_decompress_one_array(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, const unsigned parms[]);
-void H5Z_nbit_decompress_one_compound(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, const unsigned parms[]);
-void H5Z_nbit_decompress(void *data, unsigned d_nelmts, unsigned char *buffer,
- const unsigned parms[]);
-void H5Z_nbit_compress_one_atomic(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, parms_atomic p);
-void H5Z_nbit_compress_one_array(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, const unsigned parms[]);
-void H5Z_nbit_compress_one_compound(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, const unsigned parms[]);
-void H5Z_nbit_compress(void *data, unsigned d_nelmts, unsigned char *buffer,
- size_t *buffer_size, const unsigned parms[]);
+static void H5Z_nbit_decompress_one_atomic(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p);
+static void H5Z_nbit_decompress_one_array(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
+static void H5Z_nbit_decompress_one_compound(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
+static void H5Z_nbit_decompress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+ const unsigned parms[]);
+static void H5Z_nbit_compress_one_atomic(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p);
+static void H5Z_nbit_compress_one_array(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
+static void H5Z_nbit_compress_one_compound(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[]);
+static void H5Z_nbit_compress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+ size_t *buffer_size, const unsigned parms[]);
/* This message derives from H5Z */
H5Z_class_t H5Z_NBIT[1] = {{
@@ -81,7 +83,7 @@ H5Z_class_t H5Z_NBIT[1] = {{
}};
/* Local macros */
-#define H5Z_NBIT_ATOMIC 1 /* Atomic datatype class for nbit */
+#define H5Z_NBIT_ATOMIC 1 /* Atomic datatype class for nbit: integer/floating-point */
#define H5Z_NBIT_ARRAY 2 /* Array datatype class for nbit */
#define H5Z_NBIT_COMPOUND 3 /* Compound datatype class for nbit */
#define H5Z_NBIT_USER_NPARMS 0 /* Number of parameters that users can set */
@@ -92,15 +94,13 @@ H5Z_class_t H5Z_NBIT[1] = {{
/* Local variables */
/*
* cd_values_index: index of array cd_values inside function H5Z_set_local_nbit
- * cd_values_actual_nparms: number of valid entries in array cd_values[]
- * stored as first entry in the filter's cd_values[]
- * compress_ratio_is_zero: flag if TRUE indicating no need to do nbit filter
- * stored as second entry in the filter's cd_values[]
- * parms_index: index of array parms[] used by compression/decompression functions
+ * cd_values_actual_nparms: number of parameters in array cd_values[]
+ * need_not_compress: flag if TRUE indicating no need to do nbit compression
+ * parms_index: index of array parms used by compression/decompression functions
*/
static unsigned cd_values_index = 0;
static unsigned cd_values_actual_nparms = 0;
-static unsigned char compress_ratio_is_zero = FALSE;
+static unsigned char need_not_compress = FALSE;
static unsigned parms_index = 0;
@@ -140,17 +140,6 @@ H5Z_can_apply_nbit(hid_t UNUSED dcpl_id, hid_t type_id, hid_t UNUSED space_id)
if((dtype_size = H5Tget_size(type_id)) == 0)
HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
- /* Codes below do not apply to array or compound datatype */
- if(dtype_class == H5T_INTEGER || dtype_class == H5T_FLOAT) {
- /* Get datatype's endianness order */
- if((dtype_order = H5Tget_order(type_id)) == H5T_ORDER_ERROR)
- HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "can't retrieve datatype endianness order")
-
- /* Range check datatype's endianness order */
- /* (Note: this may not handle non-atomic datatypes well) */
- if(dtype_order != H5T_ORDER_LE && dtype_order != H5T_ORDER_BE)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FALSE, "invalid datatype endianness order")
- }
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5Z_can_apply_nbit() */
@@ -159,7 +148,7 @@ done:
/*-------------------------------------------------------------------------
* Function: H5Z_calc_parms_atomic
*
- * Purpose: Calculate the number of parameters of cd_values[]
+ * Purpose: Calculate the number of parameters of array cd_values[]
* of atomic datatype whose datatype class is integer
* or floating point
*
@@ -195,8 +184,8 @@ static void H5Z_calc_parms_atomic()
/*-------------------------------------------------------------------------
* Function: H5Z_calc_parms_array
*
- * Purpose: Calculate the number of parameters of cd_values[]
- * for given a certain datatype identifier type_id
+ * Purpose: Calculate the number of parameters of array cd_values[]
+ * for a given datatype identifier type_id
* if its datatype class is array datatype
*
* Return: Success: Non-negative
@@ -240,7 +229,7 @@ static herr_t H5Z_calc_parms_array(hid_t type_id)
break;
case H5T_COMPOUND:H5Z_calc_parms_compound(dtype_base);
break;
- default:
+ default:
HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "datatype class not supported by nbit")
} /* end switch */
done:
@@ -251,8 +240,8 @@ done:
/*-------------------------------------------------------------------------
* Function: H5Z_calc_parms_compound
*
- * Purpose: Calculate the number of parameters of cd_values[]
- * for given a certain datatype identifier type_id
+ * Purpose: Calculate the number of parameters of array cd_values[]
+ * for a given datatype identifier type_id
* if its datatype class is compound datatype
*
* Return: Success: Non-negative
@@ -310,7 +299,7 @@ static herr_t H5Z_calc_parms_compound(hid_t type_id)
break;
case H5T_COMPOUND:H5Z_calc_parms_compound(dtype_member);
break;
- default:
+ default:
HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "datatype class not supported by nbit")
} /* end switch */
} /* end for */
@@ -322,7 +311,7 @@ done:
/*-------------------------------------------------------------------------
* Function: H5Z_set_parms_atomic
*
- * Purpose: Set the cd_values[] for given a certain datatype identifier
+ * Purpose: Set the array cd_values[] for a given datatype identifier
* type_id if its datatype class is integer or floating point
*
* Return: Success: Non-negative
@@ -390,10 +379,13 @@ static herr_t H5Z_set_parms_atomic(hid_t type_id, unsigned cd_values[])
/* Set "local" parameter for datatype offset */
cd_values[cd_values_index++] = dtype_offset;
- /* Check the compression ratio at this point */
- if(compress_ratio_is_zero) /* so far the compression ratio is zero */
+ /* If before this point, there is no need to compress, check the need to
+ * compress at this point. If current datatype is not full-precision,
+ * flag need_not_compress should be set to FALSE.
+ */
+ if(need_not_compress) /* so far no need to compress */
if(dtype_offset != 0 || dtype_precision != dtype_size * 8)
- compress_ratio_is_zero = FALSE;
+ need_not_compress = FALSE;
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5Z_set_parms_atomic() */
@@ -402,7 +394,7 @@ done:
/*-------------------------------------------------------------------------
* Function: H5Z_set_parms_array
*
- * Purpose: Set the cd_values[] for given a certain datatype identifier
+ * Purpose: Set the array cd_values[] for a given datatype identifier
* type_id if its datatype class is array datatype
*
* Return: Success: Non-negative
@@ -449,9 +441,9 @@ static herr_t H5Z_set_parms_array(hid_t type_id, unsigned cd_values[])
break;
case H5T_ARRAY: H5Z_set_parms_array(dtype_base, cd_values);
break;
- case H5T_COMPOUND:H5Z_set_parms_compound(dtype_base, cd_values);
+ case H5T_COMPOUND: H5Z_set_parms_compound(dtype_base, cd_values);
break;
- default:
+ default:
HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "datatype class not supported by nbit")
} /* end switch */
done:
@@ -462,7 +454,7 @@ done:
/*-------------------------------------------------------------------------
* Function: H5Z_set_parms_compound
*
- * Purpose: Set the cd_values[] for given a certain datatype identifier
+ * Purpose: Set the array cd_values[] for a given datatype identifier
* type_id if its datatype class is compound datatype
*
* Return: Success: Non-negative
@@ -529,7 +521,7 @@ static herr_t H5Z_set_parms_compound(hid_t type_id, unsigned cd_values[])
break;
case H5T_COMPOUND:H5Z_set_parms_compound(dtype_member, cd_values);
break;
- default:
+ default:
HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "datatype class not supported by nbit")
} /* end switch */
} /* end for */
@@ -571,8 +563,8 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
/* Calculate how many parameters will fill the cd_values array
* First three parameters reserved for:
- * 1. number of valid entries in array cd_values
- * 2. flag if TRUE indicating no need to do nbit filter
+ * 1. number of parameters in array cd_values
+ * 2. flag if TRUE indicating no need to do nbit compression
* 3. number of elements in the chunk
*/
cd_values_actual_nparms = 3;
@@ -582,10 +574,10 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
break;
case H5T_ARRAY: H5Z_calc_parms_array(type_id);
break;
- case H5T_COMPOUND:H5Z_calc_parms_compound(type_id);
+ case H5T_COMPOUND: H5Z_calc_parms_compound(type_id);
+ break;
+ default: /* no need to calculate other datatypes at top level */
break;
- default:
- HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "datatype class not supported by nbit")
} /* end switch */
/* Check if the number of parameters exceed what cd_values[] can store */
@@ -614,8 +606,8 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
/* Set "local" parameter for number of elements in the chunk */
H5_ASSIGN_OVERFLOW(cd_values[cd_values_index++],npoints,hssize_t,unsigned);
- /* Assume compression ratio is zero now, will be changed to FALSE later if not */
- compress_ratio_is_zero = TRUE;
+ /* Assume no need to compress now, will be changed to FALSE later if not */
+ need_not_compress = TRUE;
/* Call appropriate function according to the datatype class */
switch(dtype_class) {
@@ -626,8 +618,8 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
break;
case H5T_COMPOUND:H5Z_set_parms_compound(type_id, cd_values);
break;
- default:
- HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "datatype class not supported by nbit")
+ default: /* no need to set parameters for other datatypes at top level */
+ break;
} /* end switch */
/* Check if calculation of parameters matches with setting of parameters */
@@ -635,7 +627,7 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
/* Finally set the first two entries of cd_values[] */
cd_values[0] = cd_values_actual_nparms;
- cd_values[1] = compress_ratio_is_zero;
+ cd_values[1] = need_not_compress;
/* Modify the filter's parameters for this dataset */
if(H5Pmodify_filter(dcpl_id, H5Z_FILTER_NBIT, flags, cd_values_actual_nparms, cd_values)<0)
@@ -650,7 +642,7 @@ done:
/*-------------------------------------------------------------------------
* Function: H5Z_filter_nbit
*
- * Purpose: Implement an I/O filter for storing packed n-bit data
+ * Purpose: Implement an I/O filter for storing packed nbit data
*
* Return: Success: Size of buffer filtered
* Failure: 0
@@ -680,7 +672,7 @@ H5Z_filter_nbit (unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid nbit aggression level")
/* check if need to do nbit compress or decompress
- * cd_values[1] stores the flag if true indicating compression ratio is 0
+ * cd_values[1] stores the flag if true indicating no need to compress
*/
if (cd_values[1]) {
ret_value = *buf_size;
@@ -736,13 +728,13 @@ done:
* atomic datatype is treated on byte basis
*/
-void H5Z_nbit_next_byte(size_t *j, int *buf_len)
+static void H5Z_nbit_next_byte(size_t *j, int *buf_len)
{
++(*j);
*buf_len = 8 * sizeof(unsigned char);
}
-void H5Z_nbit_decompress_one_byte(void *data, size_t data_offset, int k, int begin_i,
+static void H5Z_nbit_decompress_one_byte(unsigned char *data, size_t data_offset, int k, int begin_i,
int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int datatype_len)
{
int dat_len; /* dat_len is the number of bits to be copied in each data byte */
@@ -768,25 +760,25 @@ int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int d
}
if(*buf_len > dat_len) {
- ((unsigned char *)data)[data_offset + k] =
+ data[data_offset + k] =
((val >> (*buf_len - dat_len)) & ~(~0 << dat_len)) << uchar_offset;
*buf_len -= dat_len;
} else {
- ((unsigned char *)data)[data_offset + k] =
+ data[data_offset + k] =
((val & ~(~0 << *buf_len)) << (dat_len - *buf_len)) << uchar_offset;
dat_len -= *buf_len;
H5Z_nbit_next_byte(j, buf_len);
if(dat_len == 0) return;
val = buffer[*j];
- ((unsigned char *)data)[data_offset + k] |=
+ data[data_offset + k] |=
((val >> (*buf_len - dat_len)) & ~(~0 << dat_len)) << uchar_offset;
*buf_len -= dat_len;
}
}
-void H5Z_nbit_decompress_one_atomic(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, parms_atomic p)
+static void H5Z_nbit_decompress_one_atomic(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p)
{
/* begin_i: the index of byte having first significant bit
end_i: the index of byte having last significant bit */
@@ -821,8 +813,8 @@ void H5Z_nbit_decompress_one_atomic(void *data, size_t data_offset, unsigned cha
}
}
-void H5Z_nbit_decompress_one_array(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, const unsigned parms[])
+static void H5Z_nbit_decompress_one_array(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[])
{
unsigned i, size, base_class, base_size, n, begin_index;
parms_atomic p;
@@ -864,8 +856,8 @@ void H5Z_nbit_decompress_one_array(void *data, size_t data_offset, unsigned char
} /* end switch */
}
-void H5Z_nbit_decompress_one_compound(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, const unsigned parms[])
+static void H5Z_nbit_decompress_one_compound(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[])
{
unsigned i, nmembers, member_offset, member_class, size;
parms_atomic p;
@@ -897,8 +889,8 @@ void H5Z_nbit_decompress_one_compound(void *data, size_t data_offset, unsigned c
}
}
-void H5Z_nbit_decompress(void *data, unsigned d_nelmts, unsigned char *buffer,
- const unsigned parms[])
+static void H5Z_nbit_decompress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+ const unsigned parms[])
{
/* i: index of data, j: index of buffer,
buf_len: number of bits to be filled in current byte */
@@ -907,8 +899,7 @@ void H5Z_nbit_decompress(void *data, unsigned d_nelmts, unsigned char *buffer,
parms_atomic p;
/* may not have to initialize to zeros */
- for(i = 0; i < d_nelmts*parms[4]; i++)
- ((unsigned char *)data)[i] = 0;
+ for(i = 0; i < d_nelmts*parms[4]; i++) data[i] = 0;
/* initialization before the loop */
j = 0;
@@ -944,14 +935,14 @@ void H5Z_nbit_decompress(void *data, unsigned d_nelmts, unsigned char *buffer,
} /* end switch */
}
-void H5Z_nbit_compress_one_byte(void *data, size_t data_offset, int k, int begin_i,
+static void H5Z_nbit_compress_one_byte(unsigned char *data, size_t data_offset, int k, int begin_i,
int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int datatype_len)
{
int dat_len; /* dat_len is the number of bits to be copied in each data byte */
unsigned char val; /* value to be copied in each data byte */
/* initialize value and bits of unsigned char to be copied */
- val = ((unsigned char *)data)[data_offset + k];
+ val = data[data_offset + k];
if(begin_i != end_i) { /* significant bits occupy >1 unsigned char */
if(k == begin_i)
dat_len = 8 - (datatype_len - p.precision - p.offset) % 8;
@@ -980,8 +971,8 @@ int end_i, unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p, int d
}
}
-void H5Z_nbit_compress_one_atomic(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, parms_atomic p)
+static void H5Z_nbit_compress_one_atomic(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, parms_atomic p)
{
/* begin_i: the index of byte having first significant bit
end_i: the index of byte having last significant bit */
@@ -1016,7 +1007,7 @@ void H5Z_nbit_compress_one_atomic(void *data, size_t data_offset, unsigned char
}
}
-void H5Z_nbit_compress_one_array(void *data, size_t data_offset, unsigned char *buffer,
+static void H5Z_nbit_compress_one_array(unsigned char *data, size_t data_offset, unsigned char *buffer,
size_t *j, int *buf_len, const unsigned parms[])
{
unsigned i, size, base_class, base_size, n, begin_index;
@@ -1059,8 +1050,8 @@ void H5Z_nbit_compress_one_array(void *data, size_t data_offset, unsigned char *
} /* end switch */
}
-void H5Z_nbit_compress_one_compound(void *data, size_t data_offset, unsigned char *buffer,
- size_t *j, int *buf_len, const unsigned parms[])
+static void H5Z_nbit_compress_one_compound(unsigned char *data, size_t data_offset,
+ unsigned char *buffer, size_t *j, int *buf_len, const unsigned parms[])
{
unsigned i, nmembers, member_offset, member_class, size;
parms_atomic p;
@@ -1093,8 +1084,8 @@ void H5Z_nbit_compress_one_compound(void *data, size_t data_offset, unsigned cha
}
}
-void H5Z_nbit_compress(void *data, unsigned d_nelmts, unsigned char *buffer, size_t *buffer_size,
- const unsigned parms[])
+static void H5Z_nbit_compress(unsigned char *data, unsigned d_nelmts, unsigned char *buffer,
+ size_t *buffer_size, const unsigned parms[])
{
/* i: index of data, j: index of buffer,
buf_len: number of bits to be filled in current byte */
@@ -1103,8 +1094,7 @@ void H5Z_nbit_compress(void *data, unsigned d_nelmts, unsigned char *buffer, siz
parms_atomic p;
/* must initialize buffer to be zeros */
- for(j = 0; j < *buffer_size; j++)
- buffer[j] = 0;
+ for(j = 0; j < *buffer_size; j++) buffer[j] = 0;
/* initialization before the loop */
j = 0;