自主协议库编译通过
This commit is contained in:
226
mmslib/mmsl/ms_tdef2.c
Normal file
226
mmslib/mmsl/ms_tdef2.c
Normal file
@@ -0,0 +1,226 @@
|
||||
/************************************************************************/
|
||||
/* 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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user