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 {