
/*** <<< INCLUDES [PrimitiveType] >>> ***/

#include <OCTET_STRING.h>

/*** <<< TYPE-DECLS [PrimitiveType] >>> ***/


typedef OCTET_STRING_t	 PrimitiveType_t;


/*** <<< FUNC-DECLS [PrimitiveType] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType;
asn_constr_check_f PrimitiveType_constraint;
ber_type_decoder_f PrimitiveType_decode_ber;
der_type_encoder_f PrimitiveType_encode_der;
asn_struct_print_f PrimitiveType_print;
asn_struct_free_f PrimitiveType_free;

/*** <<< STAT-DEFS [PrimitiveType] >>> ***/

static ber_tlv_tag_t asn1_DEF_PrimitiveType_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
};
asn1_TYPE_descriptor_t asn1_DEF_PrimitiveType = {
	"PrimitiveType",
	PrimitiveType_constraint,
	PrimitiveType_decode_ber,
	PrimitiveType_encode_der,
	PrimitiveType_print,
	PrimitiveType_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_PrimitiveType_tags,
	sizeof(asn1_DEF_PrimitiveType_tags)
		/sizeof(asn1_DEF_PrimitiveType_tags[0]),
	1,	/* Tags to skip */
	-0,	/* Unknown yet */
	0	/* No specifics */
};

int
PrimitiveType_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	
	/* Make the underlying type checker permanent */
	td->check_constraints = asn1_DEF_OCTET_STRING.check_constraints;
	return td->check_constraints
		(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using OCTET_STRING,
 * so adjust the DEF appropriately.
 */
static void
inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {
	td->ber_decoder = asn1_DEF_OCTET_STRING.ber_decoder;
	td->der_encoder = asn1_DEF_OCTET_STRING.der_encoder;
	td->free_struct = asn1_DEF_OCTET_STRING.free_struct;
	td->print_struct = asn1_DEF_OCTET_STRING.print_struct;
	td->last_tag_form = asn1_DEF_OCTET_STRING.last_tag_form;
	td->specifics = asn1_DEF_OCTET_STRING.specifics;
}

ber_dec_rval_t
PrimitiveType_decode_ber(asn1_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	inherit_TYPE_descriptor(td);
	return td->ber_decoder(td, structure,
		bufptr, size, tag_mode);
}

der_enc_rval_t
PrimitiveType_encode_der(asn1_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

int
PrimitiveType_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

void
PrimitiveType_free(asn1_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}


/*** <<< INCLUDES [ConstructedType] >>> ***/

#include <PrimitiveType.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [ConstructedType] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_ConstructedType;

/*** <<< TYPE-DECLS [ConstructedType] >>> ***/


typedef struct ConstructedType {
	PrimitiveType_t	 field;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} ConstructedType_t;

/*** <<< STAT-DEFS [ConstructedType] >>> ***/

static asn1_SEQUENCE_element_t asn1_DEF_ConstructedType_elements[] = {
	{ offsetof(struct ConstructedType, field), 0,
		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
		-1,	/* IMPLICIT tag at current level */
		(void *)&asn1_DEF_PrimitiveType,
		"field"
		},
};
static ber_tlv_tag_t asn1_DEF_ConstructedType_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_ConstructedType_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 0, 0, 0 }, /* field at 18 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_ConstructedType_specs = {
	sizeof(struct ConstructedType),
	offsetof(struct ConstructedType, _ber_dec_ctx),
	asn1_DEF_ConstructedType_elements,
	1,	/* Elements count */
	asn1_DEF_ConstructedType_tag2el,
	1,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_ConstructedType = {
	"ConstructedType",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_ConstructedType_tags,
	sizeof(asn1_DEF_ConstructedType_tags)
		/sizeof(asn1_DEF_ConstructedType_tags[0]),
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_ConstructedType_specs	/* Additional specs */
};


/*** <<< INCLUDES [T] >>> ***/

#include <ConstructedType.h>

/*** <<< TYPE-DECLS [T] >>> ***/


typedef ConstructedType_t	 T_t;


/*** <<< FUNC-DECLS [T] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_T;
asn_constr_check_f T_constraint;
ber_type_decoder_f T_decode_ber;
der_type_encoder_f T_encode_der;
asn_struct_print_f T_print;
asn_struct_free_f T_free;

/*** <<< STAT-DEFS [T] >>> ***/

static ber_tlv_tag_t asn1_DEF_T_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (3 << 2))
};
asn1_TYPE_descriptor_t asn1_DEF_T = {
	"T",
	T_constraint,
	T_decode_ber,
	T_encode_der,
	T_print,
	T_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T_tags,
	sizeof(asn1_DEF_T_tags)
		/sizeof(asn1_DEF_T_tags[0]),
	1,	/* Tags to skip */
	-0,	/* Unknown yet */
	0	/* No specifics */
};

int
T_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	
	/* Make the underlying type checker permanent */
	td->check_constraints = asn1_DEF_ConstructedType.check_constraints;
	return td->check_constraints
		(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using ConstructedType,
 * so adjust the DEF appropriately.
 */
static void
inherit_TYPE_descriptor(asn1_TYPE_descriptor_t *td) {
	td->ber_decoder = asn1_DEF_ConstructedType.ber_decoder;
	td->der_encoder = asn1_DEF_ConstructedType.der_encoder;
	td->free_struct = asn1_DEF_ConstructedType.free_struct;
	td->print_struct = asn1_DEF_ConstructedType.print_struct;
	td->last_tag_form = asn1_DEF_ConstructedType.last_tag_form;
	td->specifics = asn1_DEF_ConstructedType.specifics;
}

ber_dec_rval_t
T_decode_ber(asn1_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	inherit_TYPE_descriptor(td);
	return td->ber_decoder(td, structure,
		bufptr, size, tag_mode);
}

der_enc_rval_t
T_encode_der(asn1_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

int
T_print(asn1_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

void
T_free(asn1_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

