
/*** <<< INCLUDES [PDU] >>> ***/

#include <IA5String.h>
#include "Singleton.h"
#include <constr_SEQUENCE.h>

/*** <<< FWD-DECLS [PDU] >>> ***/

struct PDU_2;
struct Singleton;

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

typedef struct PDU {
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	IA5String_t	*str_o	/* OPTIONAL */;
	IA5String_t	*str_m;
	struct Singleton	*singl;
	struct PDU_2	*pdu_2	/* OPTIONAL */;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} PDU_t;

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

extern asn_TYPE_descriptor_t asn_DEF_PDU;

/*** <<< POST-INCLUDE [PDU] >>> ***/

#include "PDU-2.h"

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

static asn_TYPE_member_t asn_MBR_PDU_1[] = {
	{ ATF_POINTER, 4, offsetof(struct PDU, str_o),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_IA5String,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "str-o"
		},
	{ ATF_POINTER, 3, offsetof(struct PDU, str_m),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_IA5String,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "str-m"
		},
	{ ATF_POINTER, 2, offsetof(struct PDU, singl),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_Singleton,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "singl"
		},
	{ ATF_POINTER, 1, offsetof(struct PDU, pdu_2),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = &asn_DEF_PDU_2,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "pdu-2"
		},
};
static const int asn_MAP_PDU_oms_1[] = { 0, 1, 2, 3 };
static const ber_tlv_tag_t asn_DEF_PDU_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_PDU_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* str-o */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* str-m */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* singl */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* pdu-2 */
};
static asn_SEQUENCE_specifics_t asn_SPC_PDU_specs_1 = {
	sizeof(struct PDU),
	offsetof(struct PDU, _asn_ctx),
	.tag2el = asn_MAP_PDU_tag2el_1,
	.tag2el_count = 4,	/* Count of tags in the map */
	asn_MAP_PDU_oms_1,	/* Optional members */
	0, 4,	/* Root/Additions */
	0,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_PDU = {
	"PDU",
	"PDU",
	&asn_OP_SEQUENCE,
	asn_DEF_PDU_tags_1,
	sizeof(asn_DEF_PDU_tags_1)
		/sizeof(asn_DEF_PDU_tags_1[0]), /* 1 */
	asn_DEF_PDU_tags_1,	/* Same as above */
	sizeof(asn_DEF_PDU_tags_1)
		/sizeof(asn_DEF_PDU_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_PDU_1,
	4,	/* Elements count */
	&asn_SPC_PDU_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Singleton] >>> ***/

#include <IA5String.h>
#include <constr_SEQUENCE.h>

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

typedef struct Singleton {
	IA5String_t	*opt_z	/* DEFAULT z */;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Singleton_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Singleton;
extern asn_SEQUENCE_specifics_t asn_SPC_Singleton_specs_1;
extern asn_TYPE_member_t asn_MBR_Singleton_1[1];

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

static int asn_DFL_2_cmp(const void *sptr) {
	static const uint8_t defv[] = "z";
	const IA5String_t *st = sptr;
	
	if(!st) {
		return -1; /* No value is not a default value */
	}
	
	if(st->size == (sizeof(defv) - 1)
	&& memcmp(st->buf, &defv, sizeof(defv) - 1) == 0)
		return 0;
	return 1;
}
static int asn_DFL_2_set(void **sptr) {
	static const uint8_t defv[] = "z";
	IA5String_t *st = *sptr;
	uint8_t *nstr = MALLOC(sizeof(defv));
	
	if(!nstr) return -1;
	memcpy(nstr, defv, sizeof(defv));
	
	if(st) {
		FREEMEM(st->buf);
	} else {
		st = (*sptr = CALLOC(1, sizeof(*st)));
		if(!st) { FREEMEM(nstr); return -1; }
	}
	st->buf = nstr;
	st->size = sizeof(defv) - 1;
	
	return 0;
}
asn_TYPE_member_t asn_MBR_Singleton_1[] = {
	{ ATF_POINTER, 1, offsetof(struct Singleton, opt_z),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_IA5String,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		.default_value_cmp = &asn_DFL_2_cmp,	/* Compare DEFAULT "z" */
		.default_value_set = &asn_DFL_2_set,	/* Set DEFAULT "z" */
		.name = "opt-z"
		},
};
static const int asn_MAP_Singleton_oms_1[] = { 0 };
static const ber_tlv_tag_t asn_DEF_Singleton_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Singleton_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* opt-z */
};
asn_SEQUENCE_specifics_t asn_SPC_Singleton_specs_1 = {
	sizeof(struct Singleton),
	offsetof(struct Singleton, _asn_ctx),
	.tag2el = asn_MAP_Singleton_tag2el_1,
	.tag2el_count = 1,	/* Count of tags in the map */
	asn_MAP_Singleton_oms_1,	/* Optional members */
	1, 0,	/* Root/Additions */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_Singleton = {
	"Singleton",
	"Singleton",
	&asn_OP_SEQUENCE,
	asn_DEF_Singleton_tags_1,
	sizeof(asn_DEF_Singleton_tags_1)
		/sizeof(asn_DEF_Singleton_tags_1[0]), /* 1 */
	asn_DEF_Singleton_tags_1,	/* Same as above */
	sizeof(asn_DEF_Singleton_tags_1)
		/sizeof(asn_DEF_Singleton_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_Singleton_1,
	1,	/* Elements count */
	&asn_SPC_Singleton_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [PDU-2] >>> ***/

#include <NativeInteger.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [PDU-2] >>> ***/

typedef enum PDU_2_PR {
	PDU_2_PR_NOTHING,	/* No components present */
	PDU_2_PR_main,
	/* Extensions may appear below */
	PDU_2_PR_ext1,
	PDU_2_PR_ext0
} PDU_2_PR;

/*** <<< TYPE-DECLS [PDU-2] >>> ***/

typedef struct PDU_2 {
	PDU_2_PR present;
	union PDU_2_u {
		long	 main;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
		long	 ext1;
		long	 ext0;
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} PDU_2_t;

/*** <<< FUNC-DECLS [PDU-2] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_PDU_2;
extern asn_CHOICE_specifics_t asn_SPC_PDU_2_specs_1;
extern asn_TYPE_member_t asn_MBR_PDU_2_1[3];
extern asn_per_constraints_t asn_PER_type_PDU_2_constr_1;

/*** <<< CTDEFS [PDU-2] >>> ***/

asn_per_constraints_t asn_PER_type_PDU_2_constr_1 CC_NOTUSED = {
	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0,  0 }	/* (0..0,...) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};

/*** <<< STAT-DEFS [PDU-2] >>> ***/

asn_TYPE_member_t asn_MBR_PDU_2_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct PDU_2, choice.main),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NativeInteger,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "main"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU_2, choice.ext1),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NativeInteger,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "ext1"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU_2, choice.ext0),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_NativeInteger,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "ext0"
		},
};
static const unsigned asn_MAP_PDU_2_to_canonical_1[] = { 0, 2, 1 };
static const unsigned asn_MAP_PDU_2_from_canonical_1[] = { 0, 2, 1 };
static const asn_TYPE_tag2member_t asn_MAP_PDU_2_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* ext0 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ext1 */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 } /* main */
};
asn_CHOICE_specifics_t asn_SPC_PDU_2_specs_1 = {
	sizeof(struct PDU_2),
	offsetof(struct PDU_2, _asn_ctx),
	offsetof(struct PDU_2, present),
	sizeof(((struct PDU_2 *)0)->present),
	.tag2el = asn_MAP_PDU_2_tag2el_1,
	.tag2el_count = 3,	/* Count of tags in the map */
	.to_canonical_order = asn_MAP_PDU_2_to_canonical_1,
	.from_canonical_order = asn_MAP_PDU_2_from_canonical_1,
	.first_extension = 1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_PDU_2 = {
	"PDU-2",
	"PDU-2",
	&asn_OP_CHOICE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, &asn_PER_type_PDU_2_constr_1, CHOICE_constraint },
	asn_MBR_PDU_2_1,
	3,	/* Elements count */
	&asn_SPC_PDU_2_specs_1	/* Additional specs */
};

