Index: ossp-pkg/xds/xds_engine_xdr.c RCS File: /v/ossp/cvs/ossp-pkg/xds/xds_engine_xdr.c,v rcsdiff -q -kk '-r1.6' '-r1.7' -u '/v/ossp/cvs/ossp-pkg/xds/xds_engine_xdr.c,v' 2>/dev/null --- xds_engine_xdr.c 2001/08/13 19:48:02 1.6 +++ xds_engine_xdr.c 2001/08/22 20:23:48 1.7 @@ -294,6 +294,90 @@ #endif /* XDS_HAVE_64_BIT_SUPPORT */ /* + * Encode/decode floating point values. + */ + +int xdr_encode_float(xds_t *xds, void *engine_context, + void *buffer, size_t buffer_size, + size_t *used_buffer_size, va_list *args) +{ + xds_float_t value; + xds_uint8_t tmp; + + xds_init_encoding_engine(4); + + /* Get value and format it into the structure. */ + float2xds_float(&value, (float)va_arg(*args, double)); + + memset(buffer, 0, 4); + + if (value.sign == 1) + ((xds_uint8_t*)buffer)[0] |= 0x80; + + tmp = value.exponent + 127; + ((xds_uint8_t*)buffer)[0] |= tmp >> 1; + ((xds_uint8_t*)buffer)[1] |= (tmp & 0x01) << 7; + + ((xds_uint8_t*)buffer)[1] |= (xds_uint8_t)((value.fraction & 0x7fffff) >> 16); + ((xds_uint8_t*)buffer)[2] |= (xds_uint8_t)((value.fraction & 0x00ffff) >> 8); + ((xds_uint8_t*)buffer)[3] |= (xds_uint8_t)((value.fraction & 0x0000ff) >> 0); + + return XDS_OK; +} + +int xdr_decode_float(xds_t *xds, void *engine_context, + void *buffer, size_t buffer_size, + size_t *used_buffer_size, va_list *args) +{ + float* value; + xds_uint32_t fraction; + xds_uint8_t exponent; + size_t i; + char sign; + + xds_init_decoding_engine(4); + + value = va_arg(*args, float*); + *value = 0.0; + + fraction = (((xds_uint8_t*)buffer)[1] & 0x7fffff) << 16; + fraction += ((xds_uint8_t*)buffer)[2] << 8; + fraction += ((xds_uint8_t*)buffer)[3]; + exponent = (((xds_uint8_t*)buffer)[0] & 0x7f) << 1; + exponent += (((xds_uint8_t*)buffer)[1] & 0x80) >> 7; + sign = (((xds_uint8_t*)buffer)[0] & 0x80) >> 7; + + if (fraction == 0 && exponent == 0) + return XDS_OK; + + for (i = 23; i > 0; --i) + { + if ((fraction & 0x01) == 1) + *value += 1; + *value /= 2.0; + fraction /= 2; + } + *value += 1; + + if (exponent > 127) + { + for (exponent -= 127; exponent > 0; --exponent) + *value *= 2.0; + } + else + { + for (exponent = 127 - exponent; exponent > 0; --exponent) + *value /= 2.0; + } + + if (sign == 1) + *value = 0.0 - *value; + + return XDS_OK; +} + + +/* * Encode/decode double-precision floating point values. */