67 #include "cyg-ieee754.h" 72 #include "rnr/rnrconfig.h" 94 #error "The netmsgs package requires 8-bit bytes." 97 #if USHRT_MAX != 0xffff 98 #error "The netmsgs package requires 16-bit shorts." 101 #if UINT_MAX != 0xffffffff 102 #error "The netmsgs package requires 32-bit integers." 108 #if __BYTE_ORDER == __BIG_ENDIAN 109 #define HOST_BIG_ENDIAN 111 #define HOST_LITTLE_ENDIAN 115 #define HOST_WORD_SIZE 64 117 #define HOST_WORD_SIZE 32 124 #ifdef HOST_BIG_ENDIAN 135 static inline void packbig(byte_t *p,
size_t size, byte_t buf[])
155 static inline void unpackbig(byte_t buf[], byte_t *p,
size_t size)
175 static inline void packlittle(byte_t *p,
size_t size, byte_t buf[])
216 #define PACKNATIVE(val, buf) packbig((byte_t *)&(val), sizeof(val), buf) 226 #define UNPACKNATIVE(buf, pval) unpackbig(buf, (byte_t *)pval, sizeof(*pval)) 238 #define PACK64NATIVE(uMSB, uLSB, buf) PACK64BIG(uMSB, uLSB, buf) 250 #define UNPACK64NATIVE(buf, puMSB, puLSB) UNPACK64BIG(buf, puMSB, puLSB) 256 #else // HOST_LITTLE_ENDIAN 267 static inline void packbig(byte_t *p,
size_t size, byte_t buf[])
288 static inline void unpackbig(byte_t buf[], byte_t *p,
size_t size)
309 static inline void packlittle(byte_t *p,
size_t size, byte_t buf[])
329 static inline void unpacklittle(byte_t buf[], byte_t *p,
size_t size)
348 #define PACKNATIVE(val, buf) packlittle((byte_t *)&(val), sizeof(val), buf) 358 #define UNPACKNATIVE(buf, pval) unpacklittle(buf, (byte_t *)pval, sizeof(*pval)) 370 #define PACK64NATIVE(uMSB, uLSB, buf) PACK64LITTLE(uMSB, uLSB, buf) 382 #define UNPACK64NATIVE(buf, puMSB, puLSB) UNPACK64LITTLE(buf, puMSB, puLSB) 384 #endif // HOST_BIG_ENDIAN 397 #define PACKBIG(val, buf) packbig((byte_t *)&(val), sizeof(val), buf) 405 #define UNPACKBIG(buf, pval) unpackbig(buf, (byte_t *)pval, sizeof(*pval)); 413 #define PACKLITTLE(val, buf) packlittle((byte_t *)&(val), sizeof(val), buf) 421 #define UNPACKLITTLE(buf, pval) unpacklittle(buf, (byte_t *)pval, sizeof(*pval)) 436 #define PACK64BIG(uMSB, uLSB, buf) \ 439 PACKBIG(uMSB, buf); \ 440 PACKBIG(uLSB, &(buf)[4]); \ 457 #define UNPACK64BIG(buf, puMSB, puLSB) \ 460 UNPACKBIG(buf, puMSB); \ 461 UNPACKBIG(&(buf)[4], puLSB); \ 477 #define PACK64LITTLE(uMSB, uLSB, buf) \ 480 PACKLITTLE(uLSB, buf); \ 481 PACKLITTLE(uMSB, &(buf)[4]); \ 498 #define UNPACK64LITTLE(buf, puMSB, puLSB) \ 501 UNPACKLITTLE(buf, puLSB); \ 502 UNPACKLITTLE(&(buf)[4], puMSB); \ 516 #define IEEE754_F32_SIGN_SHIFT 31 517 #define IEEE754_F32_SIGN_MASK 0x00000001
518 #define IEEE754_F32_EXPONENT_SHIFT 23
519 #define IEEE754_F32_EXPONENT_MASK 0x000000ff
520 #define IEEE754_F32_MANTISSA_SHIFT 0
521 #define IEEE754_F32_MANTISSA_MASK 0x007fffff
531 #define IEEE754_F64_SIGN_SHIFT 31 532 #define IEEE754_F64_SIGN_MASK 0x00000001
533 #define IEEE754_F64_EXPONENT_SHIFT 20
534 #define IEEE754_F64_EXPONENT_MASK 0x000007ff
535 #define IEEE754_F64_MANTISSA0_SHIFT 0
536 #define IEEE754_F64_MANTISSA0_MASK 0x000fffff
537 #define IEEE754_F64_MANTISSA1_SHIFT 0
538 #define IEEE754_F64_MANTISSA1_MASK 0xffffffff
543 #define IEEE754_F32_F64_MANTISSA0_SHIFT 3 544 #define IEEE754_F32_F64_MANTISSA1_SHIFT 29
545 #define IEEE754_F32_F64_MANTISSA1_MASK 0x00000007
550 #define IEEE754_F32_EXP_MAX 127 551 #define IEEE754_F32_EXP_MIN (-126)
552 #define IEEE754_F64_EXP_MAX 1023
553 #define IEEE754_F64_EXP_MIN (-1022)
558 #define IEEE754_F32_POS_INF HUGE_VALF 559 #define IEEE754_F32_NEG_INF (-HUGE_VALF)
560 #define IEEE754_F64_POS_INF HUGE_VAL
561 #define IEEE754_F64_NEG_INF (-HUGE_VAL)
570 .ieee.mantissa = 0x400000,
580 .ieee.mantissa0 = 0x80000,
633 return (f.ieee.exponent == IEEE754_F32_NaN.ieee.exponent)
634 && (f.ieee.mantissa != 0)?
true:
false;
644 return (d.ieee.exponent == IEEE754_F64_NaN.ieee.exponent)
645 && ((d.ieee.mantissa0 != 0) || (d.ieee.mantissa1 != 0))?
true:
false;
655 return (f.ieee.exponent == IEEE754_F32_Inf.ieee.exponent)
656 && (f.ieee.mantissa == 0)?
true:
false;
666 return (d.ieee.exponent == IEEE754_F64_Inf.ieee.exponent)
667 && ((d.ieee.mantissa0 == 0) || (d.ieee.mantissa1 == 0))?
true:
false;
677 return (f.ieee.exponent == IEEE754_F32_Zero.ieee.exponent)
678 && (f.ieee.mantissa == 0)?
true:
false;
688 return (d.ieee.exponent == IEEE754_F64_Zero.ieee.exponent)
689 && ((d.ieee.mantissa0 == 0) || (d.ieee.mantissa1 == 0))?
true:
false;
705 #define _NM_CHK_MEM(size, count) \ 708 if( (size) < (count) ) \ 710 return -NM_ECODE_NOMEM; \ 724 #define _NM_CHK_ARCH(val, size) \ 727 if( sizeof(val) != (size) ) \ 729 return -NM_ECODE_ARCH_NOTSUP; \ 833 if(
sizeof(ulonglong_t) == fvalLen )
895 if(
sizeof(
long long) == fvalLen )
917 uMSB = val & 0x80000000? 0xffffffff: 0x00000000;
1025 if(
sizeof(
double) == fvalLen )
1058 d.ieee.exponent = (f.ieee.exponent + (uint_t)IEEE754_DOUBLE_BIAS
1059 - (uint_t)IEEE754_FLOAT_BIAS)
1061 d.ieee.mantissa0 = ((uint_t)(f.ieee.mantissa
1064 d.ieee.mantissa1 = (((uint_t)(f.ieee.mantissa))
1070 d.ieee.negative = f.ieee.negative;
1099 return (
int)fvalLen;
1122 luVal = *((ulong_t *)val);
1125 if(
sizeof(
void *) == fvalLen )
1133 #if HOST_WORD_SIZE == 64 1135 if( (luVal) & 0xffffffff00000000 )
1137 NMLIB_WARNING(
"%p: Packing 64-bit pointer in 32 bits lost non-zero " 1138 "significance.", (
void *)luVal);
1140 #endif // HOST_WORD_SIZE 1141 uVal = (uint_t)(luVal & 0xffffffff);
1146 return (
int)fvalLen;
1171 luVal = *((ulong_t *)val);
1174 if(
sizeof(
void *) == fvalLen )
1176 #if HOST_WORD_SIZE == 64 1177 uMSB = (uint_t)(luVal >> 32);
1178 uLSB = (uint_t)(luVal & 0xffffffff);
1181 uLSB = (uint_t)luVal;
1182 #endif // HOST_WORD_SIZE 1191 uLSB = (uint_t)luVal;
1196 return (
int)fvalLen;
1224 memmove(buf, bufSrc, uCount);
1247 return (
int)fvalLen;
1279 return (
int)fvalLen;
1308 return (
int)fvalLen;
1333 if(
sizeof(ulonglong_t) == fvalLen )
1371 NMLIB_WARNING(
"0x%08x%08x: Unpacking unsigned 64-bit integer into " 1372 "32 bits lost non-zero significance.",
1376 *pVal = (ulonglong_t)uLSB;
1379 return (
int)fvalLen;
1404 if(
sizeof(ulonglong_t) == fvalLen )
1440 if( (uMSB != 0) && (uMSB != 0xffffffff) )
1442 NMLIB_WARNING(
"0x%08x%08x: Unpacking signed 64-bit integer into " 1443 "32 bits lost non-zero significance.",
1447 *pVal = (
long long)uLSB;
1450 return (
int)fvalLen;
1494 return (
int)fvalLen;
1577 exponent = (int)d.ieee.exponent - IEEE754_DOUBLE_BIAS;
1614 f.ieee.exponent = (byte_t)(exponent + IEEE754_FLOAT_BIAS);
1615 f.ieee.mantissa = ( (uint_t)((d.ieee.mantissa0
1618 | (uint_t)((d.ieee.mantissa1
1622 if( (d.ieee.mantissa1 & (uint_t)~IEEE754_F32_F64_MANTISSA1_MASK) != 0 )
1624 NMLIB_WARNING(
"floating-point number mantissa truncation.");
1629 f.ieee.negative = d.ieee.negative;
1631 *pVal = (double)f.f;
1634 return (
int)fvalLen;
1657 pluVal = (ulong_t *)pVal;
1661 *pluVal = (ulong_t)uP32;
1663 return (
int)fvalLen;
1688 pluVal = (ulong_t *)pVal;
1693 if(
sizeof(
void *) == fvalLen )
1695 #if HOST_WORD_SIZE == 64 1696 *pluVal = (ulong_t)(((ulong_t)uMSB << 32) | (uLSB & 0xffffffff));
1698 *pluVal = (ulong_t)uLSB;
1699 #endif // HOST_WORD_SIZE 1709 NMLIB_WARNING(
"0x%08x%08x: Unpacking 64-bit pointer into 32 bits " 1710 "lost non-zero significance.\n",
1713 *pluVal = (ulong_t)uLSB;
1716 return (
int)fvalLen;
1744 memmove(bufDst, buf, uCount);
int nmUnpackU64(byte_t buf[], size_t bufSize, ulonglong_t *pVal, NMEndian_T eEndian)
Unpack an unsigned 64-bit integer from the message buffer.
int nmUnpackU8(byte_t buf[], size_t bufSize, byte_t *pVal, NMEndian_T eEndian)
Unpack an unsigned 8-bit byte from the message buffer.
int nmUnpackF32(byte_t buf[], size_t bufSize, float *pVal, NMEndian_T eEndian)
Unpack a 32-bit float from the message buffer.
#define NMFVAL_LEN_U64
unsigned 64-bit field value length
static bool_t ieee754_f32_is_zero(union ieee754_float f)
Test if 32-bit floating-point number is ± 0.0.
#define UNPACKNATIVE(buf, pval)
Unpack an element from the message buffer in native byte order.
#define IEEE754_F32_F64_MANTISSA1_SHIFT
lsb mantissa shift
int nmUnpackU32(byte_t buf[], size_t bufSize, uint_t *pVal, NMEndian_T eEndian)
Unpack an unsigned 32-bit integer from the message buffer.
#define IEEE754_F64_MANTISSA0_SHIFT
f64 msb mantissa shift
#define NMFVAL_LEN_S32
signed 32-bit field value length
static const union ieee754_double IEEE754_F64_NaN
#define IEEE754_F64_SIGN_SHIFT
f64 sign shift
int nmPackU8(byte_t val, byte_t buf[], size_t bufSize, NMEndian_T eEndian)
Pack an unsigned 8-bit byte into the message buffer.
#define IEEE754_F32_EXP_MAX
maximum power of 2 exponent
#define IEEE754_F64_MANTISSA1_MASK
f64 lsb mantissa mask
static const union ieee754_double IEEE754_F64_Inf
#define _NM_CHK_ARCH(val, size)
Check if host architecture supports basic element sizes.
#define IEEE754_F32_EXPONENT_SHIFT
f32 exponent shift
Most Significant Byte first.
#define NMFVAL_LEN_F64
64-bit floating-point number field val len
#define PACK64BIG(uMSB, uLSB, buf)
Pack two 4-btye unsigned integers into the message buffer in big-endian byte order.
#define IEEE754_F64_MANTISSA0_MASK
f64 msb mantissa mask
int nmPackU32(uint_t val, byte_t buf[], size_t bufSize, NMEndian_T eEndian)
Pack an unsigned 32-bit integer into the message buffer.
#define UNPACK64NATIVE(buf, puMSB, puLSB)
Unpack two 4-byte unsigned integers from the message buffer in native byte order. ...
#define PACKBIG(val, buf)
Pack an element into the message buffer in big-endian byte order.
static void unpackbig(byte_t buf[], byte_t *p, size_t size)
Unpack an element from the message buffer in big-endian byte order.
#define PACKLITTLE(val, buf)
Pack an element into the message buffer in little-endian byte order.
#define IEEE754_F64_EXPONENT_MASK
f64 exponent mask
#define NMLIB_WARNING(fmt,...)
Log libnetmsgs warning.
int nmUnpackP32(byte_t buf[], size_t bufSize, void *pVal, NMEndian_T eEndian)
Unpack a 32-bit pointer from the message buffer.
static void unpacklittle(byte_t buf[], byte_t *p, size_t size)
Unpack an element from the message buffer in little-endian byte order.
int nmUnpackP64(byte_t buf[], size_t bufSize, void *pVal, NMEndian_T eEndian)
Unpack a 64-bit pointer from the message buffer.
#define NMFVAL_LEN_F32
32-bit floating-point number field val len
#define IEEE754_F32_SIGN_MASK
f32 sign mask
#define PACKNATIVE(val, buf)
Pack an element into the message buffer in native byte order.
#define IEEE754_F64_EXPONENT_SHIFT
f64 exponent shift
#define PACK64LITTLE(uMSB, uLSB, buf)
Pack two 4-btye unsigned integers into the message buffer in little-endian byte order.
static void packlittle(byte_t *p, size_t size, byte_t buf[])
Pack an element into the message buffer in little-endian byte order.
static bool_t ieee754_f64_is_inf(union ieee754_double d)
Test if 64-bit floating-point number is ± infinity.
#define IEEE754_F32_EXPONENT_MASK
f32 exponent mask
static bool_t ieee754_f32_is_nan(union ieee754_float f)
Test if 32-bit floating-point number is a NaN.
static const union ieee754_float IEEE754_F32_NaN
int nmPackF32(float val, byte_t buf[], size_t bufSize, NMEndian_T eEndian)
Pack a 32-bit float into the message buffer.
int nmPackP64(void *val, byte_t buf[], size_t bufSize, NMEndian_T eEndian)
Pack a 64-bit pointer into the message buffer.
#define IEEE754_F32_F64_MANTISSA1_MASK
lsb mantissa mask
int nmPackS64(long long val, byte_t buf[], size_t bufSize, NMEndian_T eEndian)
Pack an signed 64-bit integer into the message buffer.
#define NMFVAL_LEN_P32
32-bit pointer field value length
#define UNPACK64BIG(buf, puMSB, puLSB)
Unpack two 4-byte unsigned integers from the message buffer in big-endian byte order.
#define IEEE754_F32_SIGN_SHIFT
f32 sign shift
int nmPackP32(void *val, byte_t buf[], size_t bufSize, NMEndian_T eEndian)
Pack a 32-bit pointer into the message buffer.
#define NMFVAL_LEN_U16
unsigned 16-bit field value length
#define UNPACK64LITTLE(buf, puMSB, puLSB)
Unpack two 4-byte unsigned integers from the message buffer in little-endian byte order...
int nmPackBuf(byte_t bufSrc[], size_t uCount, byte_t buf[], size_t bufSize, NMEndian_T eEndian)
Pack a byte buffer into the message buffer.
static const union ieee754_double IEEE754_F64_Zero
#define PACK64NATIVE(uMSB, uLSB, buf)
Pack two 4-btye unsigned integers into the message buffer in native byte order.
#define NMFVAL_LEN_U32
unsigned 32-bit field value length
static bool_t ieee754_f32_is_inf(union ieee754_float f)
Test if 32-bit floating-point number is ± infinity.
#define UNPACKBIG(buf, pval)
Unpack an element from the message buffer in big-endian byte order.
#define IEEE754_F32_MANTISSA_MASK
f32 mantissa mask
#define UNPACKLITTLE(buf, pval)
Unpack an element from the message buffer in little-endian byte order.
Least Significant Byte first.
#define NMFVAL_LEN_P64
64-bit pointer field value length
int nmUnpackBuf(byte_t buf[], size_t bufSize, byte_t bufDst[], size_t uCount, NMEndian_T eEndian)
Unpack a byte buffer from the message buffer.
int nmUnpackU16(byte_t buf[], size_t bufSize, ushort_t *pVal, NMEndian_T eEndian)
Unpack an unsigned 16-bit integer from the message buffer.
#define IEEE754_F32_MANTISSA_SHIFT
f32 mantissa shift
Internal intra-library declarations.
int nmUnpackF64(byte_t buf[], size_t bufSize, double *pVal, NMEndian_T eEndian)
Unpack a 64-bit float from the message buffer.
int nmUnpackS64(byte_t buf[], size_t bufSize, long long *pVal, NMEndian_T eEndian)
Unpack an signed 64-bit integer from the message buffer.
static bool_t ieee754_f64_is_zero(union ieee754_double d)
Test if 64-bit floating-point number is ± 0.0.
#define IEEE754_F64_MANTISSA1_SHIFT
f64 lsb mantissa shift
#define NMFVAL_LEN_U8
unsigned 8-bit field value length
#define _NM_CHK_MEM(size, count)
Check if memory is available.
int nmPackU64(ulonglong_t val, byte_t buf[], size_t bufSize, NMEndian_T eEndian)
Pack an unsigned 64-bit integer into the message buffer.
Network Messaging declarations.
#define NMFVAL_LEN_S64
signed 64-bit field value length
int nmPackU16(ushort_t val, byte_t buf[], size_t bufSize, NMEndian_T eEndian)
Pack an unsigned 16-bit integer into the message buffer.
#define IEEE754_F64_SIGN_MASK
f64 sign mask
static const union ieee754_float IEEE754_F32_Inf
int nmPackF64(double val, byte_t buf[], size_t bufSize, NMEndian_T eEndian)
Pack a 64-bit float into the message buffer.
static bool_t ieee754_f64_is_nan(union ieee754_double d)
Test if 64-bit floating-point number is a NaN.
static const union ieee754_float IEEE754_F32_Zero
static void packbig(byte_t *p, size_t size, byte_t buf[])
Pack an element into the message buffer in big-endian byte order.
#define IEEE754_F32_F64_MANTISSA0_SHIFT
msb mantissa shift
#define IEEE754_F32_EXP_MIN
minimum power of 2 exponent