123 lines
4.2 KiB
C
123 lines
4.2 KiB
C
/************************************************************************/
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
|
/************************************************************************/
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
|
/* 1986 - 2002, All Rights Reserved. */
|
|
/* */
|
|
/* PROPRIETARY AND CONFIDENTIAL */
|
|
/* */
|
|
/* MODULE NAME : are_float.c */
|
|
/* PRODUCT(S) : ASN1DE */
|
|
/* */
|
|
/* MODULE DESCRIPTION : */
|
|
/* */
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
|
/* */
|
|
/* MODIFICATION LOG : */
|
|
/* Date Who Rev Comments */
|
|
/* -------- --- ------ ------------------------------------------- */
|
|
/* 03/11/04 GLB 08 Remove "thisFileName" */
|
|
/* 01/14/03 JRB 07 Avoid redundant logging of encode overrun. */
|
|
/* 02/19/03 JRB 06 Use SD_BYTE_ORDER. */
|
|
/* 02/19/03 JRB 05 Del VAX VMS support. For ALPHA VMS, assume */
|
|
/* compiler option /FLOAT=IEEE_FLOAT is used */
|
|
/* so it behaves like other systems. */
|
|
/* 01/22/02 JRB 04 Chg asn1r_end_of_buffer to asn1r_buf_start. */
|
|
/* 12/20/01 JRB 03 Chg ASN1_CTXT to ASN1_ENC_CTXT. */
|
|
/* 09/13/99 MDE 02 Added SD_CONST modifiers */
|
|
/* 07/26/99 MDE 01 New module, derived from ae_float.c */
|
|
/************************************************************************/
|
|
|
|
#include "glbtypes.h"
|
|
#include "sysincs.h"
|
|
#include "asn1r.h"
|
|
#include "asn1log.h"
|
|
|
|
|
|
/************************************************************************/
|
|
/* wr_float */
|
|
/* Function to convert a value of the single precision "float" type to */
|
|
/* the MMS floating point type (of length 5 octets) and write it to the */
|
|
/* message being constructed. The encoded floating point value is in */
|
|
/* the standard IEEE 754 single precision floating point format with */
|
|
/* the additional exponent width octet. */
|
|
/************************************************************************/
|
|
|
|
ST_VOID asn1r_wr_float (ASN1_ENC_CTXT *ac, ST_FLOAT in)
|
|
{
|
|
ST_UCHAR *ptr;
|
|
ST_FLOAT f;
|
|
|
|
if (ac->asn1r_field_ptr - 5 < ac->asn1r_buf_start)
|
|
{
|
|
ac->asn1r_encode_overrun = SD_TRUE;
|
|
return;
|
|
}
|
|
|
|
#if defined(__OS2__)
|
|
ptr = (ST_UCHAR *) ∈
|
|
#else
|
|
f = (ST_FLOAT) in;
|
|
ptr = (ST_UCHAR *) &f;
|
|
#endif
|
|
|
|
#if SD_BYTE_ORDER==SD_BIG_ENDIAN /* big-endian (like Motorola) */
|
|
f = (ST_FLOAT) in;
|
|
ptr = (ST_UCHAR *) &f;
|
|
ptr += 3;
|
|
*(ac->asn1r_field_ptr--) = *(ptr--);
|
|
*(ac->asn1r_field_ptr--) = *(ptr--);
|
|
*(ac->asn1r_field_ptr--) = *(ptr--);
|
|
#else
|
|
*(ac->asn1r_field_ptr--) = *(ptr++);
|
|
*(ac->asn1r_field_ptr--) = *(ptr++);
|
|
*(ac->asn1r_field_ptr--) = *(ptr++);
|
|
#endif
|
|
*(ac->asn1r_field_ptr--) = *ptr;
|
|
*(ac->asn1r_field_ptr--) = (ST_UCHAR)'\x08';
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* wr_double */
|
|
/* Function to convert a value of the double precision "double" type to */
|
|
/* the MMS floating point type (of length 9 octets) and write it to the */
|
|
/* message being constructed. The encoded floating point value is in */
|
|
/* the standard IEEE 754 double precision floating point format with */
|
|
/* the additional exponent width octet. */
|
|
/************************************************************************/
|
|
|
|
ST_VOID asn1r_wr_double (ASN1_ENC_CTXT *ac, ST_DOUBLE in)
|
|
{
|
|
ST_UCHAR *ptr;
|
|
|
|
if (ac->asn1r_field_ptr - 9 < ac->asn1r_buf_start)
|
|
{
|
|
ac->asn1r_encode_overrun = SD_TRUE;
|
|
return;
|
|
}
|
|
|
|
#if SD_BYTE_ORDER==SD_BIG_ENDIAN /* big-endian (like Motorola) */
|
|
ptr = (ST_UCHAR *) &in + 7;
|
|
*(ac->asn1r_field_ptr--) = *(ptr--);
|
|
*(ac->asn1r_field_ptr--) = *(ptr--);
|
|
*(ac->asn1r_field_ptr--) = *(ptr--);
|
|
*(ac->asn1r_field_ptr--) = *(ptr--);
|
|
*(ac->asn1r_field_ptr--) = *(ptr--);
|
|
*(ac->asn1r_field_ptr--) = *(ptr--);
|
|
*(ac->asn1r_field_ptr--) = *(ptr--);
|
|
#else
|
|
ptr = (ST_UCHAR *) ∈
|
|
*(ac->asn1r_field_ptr--) = *(ptr++);
|
|
*(ac->asn1r_field_ptr--) = *(ptr++);
|
|
*(ac->asn1r_field_ptr--) = *(ptr++);
|
|
*(ac->asn1r_field_ptr--) = *(ptr++);
|
|
*(ac->asn1r_field_ptr--) = *(ptr++);
|
|
*(ac->asn1r_field_ptr--) = *(ptr++);
|
|
*(ac->asn1r_field_ptr--) = *(ptr++);
|
|
#endif
|
|
*(ac->asn1r_field_ptr--) = *ptr;
|
|
*(ac->asn1r_field_ptr--) = (ST_UCHAR)'\x0B';
|
|
}
|
|
|
|
|