removed -N command-line argument
diff --git a/tests/07-int-OK.asn1.-EF b/tests/07-int-OK.asn1.-EF
new file mode 100644
index 0000000..b3d6a0c
--- /dev/null
+++ b/tests/07-int-OK.asn1.-EF
@@ -0,0 +1,20 @@
+
+ModuleTestInt1 {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 7 }
+DEFINITIONS ::=
+BEGIN
+
+int123456 INTEGER ::= 123456
+
+Interval ::= INTEGER (1..123456)
+
+SameInterval ::= INTEGER
+
+Reason ::= INTEGER {
+ no-reason(0),
+ negative-reason(-10),
+ some-large-value(1324324)
+}
+
+END
diff --git a/tests/16-constraint-OK.asn1.-EF b/tests/16-constraint-OK.asn1.-EF
new file mode 100644
index 0000000..e039e09
--- /dev/null
+++ b/tests/16-constraint-OK.asn1.-EF
@@ -0,0 +1,20 @@
+
+ModuleTestConstraint {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 16 }
+DEFINITIONS ::=
+BEGIN
+
+Type1 ::= IA5String (SIZE (1..10,...))(FROM ("a".."z"|"#"))
+
+Type2 ::= IA5String (SIZE (MIN..4)|FROM ("abc"))
+
+Type3 ::= BMPString (SIZE (1))
+
+Type4 ::= INTEGER (1..MAX)
+
+Type5 ::= BOOLEAN (TRUE|FALSE)
+
+v1 Type1 ::= "#value with ""double quotes"""
+
+END
diff --git a/tests/20-constr-OK.asn1.-EF b/tests/20-constr-OK.asn1.-EF
new file mode 100644
index 0000000..bf4e396
--- /dev/null
+++ b/tests/20-constr-OK.asn1.-EF
@@ -0,0 +1,24 @@
+
+ModuleTestConstr {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 20 }
+DEFINITIONS IMPLICIT TAGS EXTENSIBILITY IMPLIED ::=
+BEGIN
+
+ConstructedType1 ::= SEQUENCE {
+ a [1] IMPLICIT INTEGER,
+ b [2] IMPLICIT INTEGER,
+ d UTF8String,
+ ...!ex1,
+ c IA5String
+}
+
+ConstructedType2 ::= SET {
+ a [1] IMPLICIT INTEGER,
+ b [2] IMPLICIT INTEGER,
+ ...
+}
+
+ex1 INTEGER ::= 1
+
+END
diff --git a/tests/21-tags-OK.asn1.-EF b/tests/21-tags-OK.asn1.-EF
new file mode 100644
index 0000000..bf468d4
--- /dev/null
+++ b/tests/21-tags-OK.asn1.-EF
@@ -0,0 +1,26 @@
+
+ModuleTestTags1 {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 21 1 }
+DEFINITIONS EXPLICIT TAGS ::=
+BEGIN
+
+T1 ::= CHOICE {
+ first [0] EXPLICIT INTEGER,
+ second [1] EXPLICIT INTEGER
+}
+
+END
+
+ModuleTestTags2 {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 21 2 }
+DEFINITIONS IMPLICIT TAGS ::=
+BEGIN
+
+T2 ::= SEQUENCE {
+ one [0] EXPLICIT T1,
+ two [1] IMPLICIT IA5String
+}
+
+END
diff --git a/tests/22-tags-OK.asn1.-EF b/tests/22-tags-OK.asn1.-EF
new file mode 100644
index 0000000..3edad65
--- /dev/null
+++ b/tests/22-tags-OK.asn1.-EF
@@ -0,0 +1,17 @@
+
+ModuleTestTags3 {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 22 }
+DEFINITIONS AUTOMATIC TAGS ::=
+BEGIN
+
+T1 ::= SEQUENCE {
+ a [0] IMPLICIT INTEGER,
+ b [1] EXPLICIT CHOICE {
+ i [0] IMPLICIT INTEGER,
+ n [1] IMPLICIT IA5String
+ },
+ c [2] IMPLICIT UTF8String
+}
+
+END
diff --git a/tests/23-bits-OK.asn1.-EF b/tests/23-bits-OK.asn1.-EF
new file mode 100644
index 0000000..a3e15a5
--- /dev/null
+++ b/tests/23-bits-OK.asn1.-EF
@@ -0,0 +1,20 @@
+
+ModuleTestBitString {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 23 }
+DEFINITIONS AUTOMATIC TAGS ::=
+BEGIN
+
+v28 INTEGER ::= 28
+
+BS1 ::= BIT STRING {
+ first(0),
+ third(2),
+ twenty-eight(28)
+}
+
+one-zero-one BS1 ::= '101'B
+
+one0one BS1 ::= '101'B
+
+END
diff --git a/tests/24-sequence-OK.asn1.-EF b/tests/24-sequence-OK.asn1.-EF
new file mode 100644
index 0000000..d1380d2
--- /dev/null
+++ b/tests/24-sequence-OK.asn1.-EF
@@ -0,0 +1,15 @@
+
+ModuleTestSequence {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 24 }
+DEFINITIONS IMPLICIT TAGS ::=
+BEGIN
+
+T ::= [5] EXPLICIT SEQUENCE {
+ a INTEGER,
+ b [0] IMPLICIT INTEGER OPTIONAL,
+ c [1] IMPLICIT INTEGER DEFAULT <?>,
+ d [5] EXPLICIT INTEGER
+}
+
+END
diff --git a/tests/34-class-OK.asn1.-EF b/tests/34-class-OK.asn1.-EF
new file mode 100644
index 0000000..e9f76b5
--- /dev/null
+++ b/tests/34-class-OK.asn1.-EF
@@ -0,0 +1,36 @@
+
+ModuleTestClassSimple {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 34 }
+DEFINITIONS IMPLICIT TAGS ::=
+BEGIN
+
+EXTENSION ::= CLASS {
+ &id OBJECT IDENTIFIER UNIQUE,
+ &ExtnType
+} WITH SYNTAX {
+ SYNTAX &ExtnType
+ IDENTIFIED BY &id
+ }
+
+
+Ext1 ::= SEQUENCE {
+ extnId EXTENSION.&id
+}
+
+EXTENSION-ATTRIBUTE ::= CLASS {
+ &id INTEGER (0..256) UNIQUE,
+ &Type
+} WITH SYNTAX {&Type IDENTIFIED BY &id}
+
+
+terminal-type EXTENSION-ATTRIBUTE ::= { TerminalType IDENTIFIED BY 23}
+
+ExtensionAttribute ::= SEQUENCE {
+ extension-attribute-type [0] IMPLICIT EXTENSION-ATTRIBUTE.&id ({ExtensionAttributeTable}),
+ extension-attribute-value [1] IMPLICIT EXTENSION-ATTRIBUTE.&Type ({ExtensionAttributeTable}{@extension-attribute-type})
+}
+
+ub-extension-attributes INTEGER ::= 256
+
+END
diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P
index d073e49..7536fca 100644
--- a/tests/39-sequence-of-OK.asn1.-P
+++ b/tests/39-sequence-of-OK.asn1.-P
@@ -54,7 +54,7 @@
asn1_DEF_collection_tags,
sizeof(asn1_DEF_collection_tags)
/sizeof(asn1_DEF_collection_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_collection_specs /* Additional specs */
};
@@ -103,7 +103,7 @@
asn1_DEF_T_tags,
sizeof(asn1_DEF_T_tags)
/sizeof(asn1_DEF_T_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_T_specs /* Additional specs */
};
@@ -176,7 +176,7 @@
asn1_DEF_T2_tags,
sizeof(asn1_DEF_T2_tags)
/sizeof(asn1_DEF_T2_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_T2_specs /* Additional specs */
};
diff --git a/tests/42-real-life-OK.asn1.-EF b/tests/42-real-life-OK.asn1.-EF
new file mode 100644
index 0000000..7b3a89d
--- /dev/null
+++ b/tests/42-real-life-OK.asn1.-EF
@@ -0,0 +1,45 @@
+
+ModuleLAPStorage {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 42 }
+DEFINITIONS EXTENSIBILITY IMPLIED ::=
+BEGIN
+
+LogLine ::= SEQUENCE {
+ line-digest IA5String,
+ varsets SEQUENCE OF VariablePartSet,
+ ...
+}
+
+VariablePartSet ::= SEQUENCE {
+ vparts SEQUENCE OF VariablePart,
+ resolution ActionItem,
+ ...
+}
+
+VariablePart ::= CHOICE {
+ vset SET OF VisibleString,
+ vrange SEQUENCE {
+ from VisibleString,
+ to VisibleString,
+ ...
+ },
+ ...
+}
+
+ActionItem ::= SEQUENCE {
+ accept-as ENUMERATED {
+ unknown(0),
+ safe(1),
+ unsafe(2),
+ ...
+ },
+ notify SEQUENCE {
+ critical BOOLEAN,
+ email SET OF VisibleString,
+ ...
+ } OPTIONAL,
+ ...
+}
+
+END
diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR
index 0cf1be9..990e2c2 100644
--- a/tests/42-real-life-OK.asn1.-PR
+++ b/tests/42-real-life-OK.asn1.-PR
@@ -58,7 +58,7 @@
asn1_DEF_varsets_tags,
sizeof(asn1_DEF_varsets_tags)
/sizeof(asn1_DEF_varsets_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_varsets_specs /* Additional specs */
};
@@ -107,7 +107,7 @@
asn1_DEF_LogLine_tags,
sizeof(asn1_DEF_LogLine_tags)
/sizeof(asn1_DEF_LogLine_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_LogLine_specs /* Additional specs */
};
@@ -172,7 +172,7 @@
asn1_DEF_vparts_tags,
sizeof(asn1_DEF_vparts_tags)
/sizeof(asn1_DEF_vparts_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_vparts_specs /* Additional specs */
};
@@ -221,7 +221,7 @@
asn1_DEF_VariablePartSet_tags,
sizeof(asn1_DEF_VariablePartSet_tags)
/sizeof(asn1_DEF_VariablePartSet_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_VariablePartSet_specs /* Additional specs */
};
@@ -306,7 +306,7 @@
asn1_DEF_vset_tags,
sizeof(asn1_DEF_vset_tags)
/sizeof(asn1_DEF_vset_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_vset_specs /* Additional specs */
};
@@ -355,7 +355,7 @@
asn1_DEF_vrange_tags,
sizeof(asn1_DEF_vrange_tags)
/sizeof(asn1_DEF_vrange_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_vrange_specs /* Additional specs */
};
@@ -494,7 +494,7 @@
asn1_DEF_email_tags,
sizeof(asn1_DEF_email_tags)
/sizeof(asn1_DEF_email_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_email_specs /* Additional specs */
};
@@ -543,7 +543,7 @@
asn1_DEF_notify_tags,
sizeof(asn1_DEF_notify_tags)
/sizeof(asn1_DEF_notify_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_notify_specs /* Additional specs */
};
@@ -592,7 +592,7 @@
asn1_DEF_ActionItem_tags,
sizeof(asn1_DEF_ActionItem_tags)
/sizeof(asn1_DEF_ActionItem_tags[0]),
- 0, /* Tags to skip */
+ 1, /* Tags to skip */
1, /* Whether CONSTRUCTED */
&asn1_DEF_ActionItem_specs /* Additional specs */
};
diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P
new file mode 100644
index 0000000..6cab701
--- /dev/null
+++ b/tests/44-choice-in-sequence-OK.asn1.-P
@@ -0,0 +1,293 @@
+
+/*** <<< DEPS [T] >>> ***/
+
+/* Dependencies for T */
+#include <NULL.h>
+
+/* Dependencies for b */
+#include <NULL.h>
+#include <NULL.h>
+
+/* Dependencies for e */
+#include <NULL.h>
+#include <NULL.h>
+
+/* Dependencies for h */
+#include <NULL.h>
+#include <NULL.h>
+
+#include <constr_SEQUENCE.h>
+
+extern asn1_TYPE_descriptor_t asn1_DEF_T;
+
+/*** <<< TYPE-DECLS [T] >>> ***/
+
+
+typedef struct T {
+ NULL_t a;
+ struct b {
+ enum {
+ b_PR_NOTHING, /* No components present */
+ b_PR_c,
+ b_PR_d,
+ b_PR_e,
+ b_PR_h,
+ } present;
+ union {
+ NULL_t c;
+ NULL_t d;
+ struct e {
+ enum {
+ e_PR_NOTHING, /* No components present */
+ e_PR_f,
+ e_PR_g,
+ } present;
+ union {
+ NULL_t f;
+ NULL_t g;
+ } choice;
+
+ /* Context for parsing across buffer boundaries */
+ ber_dec_ctx_t _ber_dec_ctx;
+ } e;
+ struct h {
+ enum {
+ h_PR_NOTHING, /* No components present */
+ h_PR_i,
+ h_PR_j,
+ } present;
+ union {
+ NULL_t i;
+ NULL_t j;
+ } choice;
+
+ /* Context for parsing across buffer boundaries */
+ ber_dec_ctx_t _ber_dec_ctx;
+ } h;
+ } choice;
+
+ /* Context for parsing across buffer boundaries */
+ ber_dec_ctx_t _ber_dec_ctx;
+ } b;
+
+ /* Context for parsing across buffer boundaries */
+ ber_dec_ctx_t _ber_dec_ctx;
+} T_t;
+
+/*** <<< STAT-DEFS [T] >>> ***/
+
+ #include <constr_CHOICE.h>
+
+ static asn1_CHOICE_element_t asn1_DEF_e_elements[] = {
+ { offsetof(struct e, choice.f), 0,
+ (ASN_TAG_CLASS_PRIVATE | (7 << 2)),
+ -1, /* IMPLICIT tag at current level */
+ (void *)&asn1_DEF_NULL,
+ "f"
+ },
+ { offsetof(struct e, choice.g), 0,
+ (ASN_TAG_CLASS_PRIVATE | (8 << 2)),
+ -1, /* IMPLICIT tag at current level */
+ (void *)&asn1_DEF_NULL,
+ "g"
+ },
+ };
+ static ber_tlv_tag_t asn1_DEF_e_tags[] = {
+ };
+ static asn1_TYPE_tag2member_t asn1_DEF_e_tag2el[] = {
+ { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 0, 0, 0 }, /* f at 20 */
+ { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */
+ };
+ static asn1_CHOICE_specifics_t asn1_DEF_e_specs = {
+ sizeof(struct e),
+ offsetof(struct e, _ber_dec_ctx),
+ offsetof(struct e, present),
+ sizeof(((struct e *)0)->present),
+ asn1_DEF_e_elements,
+ 2, /* Elements count */
+ asn1_DEF_e_tag2el,
+ 2, /* Count of tags in the map */
+ 0 /* Whether extensible */
+ };
+ asn1_TYPE_descriptor_t asn1_DEF_e = {
+ "e",
+ CHOICE_constraint,
+ CHOICE_decode_ber,
+ CHOICE_encode_der,
+ CHOICE_print,
+ CHOICE_free,
+ CHOICE_outmost_tag,
+ asn1_DEF_e_tags,
+ sizeof(asn1_DEF_e_tags)
+ /sizeof(asn1_DEF_e_tags[0]),
+ 0, /* Tags to skip */
+ 1, /* Whether CONSTRUCTED */
+ &asn1_DEF_e_specs /* Additional specs */
+ };
+
+ #include <constr_CHOICE.h>
+
+ static asn1_CHOICE_element_t asn1_DEF_h_elements[] = {
+ { offsetof(struct h, choice.i), 0,
+ (ASN_TAG_CLASS_PRIVATE | (1 << 2)),
+ -1, /* IMPLICIT tag at current level */
+ (void *)&asn1_DEF_NULL,
+ "i"
+ },
+ { offsetof(struct h, choice.j), 0,
+ (ASN_TAG_CLASS_PRIVATE | (2 << 2)),
+ -1, /* IMPLICIT tag at current level */
+ (void *)&asn1_DEF_NULL,
+ "j"
+ },
+ };
+ static ber_tlv_tag_t asn1_DEF_h_tags[] = {
+ };
+ static asn1_TYPE_tag2member_t asn1_DEF_h_tag2el[] = {
+ { (ASN_TAG_CLASS_PRIVATE | (1 << 2)), 0, 0, 0 }, /* i at 24 */
+ { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 1, 0, 0 }, /* j at 25 */
+ };
+ static asn1_CHOICE_specifics_t asn1_DEF_h_specs = {
+ sizeof(struct h),
+ offsetof(struct h, _ber_dec_ctx),
+ offsetof(struct h, present),
+ sizeof(((struct h *)0)->present),
+ asn1_DEF_h_elements,
+ 2, /* Elements count */
+ asn1_DEF_h_tag2el,
+ 2, /* Count of tags in the map */
+ 0 /* Whether extensible */
+ };
+ asn1_TYPE_descriptor_t asn1_DEF_h = {
+ "h",
+ CHOICE_constraint,
+ CHOICE_decode_ber,
+ CHOICE_encode_der,
+ CHOICE_print,
+ CHOICE_free,
+ CHOICE_outmost_tag,
+ asn1_DEF_h_tags,
+ sizeof(asn1_DEF_h_tags)
+ /sizeof(asn1_DEF_h_tags[0]),
+ 0, /* Tags to skip */
+ 1, /* Whether CONSTRUCTED */
+ &asn1_DEF_h_specs /* Additional specs */
+ };
+
+ #include <constr_CHOICE.h>
+
+ static asn1_CHOICE_element_t asn1_DEF_b_elements[] = {
+ { offsetof(struct b, choice.c), 0,
+ (ASN_TAG_CLASS_PRIVATE | (5 << 2)),
+ -1, /* IMPLICIT tag at current level */
+ (void *)&asn1_DEF_NULL,
+ "c"
+ },
+ { offsetof(struct b, choice.d), 0,
+ (ASN_TAG_CLASS_PRIVATE | (6 << 2)),
+ -1, /* IMPLICIT tag at current level */
+ (void *)&asn1_DEF_NULL,
+ "d"
+ },
+ { offsetof(struct b, choice.e), 0,
+ -1 /* Ambiguous tag (CHOICE?) */,
+ 0,
+ (void *)&asn1_DEF_e,
+ "e"
+ },
+ { offsetof(struct b, choice.h), 0,
+ (ASN_TAG_CLASS_PRIVATE | (9 << 2)),
+ +1, /* EXPLICIT tag at current level */
+ (void *)&asn1_DEF_h,
+ "h"
+ },
+ };
+ static ber_tlv_tag_t asn1_DEF_b_tags[] = {
+ };
+ static asn1_TYPE_tag2member_t asn1_DEF_b_tag2el[] = {
+ { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 0, 0, 0 }, /* c at 17 */
+ { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */
+ { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 2, 0, 0 }, /* f at 20 */
+ { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 2, 0, 0 }, /* g at 21 */
+ { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 3, 0, 0 }, /* h at 24 */
+ };
+ static asn1_CHOICE_specifics_t asn1_DEF_b_specs = {
+ sizeof(struct b),
+ offsetof(struct b, _ber_dec_ctx),
+ offsetof(struct b, present),
+ sizeof(((struct b *)0)->present),
+ asn1_DEF_b_elements,
+ 4, /* Elements count */
+ asn1_DEF_b_tag2el,
+ 5, /* Count of tags in the map */
+ 0 /* Whether extensible */
+ };
+ asn1_TYPE_descriptor_t asn1_DEF_b = {
+ "b",
+ CHOICE_constraint,
+ CHOICE_decode_ber,
+ CHOICE_encode_der,
+ CHOICE_print,
+ CHOICE_free,
+ CHOICE_outmost_tag,
+ asn1_DEF_b_tags,
+ sizeof(asn1_DEF_b_tags)
+ /sizeof(asn1_DEF_b_tags[0]),
+ 0, /* Tags to skip */
+ 1, /* Whether CONSTRUCTED */
+ &asn1_DEF_b_specs /* Additional specs */
+ };
+
+#include <constr_SEQUENCE.h>
+
+static asn1_SEQUENCE_element_t asn1_DEF_T_elements[] = {
+ { offsetof(struct T, a), 0,
+ (ASN_TAG_CLASS_PRIVATE | (2 << 2)),
+ -1, /* IMPLICIT tag at current level */
+ (void *)&asn1_DEF_NULL,
+ "a"
+ },
+ { offsetof(struct T, b), 0,
+ -1 /* Ambiguous tag (CHOICE?) */,
+ 0,
+ (void *)&asn1_DEF_b,
+ "b"
+ },
+};
+static ber_tlv_tag_t asn1_DEF_T_tags[] = {
+ (ASN_TAG_CLASS_PRIVATE | (1 << 2))
+};
+static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = {
+ { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 0, 0, 0 }, /* a at 15 */
+ { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 1, 0, 0 }, /* c at 17 */
+ { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */
+ { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 1, 0, 0 }, /* f at 20 */
+ { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */
+ { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 1, 0, 0 }, /* h at 24 */
+};
+static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = {
+ sizeof(struct T),
+ offsetof(struct T, _ber_dec_ctx),
+ asn1_DEF_T_elements,
+ 2, /* Elements count */
+ asn1_DEF_T_tag2el,
+ 6, /* Count of tags in the map */
+ -1, /* Start extensions */
+ -1 /* Stop extensions */
+};
+asn1_TYPE_descriptor_t asn1_DEF_T = {
+ "T",
+ SEQUENCE_constraint,
+ SEQUENCE_decode_ber,
+ SEQUENCE_encode_der,
+ SEQUENCE_print,
+ SEQUENCE_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 */
+ 1, /* Whether CONSTRUCTED */
+ &asn1_DEF_T_specs /* Additional specs */
+};
+
diff --git a/tests/45-undefined-type-SE.asn1 b/tests/45-undefined-type-SE.asn1
new file mode 100644
index 0000000..0450e87
--- /dev/null
+++ b/tests/45-undefined-type-SE.asn1
@@ -0,0 +1,16 @@
+
+-- OK: Everything is fine
+
+-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
+-- .spelio.software.asn1c.test (9363.1.5.1)
+-- .45
+
+ModuleKnownExternType
+ { iso org(3) dod(6) internet (1) private(4) enterprise(1)
+ spelio(9363) software(1) asn1c(5) test(1) 45 }
+ DEFINITIONS ::=
+BEGIN
+
+ Type ::= KnownExt -- KnownExt is known to be external.
+
+END
diff --git a/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt b/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt
new file mode 100644
index 0000000..423b32b
--- /dev/null
+++ b/tests/45-undefined-type-SE.asn1.-EFfknown-extern-type=KnownExt
@@ -0,0 +1,10 @@
+
+ModuleKnownExternType {iso(-1) org(3) dod(6) internet(1) private(4)
+ enterprise(1) spelio(9363) software(1) asn1c(5) test(1)
+ 45 }
+DEFINITIONS ::=
+BEGIN
+
+Type ::= KnownExt
+
+END
diff --git a/tests/46-redefine-OK.asn1 b/tests/46-redefine-OK.asn1
new file mode 100644
index 0000000..7890363
--- /dev/null
+++ b/tests/46-redefine-OK.asn1
@@ -0,0 +1,22 @@
+
+-- OK: Everything is fine
+
+-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
+-- .spelio.software.asn1c.test (9363.1.5.1)
+-- .46
+
+ModuleChoiceInSequence
+ { iso org(3) dod(6) internet (1) private(4) enterprise(1)
+ spelio(9363) software(1) asn1c(5) test(1) 46 }
+ DEFINITIONS IMPLICIT TAGS ::=
+BEGIN
+
+ PrimitiveType ::= OCTET STRING
+
+ ConstructedType ::= SEQUENCE {
+ field [5] PrimitiveType
+ }
+
+ T ::= [3] ConstructedType
+
+END
diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR
new file mode 100644
index 0000000..2fc1e4d
--- /dev/null
+++ b/tests/46-redefine-OK.asn1.-PR
@@ -0,0 +1,254 @@
+
+/*** <<< DEPS [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);
+}
+
+
+/*** <<< DEPS [ConstructedType] >>> ***/
+
+/* Dependencies for ConstructedType */
+#include <PrimitiveType.h>
+
+#include <constr_SEQUENCE.h>
+
+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] >>> ***/
+
+#include <constr_SEQUENCE.h>
+
+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 */
+};
+
+
+/*** <<< DEPS [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);
+}
+