refactored tagging support
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@307 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/ANY.c b/skeletons/ANY.c
index 2057120..92b209d 100644
--- a/skeletons/ANY.c
+++ b/skeletons/ANY.c
@@ -15,7 +15,6 @@
OCTET_STRING_free,
0, /* Use generic outmost tag fetcher */
0,
- 0,
0, /* No tags may be overridden */
-1, /* Both ways are fine (primitive and constructed) */
0, 0, /* No members */
diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c
index bca3473..7f1aa09 100644
--- a/skeletons/BIT_STRING.c
+++ b/skeletons/BIT_STRING.c
@@ -21,7 +21,6 @@
asn1_DEF_BIT_STRING_tags,
sizeof(asn1_DEF_BIT_STRING_tags)
/ sizeof(asn1_DEF_BIT_STRING_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
(void *)-1 /* Special indicator that this is a BIT STRING */
diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c
index 6b3ceeb..87aacea 100644
--- a/skeletons/BMPString.c
+++ b/skeletons/BMPString.c
@@ -21,7 +21,6 @@
asn1_DEF_BMPString_tags,
sizeof(asn1_DEF_BMPString_tags)
/ sizeof(asn1_DEF_BMPString_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/BOOLEAN.c b/skeletons/BOOLEAN.c
index b0ae178..b7b4795 100644
--- a/skeletons/BOOLEAN.c
+++ b/skeletons/BOOLEAN.c
@@ -20,7 +20,6 @@
0, /* Use generic outmost tag fetcher */
asn1_DEF_BOOLEAN_tags,
sizeof(asn1_DEF_BOOLEAN_tags)/sizeof(asn1_DEF_BOOLEAN_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/ENUMERATED.c b/skeletons/ENUMERATED.c
index 12350ef..9c8db29 100644
--- a/skeletons/ENUMERATED.c
+++ b/skeletons/ENUMERATED.c
@@ -20,7 +20,6 @@
0, /* Use generic outmost tag fetcher */
asn1_DEF_ENUMERATED_tags,
sizeof(asn1_DEF_ENUMERATED_tags)/sizeof(asn1_DEF_ENUMERATED_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
0, /* Primitive */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/GeneralString.c b/skeletons/GeneralString.c
index db3b87d..feef7cc 100644
--- a/skeletons/GeneralString.c
+++ b/skeletons/GeneralString.c
@@ -21,7 +21,6 @@
asn1_DEF_GeneralString_tags,
sizeof(asn1_DEF_GeneralString_tags)
/ sizeof(asn1_DEF_GeneralString_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c
index e846502..c66c314 100644
--- a/skeletons/GeneralizedTime.c
+++ b/skeletons/GeneralizedTime.c
@@ -85,7 +85,6 @@
asn1_DEF_GeneralizedTime_tags,
sizeof(asn1_DEF_GeneralizedTime_tags)
/ sizeof(asn1_DEF_GeneralizedTime_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/GraphicString.c b/skeletons/GraphicString.c
index bd93146..f6d0ae9 100644
--- a/skeletons/GraphicString.c
+++ b/skeletons/GraphicString.c
@@ -21,7 +21,6 @@
asn1_DEF_GraphicString_tags,
sizeof(asn1_DEF_GraphicString_tags)
/ sizeof(asn1_DEF_GraphicString_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/IA5String.c b/skeletons/IA5String.c
index e3ae82f..33f38a6 100644
--- a/skeletons/IA5String.c
+++ b/skeletons/IA5String.c
@@ -21,7 +21,6 @@
asn1_DEF_IA5String_tags,
sizeof(asn1_DEF_IA5String_tags)
/ sizeof(asn1_DEF_IA5String_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c
index 16a6b74..14e91c6 100644
--- a/skeletons/INTEGER.c
+++ b/skeletons/INTEGER.c
@@ -22,7 +22,6 @@
0, /* Use generic outmost tag fetcher */
asn1_DEF_INTEGER_tags,
sizeof(asn1_DEF_INTEGER_tags)/sizeof(asn1_DEF_INTEGER_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/ISO646String.c b/skeletons/ISO646String.c
index a86d0ce..7ce5496 100644
--- a/skeletons/ISO646String.c
+++ b/skeletons/ISO646String.c
@@ -21,7 +21,6 @@
asn1_DEF_ISO646String_tags,
sizeof(asn1_DEF_ISO646String_tags)
/ sizeof(asn1_DEF_ISO646String_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/NULL.c b/skeletons/NULL.c
index d71d90d..42afa7e 100644
--- a/skeletons/NULL.c
+++ b/skeletons/NULL.c
@@ -21,7 +21,6 @@
0, /* Use generic outmost tag fetcher */
asn1_DEF_NULL_tags,
sizeof(asn1_DEF_NULL_tags)/sizeof(asn1_DEF_NULL_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/NativeEnumerated.c b/skeletons/NativeEnumerated.c
index 139a602..9c4fd8f 100644
--- a/skeletons/NativeEnumerated.c
+++ b/skeletons/NativeEnumerated.c
@@ -27,7 +27,6 @@
0, /* Use generic outmost tag fetcher */
asn1_DEF_NativeEnumerated_tags,
sizeof(asn1_DEF_NativeEnumerated_tags)/sizeof(asn1_DEF_NativeEnumerated_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/NativeInteger.c b/skeletons/NativeInteger.c
index b0cc3b7..60321cc 100644
--- a/skeletons/NativeInteger.c
+++ b/skeletons/NativeInteger.c
@@ -29,7 +29,6 @@
0, /* Use generic outmost tag fetcher */
asn1_DEF_NativeInteger_tags,
sizeof(asn1_DEF_NativeInteger_tags)/sizeof(asn1_DEF_NativeInteger_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/NumericString.c b/skeletons/NumericString.c
index aba1c72..a70bb5d 100644
--- a/skeletons/NumericString.c
+++ b/skeletons/NumericString.c
@@ -21,7 +21,6 @@
asn1_DEF_NumericString_tags,
sizeof(asn1_DEF_NumericString_tags)
/ sizeof(asn1_DEF_NumericString_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c
index fe20905..a44349e 100644
--- a/skeletons/OBJECT_IDENTIFIER.c
+++ b/skeletons/OBJECT_IDENTIFIER.c
@@ -24,7 +24,6 @@
asn1_DEF_OBJECT_IDENTIFIER_tags,
sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags)
/ sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c
index 71d59d3..6589334 100644
--- a/skeletons/OCTET_STRING.c
+++ b/skeletons/OCTET_STRING.c
@@ -23,7 +23,6 @@
asn1_DEF_OCTET_STRING_tags,
sizeof(asn1_DEF_OCTET_STRING_tags)
/ sizeof(asn1_DEF_OCTET_STRING_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine (primitive and constructed) */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/ObjectDescriptor.c b/skeletons/ObjectDescriptor.c
index 3a03b97..1f82e2b 100644
--- a/skeletons/ObjectDescriptor.c
+++ b/skeletons/ObjectDescriptor.c
@@ -21,7 +21,6 @@
asn1_DEF_ObjectDescriptor_tags,
sizeof(asn1_DEF_ObjectDescriptor_tags)
/ sizeof(asn1_DEF_ObjectDescriptor_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/PrintableString.c b/skeletons/PrintableString.c
index 22d2fbc..89cbf8d 100644
--- a/skeletons/PrintableString.c
+++ b/skeletons/PrintableString.c
@@ -21,7 +21,6 @@
asn1_DEF_PrintableString_tags,
sizeof(asn1_DEF_PrintableString_tags)
/ sizeof(asn1_DEF_PrintableString_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c
index 252cc37..f1948f8 100644
--- a/skeletons/RELATIVE-OID.c
+++ b/skeletons/RELATIVE-OID.c
@@ -24,7 +24,6 @@
asn1_DEF_RELATIVE_OID_tags,
sizeof(asn1_DEF_RELATIVE_OID_tags)
/ sizeof(asn1_DEF_RELATIVE_OID_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
0, /* Always in primitive form */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/T61String.c b/skeletons/T61String.c
index 2815298..5226374 100644
--- a/skeletons/T61String.c
+++ b/skeletons/T61String.c
@@ -21,7 +21,6 @@
asn1_DEF_T61String_tags,
sizeof(asn1_DEF_T61String_tags)
/ sizeof(asn1_DEF_T61String_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/TeletexString.c b/skeletons/TeletexString.c
index 3c20e2f..b46caed 100644
--- a/skeletons/TeletexString.c
+++ b/skeletons/TeletexString.c
@@ -21,7 +21,6 @@
asn1_DEF_TeletexString_tags,
sizeof(asn1_DEF_TeletexString_tags)
/ sizeof(asn1_DEF_TeletexString_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/UTCTime.c b/skeletons/UTCTime.c
index b2ca1a6..c574e4e 100644
--- a/skeletons/UTCTime.c
+++ b/skeletons/UTCTime.c
@@ -27,7 +27,6 @@
asn1_DEF_UTCTime_tags,
sizeof(asn1_DEF_UTCTime_tags)
/ sizeof(asn1_DEF_UTCTime_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/UTF8String.c b/skeletons/UTF8String.c
index c96c71a..384600a 100644
--- a/skeletons/UTF8String.c
+++ b/skeletons/UTF8String.c
@@ -21,7 +21,6 @@
asn1_DEF_UTF8String_tags,
sizeof(asn1_DEF_UTF8String_tags)
/ sizeof(asn1_DEF_UTF8String_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c
index 628ed0c..35e7bea 100644
--- a/skeletons/UniversalString.c
+++ b/skeletons/UniversalString.c
@@ -21,7 +21,6 @@
asn1_DEF_UniversalString_tags,
sizeof(asn1_DEF_UniversalString_tags)
/ sizeof(asn1_DEF_UniversalString_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/VideotexString.c b/skeletons/VideotexString.c
index df21b14..772c66c 100644
--- a/skeletons/VideotexString.c
+++ b/skeletons/VideotexString.c
@@ -21,7 +21,6 @@
asn1_DEF_VideotexString_tags,
sizeof(asn1_DEF_VideotexString_tags)
/ sizeof(asn1_DEF_VideotexString_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/VisibleString.c b/skeletons/VisibleString.c
index d1a11db..18a27fa 100644
--- a/skeletons/VisibleString.c
+++ b/skeletons/VisibleString.c
@@ -21,7 +21,6 @@
asn1_DEF_VisibleString_tags,
sizeof(asn1_DEF_VisibleString_tags)
/ sizeof(asn1_DEF_VisibleString_tags[0]),
- 1, /* Single UNIVERSAL tag may be implicitly overriden */
-1, /* Both ways are fine */
0, 0, /* No members */
0 /* No specifics */
diff --git a/skeletons/ber_decoder.c b/skeletons/ber_decoder.c
index b2c08f5..24a47ac 100644
--- a/skeletons/ber_decoder.c
+++ b/skeletons/ber_decoder.c
@@ -53,7 +53,7 @@
int tagno;
/*
- * So what does all this tags_impl_skip stuff mean?
+ * So what does all this implicit skip stuff mean?
* Imagine two types,
* A ::= [5] IMPLICIT T
* B ::= [2] EXPLICIT T
@@ -74,30 +74,14 @@
* it appropriately.
*/
- /*
- * We have a list of tags that must occur in the stream:
- * {A,B,C}
- * However, it may be indicated that the type is
- * implicitly tagged in the caller, so it really boils down to the
- * {I,B,C} or even {I,C}
- * This is because the implicit tag at above structure may replace
- * zero or more (or every) tags which follow it. We don't care
- * about the precise number, as it is already computed for us
- * by the ASN.1 compiler and placed into td->tags_impl_skip.
- * So let's suppose the only tag left after implicit tagging is {I}.
- * Yet, the table we have is {A,B,C} and td->tags_impl_skip=3.
- * We need to check at least one tag in the loop, so the loop range
- * is modified so it will be invoked at least one time.
- */
tagno = ctx->step /* Continuing where left previously */
- + (tag_mode==-1?(td->tags_impl_skip-1):0)
+ (tag_mode==1?-1:0)
;
ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)",
td->name, (long)size, tag_mode, ctx->step, tagno);
//assert(td->tags_count >= 1); ?May not be the case for CHOICE or ANY.
- if(tagno == td->tags_count) {
+ if(tag_mode == 0 && tagno == td->tags_count) {
/*
* This must be the _untagged_ ANY type,
* which outermost tag isn't known in advance.
diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c
index 649f53b..36412a6 100644
--- a/skeletons/constr_SEQUENCE.c
+++ b/skeletons/constr_SEQUENCE.c
@@ -226,8 +226,10 @@
* Fetch the T from TLV.
*/
tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag);
- ASN_DEBUG("In %s SEQUENCE for %d %s next tag length %d",
- td->name, edx, elements[edx].name, (int)tag_len);
+ ASN_DEBUG("Current tag in %s SEQUENCE for element %d "
+ "(%s) is %s encoded in %d bytes, left %ld",
+ td->name, edx, elements[edx].name,
+ ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT);
switch(tag_len) {
case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE);
/* Fall through */
diff --git a/skeletons/constr_SET.c b/skeletons/constr_SET.c
index f103fa3..7a31334 100644
--- a/skeletons/constr_SET.c
+++ b/skeletons/constr_SET.c
@@ -654,7 +654,6 @@
int
SET_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
asn_app_consume_bytes_f *app_errlog, void *app_key) {
- asn1_SET_specifics_t *specs = (asn1_SET_specifics_t *)td->specifics;
int edx;
if(!sptr) {
diff --git a/skeletons/constr_TYPE.h b/skeletons/constr_TYPE.h
index e072ec5..1918b5c 100644
--- a/skeletons/constr_TYPE.h
+++ b/skeletons/constr_TYPE.h
@@ -74,7 +74,6 @@
*/
ber_tlv_tag_t *tags; /* At least one tag must be specified */
int tags_count; /* Number of tags which are expected */
- int tags_impl_skip; /* Tags to skip in implicit mode */
int last_tag_form; /* Acceptable form of the tag (prim, constr) */
/*
diff --git a/skeletons/constraints.c b/skeletons/constraints.c
index a7dce95..862d8f1 100644
--- a/skeletons/constraints.c
+++ b/skeletons/constraints.c
@@ -112,12 +112,13 @@
va_start(ap, fmt);
- ret = vsnprintf(buf, len, fmt, ap);
+ ret = vsnprintf(p, len, fmt, ap);
va_end(ap);
if(ret < 0 || ret >= (ssize_t)len) {
ret = sizeof("<broken vsnprintf>") - 1;
memcpy(buf, "<broken vsnprintf>", ret + 1);
+ p = buf;
}
- cb(buf, ret, key);
+ cb(p, ret, key);
}
diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c
index fbdccec..be71492 100644
--- a/skeletons/der_encoder.c
+++ b/skeletons/der_encoder.c
@@ -44,12 +44,12 @@
ssize_t *lens;
int i;
- ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, iskip=%d, tag=%s, mtc=%d)",
- sd->name, tag_mode, sd->tags_count, sd->tags_impl_skip,
+ ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, tag=%s, mtc=%d)",
+ sd->name, tag_mode, sd->tags_count,
ber_tlv_tag_string(tag),
tag_mode
?(sd->tags_count+1
- -((tag_mode==-1)?sd->tags_impl_skip:0))
+ -((tag_mode == -1) && sd->tags_count))
:sd->tags_count
);
@@ -67,10 +67,10 @@
}
tags_count = sd->tags_count
+ 1 /* EXPLICIT or IMPLICIT tag is given */
- - ((tag_mode==-1)?sd->tags_impl_skip:0);
+ - ((tag_mode == -1) && sd->tags_count);
/* Copy tags over */
tags[0] = tag;
- stag_offset = -1 + ((tag_mode==-1)?sd->tags_impl_skip:0);
+ stag_offset = -1 + ((tag_mode == -1) && sd->tags_count);
for(i = 1; i < tags_count; i++)
tags[i] = sd->tags[i + stag_offset];
} else {