From 7a618fa90aaafa3a28cacae130939c3268e15876 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 6 Jul 2020 19:28:50 +0100 Subject: [PATCH] ECC-1131: Build failures on big endian platform --- src/grib_bits.c | 6 +++ src/grib_bits_fast_big_endian.c | 72 ++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/grib_bits.c b/src/grib_bits.c index fa21c2ba7..f3b770307 100644 --- a/src/grib_bits.c +++ b/src/grib_bits.c @@ -30,6 +30,12 @@ long GRIB_MASK = -1; /* Mask of sword bits */ ((b) == max_nbits ? GRIB_MASK : (~(GRIB_MASK << (b)) << (max_nbits - ((q) + (b))))) +#define VALUE_SIZE_T(p, q, b) \ + (((b) == max_nbits_size_t ? GRIB_MASK : ~(GRIB_MASK << (b))) & ((p) >> (max_nbits_size_t - ((q) + (b))))) + +#define MASKVALUE_SIZE_T(q, b) \ + ((b) == max_nbits_size_t ? GRIB_MASK : (~(GRIB_MASK << (b)) << (max_nbits_size_t - ((q) + (b))))) + static const unsigned long dmasks[] = { 0xFF, 0xFE, diff --git a/src/grib_bits_fast_big_endian.c b/src/grib_bits_fast_big_endian.c index 0f1a14cc9..af852d105 100644 --- a/src/grib_bits_fast_big_endian.c +++ b/src/grib_bits_fast_big_endian.c @@ -114,7 +114,6 @@ char* grib_decode_string(const unsigned char* bitStream, long* bitOffset, size_t return string; } - unsigned long grib_decode_unsigned_long(const unsigned char* p, long* bitp, long nbits) { long countOfLeftmostBits = 0, leftmostBits = 0; @@ -146,6 +145,37 @@ unsigned long grib_decode_unsigned_long(const unsigned char* p, long* bitp, long return val; } +size_t grib_decode_size_t(const unsigned char* p, long* bitp, long nbits) +{ + long countOfLeftmostBits = 0, leftmostBits = 0; + long startBit = *bitp; + long remainingBits = nbits; + long* pp = (long*)p; + size_t val = 0; + + if (startBit >= max_nbits_size_t) { + pp += startBit / max_nbits_size_t; + startBit %= max_nbits_size_t; + } + + countOfLeftmostBits = startBit + remainingBits; + if (countOfLeftmostBits > max_nbits_size_t) { + countOfLeftmostBits = max_nbits_size_t - startBit; + remainingBits -= countOfLeftmostBits; + leftmostBits = (VALUE_SIZE_T(*pp, startBit, countOfLeftmostBits)) << remainingBits; + startBit = 0; + pp++; + } + else + leftmostBits = 0; + + val = leftmostBits + (VALUE_SIZE_T(*pp, startBit, remainingBits)); + + *bitp += nbits; + + return val; +} + int grib_encode_unsigned_long(unsigned char* p, unsigned long val, long* bitp, long nbits) { long* destination = (long*)p; @@ -185,6 +215,46 @@ int grib_encode_unsigned_longb(unsigned char* p, unsigned long val, long* bitp, return grib_encode_unsigned_long(p, val, bitp, nbits); } +int grib_encode_size_t(unsigned char* p, size_t val, long* bitp, long nbits) +{ + long* destination = (long*)p; + long countOfLeftmostBits = 0, nextWord = 0, startBit = 0, remainingBits = 0, rightmostBits = 0; + + startBit = *bitp; + remainingBits = nbits; + + if (startBit >= max_nbits_size_t) { + nextWord = startBit / max_nbits_size_t; + startBit %= max_nbits_size_t; + } + else + nextWord = 0; + + countOfLeftmostBits = startBit + remainingBits; + if (countOfLeftmostBits > max_nbits_size_t) { + countOfLeftmostBits = max_nbits_size_t - startBit; + startBit = max_nbits_size_t - remainingBits; + remainingBits -= countOfLeftmostBits; + destination[nextWord] = + ((destination[nextWord] >> countOfLeftmostBits) << countOfLeftmostBits) + (VALUE_SIZE_T(val, startBit, countOfLeftmostBits)); + startBit = 0; + nextWord++; + } + + rightmostBits = VALUE_SIZE_T(val, max_nbits_size_t - remainingBits, remainingBits); + destination[nextWord] = + (destination[nextWord] & ~MASKVALUE_SIZE_T(startBit, remainingBits)) + (rightmostBits << max_nbits_size_t - (remainingBits + startBit)); + + *bitp += nbits; + return GRIB_SUCCESS; +} + +int grib_encode_size_tb(unsigned char* p, size_t val, long* bitp, long nbits) +{ + return grib_encode_size_t(p, val, bitp, nbits); +} + + #if VECTOR #include "grib_bits_fast_big_endian_vector.c" /* Experimental */ #elif OMP