diff options
Diffstat (limited to 'src/H5Tbit.c')
-rw-r--r-- | src/H5Tbit.c | 176 |
1 files changed, 168 insertions, 8 deletions
diff --git a/src/H5Tbit.c b/src/H5Tbit.c index b9a830d..d80c8b3 100644 --- a/src/H5Tbit.c +++ b/src/H5Tbit.c @@ -11,8 +11,15 @@ */ #define H5T_PACKAGE #include <H5private.h> +#include <H5Eprivate.h> +#include <H5Iprivate.h> #include <H5Tpkg.h> +/* Interface initialization */ +#define PABLO_MASK H5Tbit_mask +static intn interface_initialize_g = FALSE; +#define INTERFACE_INIT NULL + /*------------------------------------------------------------------------- * Function: H5T_bit_copy @@ -40,8 +47,8 @@ H5T_bit_copy (uint8 *dst, size_t dst_offset, const uint8 *src, * Normalize the offset to be a byte number and a bit offset within that * byte. */ - s_idx = src_offset / 8; - d_idx = dst_offset / 8; + s_idx = (intn)src_offset / 8; + d_idx = (intn)dst_offset / 8; src_offset %= 8; dst_offset %= 8; @@ -62,7 +69,7 @@ H5T_bit_copy (uint8 *dst, size_t dst_offset, const uint8 *src, * dst[d_idx+1] dst[d_idx] */ while (src_offset && size>0) { - unsigned nbits = MIN3 (size, 8-dst_offset, 8-src_offset); + unsigned nbits = (unsigned)MIN3 (size, 8-dst_offset, 8-src_offset); unsigned mask = (1<<nbits) - 1; dst[d_idx] &= ~(mask<<dst_offset); @@ -102,9 +109,9 @@ H5T_bit_copy (uint8 *dst, size_t dst_offset, const uint8 *src, * bits). SHIFT is three since the source must be shifted right three bits * to line up with the destination. */ - shift = dst_offset; + shift = (intn)dst_offset; mask_lo = (1<<(8-shift))-1; - mask_hi = ~mask_lo; + mask_hi = (~mask_lo) & 0xff; for (/*void*/; size>8; size-=8, d_idx++, s_idx++) { if (shift) { @@ -119,7 +126,7 @@ H5T_bit_copy (uint8 *dst, size_t dst_offset, const uint8 *src, /* Finish up */ while (size>0) { - unsigned nbits = MIN3 (size, 8-dst_offset, 8-src_offset); + unsigned nbits = (unsigned)MIN3 (size, 8-dst_offset, 8-src_offset); unsigned mask = (1<<nbits) - 1; dst[d_idx] &= ~(mask<<dst_offset); @@ -141,6 +148,94 @@ H5T_bit_copy (uint8 *dst, size_t dst_offset, const uint8 *src, /*------------------------------------------------------------------------- + * Function: H5T_bit_get_d + * + * Purpose: Return a small bit sequence as a number. + * + * Return: Success: The bit sequence interpretted as an unsigned + * integer. + * + * Failure: 0 + * + * Programmer: Robb Matzke + * Tuesday, June 23, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +hsize_t +H5T_bit_get_d (uint8 *buf, size_t offset, size_t size) +{ + hsize_t val=0; + size_t i, hs; + + FUNC_ENTER (H5T_bit_get_d, 0); + assert (8*sizeof(val)>=size); + + H5T_bit_copy ((uint8*)&val, 0, buf, offset, size); + switch (((H5T_t*)(H5I_object(H5T_NATIVE_INT_g)))->u.atomic.order) { + case H5T_ORDER_LE: + break; + + case H5T_ORDER_BE: + for (i=0, hs=sizeof(val)/2; i<hs; i++) { + uint8 tmp = ((uint8*)&val)[i]; + ((uint8*)&val)[i] = ((uint8*)&val)[sizeof(val)-(i+1)]; + ((uint8*)&val)[sizeof(val)-(i+1)] = tmp; + } + break; + + default: + abort (); + } + + FUNC_LEAVE (val); +} + + +/*------------------------------------------------------------------------- + * Function: H5T_bit_set_d + * + * Purpose: Sets part of a bit vector to the specified unsigned value. + * + * Return: void + * + * Programmer: Robb Matzke + * Wednesday, June 24, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +void +H5T_bit_set_d (uint8 *buf, size_t offset, size_t size, hsize_t val) +{ + size_t i, hs; + + assert (8*sizeof(val)>=size); + + switch (((H5T_t*)(H5I_object(H5T_NATIVE_INT_g)))->u.atomic.order) { + case H5T_ORDER_LE: + break; + + case H5T_ORDER_BE: + for (i=0, hs=sizeof(val)/2; i<hs; i++) { + uint8 tmp = ((uint8*)&val)[i]; + ((uint8*)&val)[i] = ((uint8*)&val)[sizeof(val)-(i+1)]; + ((uint8*)&val)[sizeof(val)-(i+1)] = tmp; + } + break; + + default: + abort (); + } + + H5T_bit_copy (buf, offset, (uint8*)&val, 0, size); +} + + +/*------------------------------------------------------------------------- * Function: H5T_bit_set * * Purpose: Sets or clears bits in a contiguous region of a vector @@ -161,7 +256,7 @@ H5T_bit_set (uint8 *buf, size_t offset, size_t size, hbool_t value) intn idx; /* Normalize */ - idx = offset / 8; + idx = (intn)offset / 8; offset %= 8; /* The first partial byte */ @@ -217,7 +312,7 @@ ssize_t H5T_bit_find (uint8 *buf, size_t offset, size_t size, H5T_sdir_t direction, hbool_t value) { - size_t base=offset; + ssize_t base=(ssize_t)offset; ssize_t idx, i; /* Some functions call this with value=TRUE */ @@ -300,3 +395,68 @@ H5T_bit_find (uint8 *buf, size_t offset, size_t size, H5T_sdir_t direction, return -1; } + + +/*------------------------------------------------------------------------- + * Function: H5T_bit_inc + * + * Purpose: Increment part of a bit field by adding 1. + * + * Return: Success: The carry-out value, one if overflow zero + * otherwise. + * + * Failure: FAIL + * + * Programmer: Robb Matzke + * Friday, June 26, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +hbool_t +H5T_bit_inc(uint8 *buf, size_t start, size_t size) +{ + size_t idx = start / 8; + unsigned carry = 1; + unsigned acc, mask; + + assert(buf); + start %= 8; + + /* The first partial byte */ + if (start) { + if (size+start<8) mask = (1<<size)-1; + else mask = (1<<(8-start))-1; + acc = (buf[idx]>>start) & mask; + acc += 1; + carry = acc & (1<<MIN(size, 8-start)); + buf[idx] &= ~(mask<<start); + buf[idx] |= (acc & mask) << start; + size -= MIN(size, 8-start); + start=0; + idx++; + } + + /* The middle */ + while (carry && size>=8) { + acc = buf[idx]; + acc += 1; + carry = acc & 0x100; + buf[idx] = acc & 0xff; + idx++; + size -= 8; + } + + /* The last bits */ + if (carry && size>0) { + mask = (1<<size)-1; + acc = buf[idx] & mask; + acc += 1; + carry = acc & (1<<size); + buf[idx] &= ~mask; + buf[idx] |= acc & mask; + } + + return carry ? TRUE : FALSE; +} |