mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
787 lines
21 KiB
787 lines
21 KiB
/* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */
|
|
/* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */
|
|
|
|
#include "precomp.h"
|
|
|
|
void ExamineBERType(AssignmentList_t ass, Type_t *type, char *ideref);
|
|
void ExamineBERType_Boolean(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_Integer(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_Enumerated(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_Real(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_BitString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_OctetString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_UTF8String(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_Null(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_EmbeddedPdv(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_External(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_ObjectIdentifier(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_BMPString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_GeneralString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_GraphicString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_IA5String(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_ISO646String(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_NumericString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_PrintableString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_TeletexString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_T61String(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_UniversalString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_VideotexString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_VisibleString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_UnrestrictedString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_GeneralizedTime(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_UTCTime(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_ObjectDescriptor(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_Open(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_SequenceSet(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_SequenceSetOf(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_Choice(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_InstanceOf(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
void ExamineBERType_Reference(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info);
|
|
|
|
/* examine all types and extract informations needed for BER encoding */
|
|
void
|
|
ExamineBER(AssignmentList_t ass)
|
|
{
|
|
Assignment_t *a;
|
|
|
|
/* examine all assignments */
|
|
for (a = ass; a; a = a->Next) {
|
|
|
|
/* examine types */
|
|
switch (a->Type) {
|
|
case eAssignment_Type:
|
|
ExamineBERType(ass, a->U.Type.Type, GetName(a));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* extract some type informations needed for BER encoding */
|
|
void
|
|
ExamineBERType(AssignmentList_t ass, Type_t *type, char *ideref)
|
|
{
|
|
BERTypeInfo_t *info;
|
|
|
|
info = &type->BERTypeInfo;
|
|
info->pPrivateDirectives = &type->PrivateDirectives;
|
|
|
|
/* get tags to en-/decode */
|
|
if (IsReferenceType(type) && IsStructuredType(GetType(ass, type))) {
|
|
info->Tags = type->Tags;
|
|
} else {
|
|
info->Tags = type->AllTags;
|
|
}
|
|
|
|
/* get the type to be examined */
|
|
if (IsReferenceType(type) && !IsStructuredType(GetType(ass, type)))
|
|
type = GetType(ass, type);
|
|
|
|
/* initialize the BER informations */
|
|
info->Identifier = ideref;
|
|
info->Rules = type->Rules;
|
|
info->Flags = type->Flags;
|
|
info->NOctets = 0;
|
|
info->SubIdentifier = NULL;
|
|
info->SubType = NULL;
|
|
info->Data = eBERSTIData_Null;
|
|
|
|
/* BER informations are type specific ... */
|
|
switch (type->Type) {
|
|
case eType_Boolean:
|
|
ExamineBERType_Boolean(ass, type, info);
|
|
break;
|
|
case eType_Integer:
|
|
ExamineBERType_Integer(ass, type, info);
|
|
break;
|
|
case eType_Enumerated:
|
|
ExamineBERType_Enumerated(ass, type, info);
|
|
break;
|
|
case eType_Real:
|
|
ExamineBERType_Real(ass, type, info);
|
|
break;
|
|
case eType_BitString:
|
|
ExamineBERType_BitString(ass, type, info);
|
|
break;
|
|
case eType_OctetString:
|
|
ExamineBERType_OctetString(ass, type, info);
|
|
break;
|
|
case eType_UTF8String:
|
|
ExamineBERType_UTF8String(ass, type, info);
|
|
break;
|
|
case eType_Null:
|
|
ExamineBERType_Null(ass, type, info);
|
|
break;
|
|
case eType_EmbeddedPdv:
|
|
ExamineBERType_EmbeddedPdv(ass, type, info);
|
|
break;
|
|
case eType_External:
|
|
ExamineBERType_External(ass, type, info);
|
|
break;
|
|
case eType_ObjectIdentifier:
|
|
ExamineBERType_ObjectIdentifier(ass, type, info);
|
|
break;
|
|
case eType_BMPString:
|
|
ExamineBERType_BMPString(ass, type, info);
|
|
break;
|
|
case eType_GeneralString:
|
|
ExamineBERType_GeneralString(ass, type, info);
|
|
break;
|
|
case eType_GraphicString:
|
|
ExamineBERType_GraphicString(ass, type, info);
|
|
break;
|
|
case eType_IA5String:
|
|
ExamineBERType_IA5String(ass, type, info);
|
|
break;
|
|
case eType_ISO646String:
|
|
ExamineBERType_ISO646String(ass, type, info);
|
|
break;
|
|
case eType_NumericString:
|
|
ExamineBERType_NumericString(ass, type, info);
|
|
break;
|
|
case eType_PrintableString:
|
|
ExamineBERType_PrintableString(ass, type, info);
|
|
break;
|
|
case eType_TeletexString:
|
|
ExamineBERType_TeletexString(ass, type, info);
|
|
break;
|
|
case eType_T61String:
|
|
ExamineBERType_T61String(ass, type, info);
|
|
break;
|
|
case eType_UniversalString:
|
|
ExamineBERType_UniversalString(ass, type, info);
|
|
break;
|
|
case eType_VideotexString:
|
|
ExamineBERType_VideotexString(ass, type, info);
|
|
break;
|
|
case eType_VisibleString:
|
|
ExamineBERType_VisibleString(ass, type, info);
|
|
break;
|
|
case eType_CharacterString:
|
|
ExamineBERType_UnrestrictedString(ass, type, info);
|
|
break;
|
|
case eType_GeneralizedTime:
|
|
ExamineBERType_GeneralizedTime(ass, type, info);
|
|
break;
|
|
case eType_UTCTime:
|
|
ExamineBERType_UTCTime(ass, type, info);
|
|
break;
|
|
case eType_ObjectDescriptor:
|
|
ExamineBERType_ObjectDescriptor(ass, type, info);
|
|
break;
|
|
case eType_Open:
|
|
ExamineBERType_Open(ass, type, info);
|
|
break;
|
|
case eType_Sequence:
|
|
case eType_Set:
|
|
ExamineBERType_SequenceSet(ass, type, info);
|
|
break;
|
|
case eType_SequenceOf:
|
|
case eType_SetOf:
|
|
ExamineBERType_SequenceSetOf(ass, type, info);
|
|
break;
|
|
case eType_Choice:
|
|
ExamineBERType_Choice(ass, type, info);
|
|
break;
|
|
case eType_InstanceOf:
|
|
ExamineBERType_InstanceOf(ass, type, info);
|
|
break;
|
|
case eType_RestrictedString:
|
|
MyAbort(); /* may never happen */
|
|
/*NOTREACHED*/
|
|
case eType_Selection:
|
|
MyAbort(); /* may never happen */
|
|
/*NOTREACHED*/
|
|
case eType_Undefined:
|
|
MyAbort(); /* may never happen */
|
|
/*NOTREACHED*/
|
|
case eType_Reference:
|
|
ExamineBERType_Reference(ass, type, info);
|
|
break;
|
|
case eType_FieldReference:
|
|
MyAbort(); /* may never happen */
|
|
/*NOTREACHED*/
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Description of the fields of BERTypeInfo_t:
|
|
* info.
|
|
* Identifier complete name of the type
|
|
* Rules encoding directive rules
|
|
* Flags encoding flags
|
|
* NOctets size of string characters/integer type
|
|
* Data data type of value
|
|
* SubIdentifier complete name of the subtype
|
|
* SubType the subtype itself
|
|
* Tags tag list of the type
|
|
*
|
|
* NOTES:
|
|
* The encoding is mostly controlled by following arguments:
|
|
* - Data, the type: one of:
|
|
* eBERSTIData_Null, eBERSTIData_Boolean,
|
|
* eBERSTIData_Integer, eBERSTIData_Unsigned,
|
|
* eBERSTIData_Real, eBERSTIData_BitString, eBERSTIData_RZBBitString,
|
|
* eBERSTIData_OctetString, eBERSTIData_SequenceOf, eBERSTIData_SetOf,
|
|
* eBERSTIData_Sequence, eBERSTIData_Set, eBERSTIData_Choice,
|
|
* eBERSTIData_ObjectIdentifier, eBERSTIData_ObjectIdEncoded, eBERSTIData_String,
|
|
* eBERSTIData_ZeroString, eBERSTIData_Reference, eBERSTIData_External,
|
|
* eBERSTIData_EmbeddedPdv, eBERSTIData_UnrestrictedString
|
|
*
|
|
* Following arguments contain variable/function names in the generated
|
|
* code:
|
|
* - Identifier, the name of the current type
|
|
* - SubIdentifier, the name of the subtype
|
|
*
|
|
* Following values require additional arguments:
|
|
* - Data == eBERSTIData_Reference
|
|
* -> SubIdentifier, the name of the subtype
|
|
* -> SubType, the subtype itself
|
|
* - Data == eBERSTIData_*String
|
|
* -> NOctets, the size of the string characters
|
|
* - Data == eBERSTIData_Integer || Data == eBERSTIData_Unsigned ||
|
|
* Data == eBERSTIData_Boolean || Data == eBERSTIData_Choice
|
|
* -> NOctets, the size of the integer type
|
|
* - Data == eBERSTIData_SequenceOf || Data == eBERSTIData_SetOf
|
|
* -> SubIdentifier, the name of the subtype
|
|
* -> SubType, the subtype itself
|
|
* -> Rule, the encoding directive rules
|
|
*/
|
|
|
|
/*
|
|
* BOOLEAN:
|
|
*
|
|
* Data == eBERSTIData_Boolean
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* - Data == eBERSTIData_Integer || dat == eBERSTIData_Unsigned ||
|
|
* Data == eBERSTIData_Boolean || dat == eBERSTIData_Choice
|
|
* -> NOctets, the size of the integer type
|
|
*/
|
|
void
|
|
ExamineBERType_Boolean(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->Data = eBERSTIData_Boolean;
|
|
info->NOctets = GetOctets(GetBooleanType());
|
|
}
|
|
|
|
/*
|
|
* INTEGER:
|
|
*
|
|
* Data == eBERSTIData_Integer ||
|
|
* Data == eBERSTIData_Unsigned
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* - Data == eBERSTIData_Integer || dat == eBERSTIData_Unsigned ||
|
|
* Data == eBERSTIData_Boolean || dat == eBERSTIData_Choice
|
|
* -> NOctets, the size of the integer type
|
|
*/
|
|
void
|
|
ExamineBERType_Integer(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
int32_t sign;
|
|
|
|
/* calculate NOctets and Data depending on the used C-Type */
|
|
info->NOctets = GetOctets(GetIntegerType(ass, type, &sign));
|
|
info->Data = sign > 0 ? eBERSTIData_Unsigned : eBERSTIData_Integer;
|
|
}
|
|
|
|
/*
|
|
* ENUMERATED:
|
|
*
|
|
* Data == eBERSTIData_Integer ||
|
|
* Data == eBERSTIData_Unsigned
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* - Data == eBERSTIData_Integer || dat == eBERSTIData_Unsigned ||
|
|
* Data == eBERSTIData_Boolean || dat == eBERSTIData_Choice
|
|
* -> NOctets, the size of the integer type
|
|
*/
|
|
void
|
|
ExamineBERType_Enumerated(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
int32_t sign;
|
|
|
|
/* calculate NOctets and Data depending on the used C-Type */
|
|
info->NOctets = GetOctets(GetEnumeratedType(ass, type, &sign));
|
|
info->Data = sign > 0 ? eBERSTIData_Unsigned : eBERSTIData_Integer;
|
|
}
|
|
|
|
/*
|
|
* REAL:
|
|
*
|
|
* Data == eBERSTIData_Real
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_Real(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->NOctets = GetOctets(GetRealType(type));
|
|
info->Data = eBERSTIData_Real;
|
|
}
|
|
|
|
/*
|
|
* BIT STRING:
|
|
*
|
|
* Data == eBERSTIData_BitString ||
|
|
* Data == eBERSTIData_RZBBitString
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_BitString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
/* set Data to RZBBitString/BitString */
|
|
if (type->U.BitString.NamedNumbers)
|
|
info->Data = eBERSTIData_RZBBitString;
|
|
else
|
|
info->Data = eBERSTIData_BitString;
|
|
}
|
|
|
|
/*
|
|
* OCTET STRING:
|
|
*
|
|
* Data == eBERSTIData_OctetString
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_OctetString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
/* set Data to OctetString */
|
|
info->Data = eBERSTIData_OctetString;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_UTF8String(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
/* set Data to UTF8String */
|
|
info->Data = eBERSTIData_UTF8String;
|
|
}
|
|
|
|
/*
|
|
* NULL:
|
|
*
|
|
* Data == eBERSTIData_Null
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_Null(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->Data = eBERSTIData_Null;
|
|
}
|
|
|
|
/*
|
|
* EMBEDDED PDV:
|
|
*
|
|
* Data == eBERSTIData_EmbeddedPdv
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_EmbeddedPdv(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->Data = eBERSTIData_EmbeddedPdv;
|
|
}
|
|
|
|
/*
|
|
* EXTERNAL:
|
|
*
|
|
* Data == eBERSTIData_External
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_External(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->Data = eBERSTIData_External;
|
|
}
|
|
|
|
/*
|
|
* OBJECT IDENTIFIER:
|
|
*
|
|
* Data == eBERSTIData_ObjectIdEncoded || eBERSTIData_ObjectIdentifier
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_ObjectIdentifier(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->Data = type->PrivateDirectives.fOidPacked ? eBERSTIData_ObjectIdEncoded : eBERSTIData_ObjectIdentifier;
|
|
}
|
|
|
|
/*
|
|
* *String:
|
|
*
|
|
* Data == eBERSTIData_String ||
|
|
* Data == eBERSTIData_ZeroString
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* - Data == eBERSTIData_*String
|
|
* -> NOctets, the size of the string characters
|
|
*/
|
|
|
|
void
|
|
ExamineBERType_BMPString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t zero;
|
|
|
|
GetStringType(ass, type, &info->NOctets, &zero);
|
|
info->Data = zero ? eBERSTIData_ZeroString : eBERSTIData_String;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_GeneralString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t zero;
|
|
|
|
GetStringType(ass, type, &info->NOctets, &zero);
|
|
info->Data = zero ? eBERSTIData_ZeroString : eBERSTIData_String;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_GraphicString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t zero;
|
|
|
|
GetStringType(ass, type, &info->NOctets, &zero);
|
|
info->Data = zero ? eBERSTIData_ZeroString : eBERSTIData_String;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_IA5String(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t zero;
|
|
|
|
GetStringType(ass, type, &info->NOctets, &zero);
|
|
info->Data = zero ? eBERSTIData_ZeroString : eBERSTIData_String;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_ISO646String(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t zero;
|
|
|
|
GetStringType(ass, type, &info->NOctets, &zero);
|
|
info->Data = zero ? eBERSTIData_ZeroString : eBERSTIData_String;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_NumericString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t zero;
|
|
|
|
GetStringType(ass, type, &info->NOctets, &zero);
|
|
info->Data = zero ? eBERSTIData_ZeroString : eBERSTIData_String;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_PrintableString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t zero;
|
|
|
|
GetStringType(ass, type, &info->NOctets, &zero);
|
|
info->Data = zero ? eBERSTIData_ZeroString : eBERSTIData_String;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_TeletexString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t noctets, zero;
|
|
|
|
GetStringType(ass, type, &noctets, &zero); // to make hack directives become effective
|
|
info->Data = eBERSTIData_MultibyteString;
|
|
info->NOctets = 1;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_T61String(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t noctets, zero;
|
|
|
|
GetStringType(ass, type, &noctets, &zero); // to make hack directives become effective
|
|
info->Data = eBERSTIData_MultibyteString;
|
|
info->NOctets = 1;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_UniversalString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t zero;
|
|
|
|
GetStringType(ass, type, &info->NOctets, &zero);
|
|
info->Data = zero ? eBERSTIData_ZeroString : eBERSTIData_String;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_VideotexString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t noctets, zero;
|
|
|
|
GetStringType(ass, type, &noctets, &zero); // to make hack directives become effective
|
|
info->Data = eBERSTIData_MultibyteString;
|
|
info->NOctets = 1;
|
|
}
|
|
|
|
void
|
|
ExamineBERType_VisibleString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
uint32_t zero;
|
|
|
|
GetStringType(ass, type, &info->NOctets, &zero);
|
|
info->Data = zero ? eBERSTIData_ZeroString : eBERSTIData_String;
|
|
}
|
|
|
|
/*
|
|
* CHARACTER STRING:
|
|
*
|
|
* Data == eBERSTIData_UnrestrictedString
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* - Data == eBERSTIData_EmbeddedPdv ||
|
|
* Data == eBERSTIData_UnrestrictedString
|
|
* -> Identification, the identification of the type if the type
|
|
* is constraint to fixed identification or syntaxes identification
|
|
* with single value
|
|
*/
|
|
void
|
|
ExamineBERType_UnrestrictedString(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->Data = eBERSTIData_UnrestrictedString;
|
|
}
|
|
|
|
/*
|
|
* GeneralizedTime:
|
|
*
|
|
* Data == eBERSTIData_GeneralizedTime
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_GeneralizedTime(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->Data = eBERSTIData_GeneralizedTime;
|
|
}
|
|
|
|
/*
|
|
* UTCTime:
|
|
*
|
|
* Data == eBERSTIData_UTCTime
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_UTCTime(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->Data = eBERSTIData_UTCTime;
|
|
}
|
|
|
|
/*
|
|
* ObjectDescriptor:
|
|
*
|
|
* Data == eBERSTIData_ZeroString
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_ObjectDescriptor(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->NOctets = 1;
|
|
info->Data = eBERSTIData_ZeroString;
|
|
}
|
|
|
|
/*
|
|
* OpenType:
|
|
*
|
|
* Data == eBERSTIData_Open
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_Open(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
info->NOctets = 1;
|
|
info->Data = eBERSTIData_Open;
|
|
}
|
|
|
|
/*
|
|
* SEQUENCE/SET:
|
|
*
|
|
* Data == eBERSTIData_Sequence ||
|
|
* Data == eBERSTIData_Set
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_SequenceSet(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
Component_t *comp;
|
|
NamedType_t *namedType;
|
|
char idebuf[256];
|
|
|
|
info->Data = (type->Type == eType_Sequence) ?
|
|
eBERSTIData_Sequence : eBERSTIData_Set;
|
|
|
|
/* examine types of components */
|
|
for (comp = type->U.SSC.Components; comp; comp = comp->Next) {
|
|
switch (comp->Type) {
|
|
case eComponent_Normal:
|
|
case eComponent_Optional:
|
|
case eComponent_Default:
|
|
namedType = comp->U.NOD.NamedType;
|
|
sprintf(idebuf, "%s_%s", info->Identifier, namedType->Identifier);
|
|
ExamineBERType(ass, namedType->Type, strdup(idebuf));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* SEQUENCE OF/SET OF:
|
|
*
|
|
* Data == eBERSTIData_SequenceOf ||
|
|
* Data == eBERSTIData_SetOf
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* - Data == eBERSTIData_SequenceOf || dat == eBERSTIData_SetOf
|
|
* -> SubIdentifier, the name of the subtype
|
|
* -> SubType, the subtype itself
|
|
* -> Rule, the encoding directive rules
|
|
*/
|
|
void
|
|
ExamineBERType_SequenceSetOf(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
char idebuf[256];
|
|
|
|
/* set data type and Alignment */
|
|
info->Data = (type->Type == eType_SequenceOf ?
|
|
eBERSTIData_SequenceOf : eBERSTIData_SetOf);
|
|
|
|
/* set SubType, SubIdentifier */
|
|
info->SubType = type->U.SS.Type;
|
|
info->SubIdentifier = GetTypeName(ass, info->SubType);
|
|
|
|
/* examine subtype */
|
|
sprintf(idebuf, "%s_%s", info->Identifier,
|
|
type->Type == eType_SequenceOf ? "Sequence" : "Set");
|
|
ExamineBERType(ass, type->U.SS.Type, strdup(idebuf));
|
|
}
|
|
|
|
/*
|
|
* CHOICE:
|
|
*
|
|
* Data == eBERSTIData_Choice
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* - Data == eBERSTIData_Integer || dat == eBERSTIData_Unsigned ||
|
|
* Data == eBERSTIData_Boolean || dat == eBERSTIData_Choice
|
|
* -> NOctets, the size of the integer type
|
|
*/
|
|
void
|
|
ExamineBERType_Choice(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
Component_t *comp;
|
|
NamedType_t *namedType;
|
|
char idebuf[256];
|
|
|
|
info->NOctets = GetOctets(GetChoiceType(type));
|
|
info->Data = eBERSTIData_Choice;
|
|
|
|
/* examine types of alternatives */
|
|
for (comp = type->U.SSC.Components; comp; comp = comp->Next) {
|
|
switch (comp->Type) {
|
|
case eComponent_Normal:
|
|
namedType = comp->U.NOD.NamedType;
|
|
sprintf(idebuf, "%s_%s", info->Identifier, namedType->Identifier);
|
|
ExamineBERType(ass, namedType->Type, strdup(idebuf));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* INSTANCE OF:
|
|
*
|
|
* Data == eBERSTIData_Sequence
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* none
|
|
*/
|
|
void
|
|
ExamineBERType_InstanceOf(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
Component_t *comp;
|
|
NamedType_t *namedType;
|
|
char idebuf[256];
|
|
|
|
info->Data = eBERSTIData_Sequence;
|
|
|
|
/* examine types of components */
|
|
for (comp = type->U.SSC.Components; comp; comp = comp->Next) {
|
|
switch (comp->Type) {
|
|
case eComponent_Normal:
|
|
case eComponent_Optional:
|
|
case eComponent_Default:
|
|
namedType = comp->U.NOD.NamedType;
|
|
sprintf(idebuf, "%s_%s", info->Identifier, namedType->Identifier);
|
|
ExamineBERType(ass, namedType->Type, strdup(idebuf));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Reference:
|
|
*
|
|
* Data == eBERSTIData_Reference
|
|
*
|
|
* Additional arguments:
|
|
*
|
|
* - Data == eBERSTIData_Reference
|
|
* -> SubIdentifier, the name of the subtype
|
|
* -> SubType, the subtype itself
|
|
*/
|
|
void
|
|
ExamineBERType_Reference(AssignmentList_t ass, Type_t *type, BERTypeInfo_t *info)
|
|
{
|
|
Assignment_t *a;
|
|
|
|
info->Data = eBERSTIData_Reference;
|
|
a = GetAssignment(ass, FindAssignment(ass, eAssignment_Type,
|
|
type->U.Reference.Identifier, type->U.Reference.Module));
|
|
info->SubIdentifier = GetName(a);
|
|
info->SubType = a->U.Type.Type;
|
|
}
|