From c3e29404e7e3e3519a68fb2b3d33ecc7bd7f903c Mon Sep 17 00:00:00 2001
From: Lev Walkin <vlm@lionet.info>
Date: Fri, 10 Sep 2004 06:07:18 +0000
Subject: [PATCH] new tags api

---
 libasn1compiler/asn1c_C.c | 34 +++++++++++++++-------------------
 1 file changed, 15 insertions(+), 19 deletions(-)

diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c
index 81ae9716..4d9390cb 100644
--- a/libasn1compiler/asn1c_C.c
+++ b/libasn1compiler/asn1c_C.c
@@ -24,7 +24,7 @@ static int asn1c_lang_C_type_SEQUENCE_def(arg_t *arg);
 static int asn1c_lang_C_type_SET_def(arg_t *arg);
 static int asn1c_lang_C_type_CHOICE_def(arg_t *arg);
 static int asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of);
-static int _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p);
+static int _print_tag(arg_t *arg, struct asn1p_type_tag_s *tag_p);
 static int check_if_extensible(asn1p_expr_t *expr);
 static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr);
 static int emit_member_table(arg_t *arg, asn1p_expr_t *expr);
@@ -903,20 +903,10 @@ static int check_if_extensible(asn1p_expr_t *expr) {
 }
 
 static int
-_print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p) {
-	struct asn1p_type_tag_s tag;
-
-	if(tag_p) {
-		tag = *tag_p;
-	} else {
-		if(asn1f_fetch_tag(arg->asn, arg->mod, expr, &tag, 0)) {
-			OUT("-1 /* Ambiguous tag (CHOICE|ANY?) */");
-			return 0;
-		}
-	}
+_print_tag(arg_t *arg, struct asn1p_type_tag_s *tag) {
 
 	OUT("(");
-	switch(tag.tag_class) {
+	switch(tag->tag_class) {
 	case TC_UNIVERSAL:		OUT("ASN_TAG_CLASS_UNIVERSAL"); break;
 	case TC_APPLICATION:		OUT("ASN_TAG_CLASS_APPLICATION"); break;
 	case TC_CONTEXT_SPECIFIC:	OUT("ASN_TAG_CLASS_CONTEXT"); break;
@@ -924,7 +914,7 @@ _print_tag(arg_t *arg, asn1p_expr_t *expr, struct asn1p_type_tag_s *tag_p) {
 	case TC_NOCLASS:
 		break;
 	}
-	OUT(" | (%lld << 2))", tag.tag_value);
+	OUT(" | (%lld << 2))", tag->tag_value);
 
 	return 0;
 }
@@ -1030,7 +1020,7 @@ _add_tag2el_member(arg_t *arg, tag2el_t **tag2el, int *count, int el_no) {
 
 	assert(el_no >= 0);
 
-	ret = asn1f_fetch_tag(arg->asn, arg->mod, arg->expr, &tag, 1);
+	ret = asn1f_fetch_outmost_tag(arg->asn, arg->mod, arg->expr, &tag, 1);
 	if(ret == 0) {
 		tag2el_t *te;
 		int new_count = (*count) + 1;
@@ -1106,7 +1096,7 @@ emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count) {
 		int i;
 		for(i = 0; i < tag2el_count; i++) {
 			OUT("    { ");
-			_print_tag(arg, expr, &tag2el[i].el_tag);
+			_print_tag(arg, &tag2el[i].el_tag);
 			OUT(", ");
 			OUT("%d, ", tag2el[i].el_no);
 			OUT("%d, ", tag2el[i].toff_first);
@@ -1148,7 +1138,7 @@ emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice
 	INDENT(+1);
 	if(expr->tag.tag_class) {
 		tags_count++;
-		_print_tag(arg, expr, &expr->tag);
+		_print_tag(arg, &expr->tag);
 		if(expr->tag.tag_mode != TM_EXPLICIT)
 			(*tags_impl_skip)++;
 	} else {
@@ -1165,7 +1155,7 @@ emit_tags_vector(arg_t *arg, asn1p_expr_t *expr, int *tags_impl_skip, int choice
 			tag.tag_class = TC_UNIVERSAL;
 			tag.tag_mode = TM_IMPLICIT;
 			tag.tag_value = expr_type2uclass_value[expr->expr_type];
-			_print_tag(arg, expr, &tag);
+			_print_tag(arg, &tag);
 			tags_count++;
 		}
 	}
@@ -1201,6 +1191,7 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) {
 	static int global_memb_unique;
 	int save_target;
 	arg_t tmp_arg;
+	struct asn1p_type_tag_s outmost_tag;
 	char *p;
 
 	OUT("{ ");
@@ -1228,7 +1219,12 @@ emit_member_table(arg_t *arg, asn1p_expr_t *expr) {
 	}
 	INDENT(+1);
 	if(C99_MODE) OUT(".tag = ");
-	_print_tag(arg, expr , NULL);
+	if(asn1f_fetch_outmost_tag(arg->asn,
+			expr->module, expr, &outmost_tag, 0)) {
+		OUT("-1 /* Ambiguous tag (CHOICE|ANY?) */");
+	} else {
+		_print_tag(arg, &outmost_tag);
+	}
 	OUT(",\n");
 	if(C99_MODE) OUT(".tag_mode = ");
 	if(expr->tag.tag_class) {
-- 
GitLab