Files
microser/mmslib/mmsl/ms_tdef2.c

227 lines
7.3 KiB
C
Raw Normal View History

2026-06-15 15:48:16 +08:00
/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1986 - 2001, All Rights Reserved. */
/* */
/* PROPRIETARY AND CONFIDENTIAL */
/* */
/* MODULE NAME : mms_tdef2.c */
/* PRODUCT(S) : MMSEASE */
/* */
/* MODULE DESCRIPTION : */
/* Functions to assist in using NESTED RUNTIME TYPES */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 08/01/05 JRB 13 Avoid risky cast to remove const. */
/* 04/02/03 JRB 12 Add UTF8string support (see RT_UTF8_STRING). */
/* 12/20/01 JRB 11 Converted to use ASN1R (re-entrant ASN1) */
/* 11/14/01 EJV 10 Added support for new MMS type UtcTime: */
/* ms_runtime_to_asn1: add case for RT_UTC_TIME */
/* 10/18/01 JRB 09 Eliminate warning. */
/* 07/28/00 JRB 08 Use ms_comp_name_find for everyone. */
/* 07/13/00 JRB 07 Use new ms_comp_name_find to get comp names. */
/* 09/13/99 MDE 06 Added SD_CONST modifiers */
/* 04/14/99 MDE 05 Removed unnecessary include files */
/* 09/10/98 MDE 04 Removed 'mvlRtNames' declaration */
/* 08/13/98 MDE 03 Added asn1 encode overrun test to loop */
/* 03/11/98 MDE 02 Removed NEST_RT_TYPES */
/* 04/08/97 MDE 01 Fixed 'RT Table too small prob w/named types */
/* 04/02/97 DTL 7.00 MMSEASE 7.0 release. See MODL70.DOC for */
/* history. */
/************************************************************************/
#include "glbtypes.h"
#include "sysincs.h"
#include "glbsem.h"
#include "mmsdefs.h"
#include "mms_pvar.h"
#include "mms_vvar.h"
#include "asn1defs.h"
/************************************************************************/
/* For debug version, use a static pointer to avoid duplication of */
/* __FILE__ strings. */
#ifdef DEBUG_SISCO
SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
#endif
/************************************************************************/
/************************************************************************/
/* ms_runtime_to_tdl */
/************************************************************************/
/* Converts RUNTIME TYPE to ASN.1. ASN.1 build must be started */
ST_RET ms_runtime_to_asn1 (ASN1_ENC_CTXT *aCtx, SD_CONST RUNTIME_TYPE *rt, ST_INT rt_num)
{
ST_INT i;
ST_INT level;
SD_CONST RUNTIME_TYPE *rt_ptr;
ST_BOOLEAN structComp[ASN1_MAX_LEVEL];
ST_UCHAR v1;
ST_UCHAR v2;
const ST_CHAR *comp_name;
S_LOCK_COMMON_RESOURCES ();
level = 0;
rt_ptr = rt + (rt_num - 1);
for (i = 0; i < rt_num && aCtx->asn1r_encode_overrun == SD_FALSE; ++i, --rt_ptr)
{
switch (rt_ptr->el_tag)
{
case RT_ARR_START :
--level;
/* Finish typeSpecification */
asn1r_fin_constr (aCtx, 2, CTX, SD_FALSE);
/* Write numberOfElements */
asn1r_wr_i32 (aCtx, (ST_INT32) rt_ptr->u.arr.num_elmnts);
asn1r_fin_prim (aCtx, 1,CTX);
/* Finish array */
asn1r_fin_constr (aCtx, 1, CTX, SD_FALSE);
break;
case RT_ARR_END :
++level;
structComp[level] = SD_FALSE;
asn1r_strt_constr (aCtx); /* Start array */
asn1r_strt_constr (aCtx); /* Start typeSpecification */
break;
case RT_STR_START :
--level;
asn1r_fin_constr (aCtx, 1, CTX, SD_FALSE); /* Finish components */
asn1r_fin_constr (aCtx, 2, CTX, SD_FALSE); /* Finish structure */
break;
case RT_STR_END :
++level;
structComp[level] = SD_TRUE;
asn1r_strt_constr (aCtx); /* Start structure */
asn1r_strt_constr (aCtx); /* Start components */
/* prepare for first component */
asn1r_strt_constr (aCtx); /* Start component seq of seq */
asn1r_strt_constr (aCtx); /* Start component type */
break;
case RT_BOOL :
asn1r_fin_prim (aCtx, RT_BOOL, CTX);
break;
case RT_INTEGER :
asn1r_wr_u8 (aCtx, (ST_UCHAR) (rt_ptr->u.p.el_len * 8));
asn1r_fin_prim (aCtx, RT_INTEGER, CTX);
break;
case RT_UNSIGNED :
asn1r_wr_u8 (aCtx, (ST_UCHAR) (rt_ptr->u.p.el_len * 8));
asn1r_fin_prim (aCtx, RT_UNSIGNED, CTX);
break;
case RT_FLOATING_POINT :
asn1r_strt_constr (aCtx);
if (rt_ptr->u.p.el_len == 4) /* single precision */
{
v1 = SNGL_EXP;
if (!m_use_dis_float)
v2 = SNGL_WHOLE;
else
v2 = SNGL_FRACT;
}
else
{
v1 = DOUBL_EXP;
if (!m_use_dis_float)
v2 = DOUBL_WHOLE;
else
v2 = DOUBL_FRACT;
}
asn1r_wr_u8 (aCtx, v1); /* write exp */
asn1r_fin_prim (aCtx, INT_CODE,UNI);
asn1r_wr_u8 (aCtx, v2);
asn1r_fin_prim (aCtx, INT_CODE,UNI);
asn1r_fin_constr (aCtx, RT_FLOATING_POINT, CTX, SD_FALSE);
break;
case RT_BIT_STRING :
case RT_OCTET_STRING :
case RT_VISIBLE_STRING :
case RT_UTF8_STRING : /* all same encoding w/ different tags*/
asn1r_wr_i32 (aCtx, (ST_INT32) rt_ptr->u.p.el_len);
asn1r_fin_prim (aCtx, rt_ptr->el_tag, CTX);
break;
case RT_GENERAL_TIME :
asn1r_fin_prim (aCtx, RT_GENERAL_TIME, CTX);
break;
case RT_BINARY_TIME :
if (rt_ptr->u.p.el_len == 4)
asn1r_wr_u8 (aCtx, 0);
else
asn1r_wr_u8 (aCtx, 1);
asn1r_fin_prim (aCtx, RT_BINARY_TIME, CTX);
break;
case RT_UTC_TIME :
asn1r_fin_prim (aCtx, RT_UTC_TIME, CTX);
break;
case RT_BCD :
asn1r_wr_u8 (aCtx, (ST_UCHAR) rt_ptr->u.p.el_len);
asn1r_fin_prim (aCtx, RT_BCD, CTX);
break;
case RT_BOOLEANARRAY :
break;
default :
MLOG_ERR1 ("MS_RUNTIME_TO_ASN1: Invalid element tag (%d)",
rt_ptr->el_tag);
S_UNLOCK_COMMON_RESOURCES ();
return (SD_FAILURE);
break;
}
if (level > 0 && structComp[level] == SD_TRUE &&
rt_ptr->el_tag != RT_STR_END)
{
asn1r_fin_constr (aCtx, 1, CTX, SD_FALSE); /* Finish typeSpec */
comp_name = ms_comp_name_find (rt_ptr);
if (strlen (comp_name))
{
asn1r_wr_vstr (aCtx, comp_name);
asn1r_fin_prim (aCtx, 0, CTX);
}
asn1r_fin_constr (aCtx, SEQ_CODE, UNI, SD_FALSE);
if ((rt_ptr-1)->el_tag != RT_STR_START)
{
/* prepare for the next component */
asn1r_strt_constr (aCtx); /* Start component seq of seq */
asn1r_strt_constr (aCtx); /* Start component type */
}
}
}
S_UNLOCK_COMMON_RESOURCES ();
if (aCtx->asn1r_encode_overrun)
{
MLOG_NERR0 ("ms_runtime_to_asn1 : ASN.1 encode overrun");
return (SD_FAILURE);
}
return (SD_SUCCESS);
}