summaryrefslogtreecommitdiffstats
path: root/src/H5Tbit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Tbit.c')
-rw-r--r--src/H5Tbit.c119
1 files changed, 117 insertions, 2 deletions
diff --git a/src/H5Tbit.c b/src/H5Tbit.c
index 157da5d..d063137 100644
--- a/src/H5Tbit.c
+++ b/src/H5Tbit.c
@@ -78,7 +78,7 @@ H5T_bit_copy (uint8_t *dst, size_t dst_offset, const uint8_t *src,
* ... v v v v v V V V V V
* ...+---------------+---------------+
* ...|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|
- * ...+---------------+---------------+
+ ...+---------------+---------------+
* dst[d_idx+1] dst[d_idx]
*/
while (src_offset && size>0) {
@@ -161,6 +161,59 @@ H5T_bit_copy (uint8_t *dst, size_t dst_offset, const uint8_t *src,
/*-------------------------------------------------------------------------
+ * Function: H5T_bit_shift
+ *
+ * Purpose: Simulation of hardware shifting. Shifts a bit vector
+ * in a way similar to shifting a variable value, like
+ * value <<= 3, or value >>= 16.
+ *
+ * Return: void
+ *
+ * Programmer: Raymond Lu
+ * Wednesday, Febuary 4, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5T_bit_shift (uint8_t *buf, hssize_t shift_dist, size_t buf_size)
+{
+ uint8_t *tmp_buf;
+ size_t buf_size_bit = 8*buf_size;
+ size_t i;
+
+ FUNC_ENTER_NOAPI_NOINIT(H5T_bit_shift);
+
+ if(!shift_dist)
+ goto done;
+ if(abs(shift_dist) >= buf_size_bit) {
+ H5T_bit_set (buf, 0, buf_size_bit, FALSE);
+ goto done;
+ }
+
+ tmp_buf = (uint8_t*)HDcalloc(buf_size, 1);
+
+ /* Shift vector by making copies */
+ if(shift_dist > 0) /* left shift */
+ H5T_bit_copy (tmp_buf, shift_dist, buf, 0, buf_size_bit-shift_dist);
+ else { /* right shift */
+ shift_dist = -shift_dist;
+ H5T_bit_copy(tmp_buf, 0, buf, shift_dist, buf_size_bit-shift_dist);
+ }
+
+ /* Copy back the vector */
+ for(i=0; i<buf_size; i++)
+ buf[i] = tmp_buf[i];
+
+ HDfree(tmp_buf);
+
+done:
+ FUNC_LEAVE_NOAPI_VOID
+}
+
+
+/*-------------------------------------------------------------------------
* Function: H5T_bit_get_d
*
* Purpose: Return a small bit sequence as a number.
@@ -439,7 +492,7 @@ H5T_bit_inc(uint8_t *buf, size_t start, size_t size)
unsigned acc, mask;
/* Use FUNC_ENTER_NOAPI_NOINIT_NOFUNC here to avoid performance issues */
- FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5T_bit_find);
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5T_bit_inc);
assert(buf);
start %= 8;
@@ -480,3 +533,65 @@ H5T_bit_inc(uint8_t *buf, size_t start, size_t size)
FUNC_LEAVE_NOAPI(carry ? TRUE : FALSE);
}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5T_bit_dec
+ *
+ * Purpose: decrement part of a bit field by 1.
+ * At this moment, START is always 0 and the algorithm only
+ * works from the end to the front for the buffer.
+ *
+ * Return: void
+ *
+ *
+ * Programmer: Raymond Lu
+ * Wednesday, Jan 28, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5T_bit_dec(uint8_t *buf, size_t start, size_t size)
+{
+ size_t idx;
+
+ assert(buf);
+
+ for(idx=0; idx < size/8; idx++) {
+ if(buf[idx] != 0x00) {
+ buf[idx] -= 1;
+ break;
+ } else if(buf[idx]==0x00) {
+ buf[idx] -= 1;
+ }
+ }
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5T_bit_neg
+ *
+ * Purpose: Bit-negate buffer.
+ * At this moment, START is always 0.
+ *
+ * Return: void
+ *
+ * Programmer: Raymond Lu
+ * Wednesday, Jan 28, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5T_bit_neg(uint8_t *buf, size_t start, size_t size)
+{
+ size_t i;
+
+ assert(buf);
+
+ for(i=0; i<size/8; i++)
+ buf[i] = ~(buf[i]);
+}