From caaf7a5414872cab694d9c399b9172aa441b3cbd Mon Sep 17 00:00:00 2001
From: Lev Walkin <vlm@lionet.info>
Date: Wed, 15 Sep 2004 11:46:28 +0000
Subject: [PATCH] added ChoiceIdentifier

---
 libasn1fix/asn1fix_misc.c | 89 ++++++++++++++++++++++++---------------
 1 file changed, 55 insertions(+), 34 deletions(-)

diff --git a/libasn1fix/asn1fix_misc.c b/libasn1fix/asn1fix_misc.c
index 8e70c901..c022abce 100644
--- a/libasn1fix/asn1fix_misc.c
+++ b/libasn1fix/asn1fix_misc.c
@@ -23,12 +23,13 @@ asn1f_printable_value(asn1p_value_t *v) {
 	int ret;
 
 #define	ENSURE(len)	do {						\
-		if(len >= managedptr_len) {				\
+		int __len = (len);					\
+		if(__len >= managedptr_len) {				\
 			if(managedptr)					\
 				free(managedptr);			\
-			managedptr = malloc(len + 1);			\
+			managedptr = malloc(__len + 1);			\
 			if(managedptr) {				\
-				managedptr_len = len;			\
+				managedptr_len = __len;			\
 			} else {					\
 				managedptr_len = 0;			\
 				return "<memory allocation error>";	\
@@ -42,37 +43,8 @@ asn1f_printable_value(asn1p_value_t *v) {
 	switch(v->type) {
 	case ATV_NOVALUE:
 		return "<NO VALUE>";
-	case ATV_REFERENCED:
-		{
-			asn1p_ref_t *ref;
-			char reflen;
-			char *ptr;
-			int i;
-
-			assert(v->value.reference);
-			ref = v->value.reference;
-			reflen = ref->comp_count;	/* Number of dots */
-			for(i = 0; i < ref->comp_count; i++)
-				reflen += strlen(ref->components[i].name);
-			/*
-			 * Make sure we have a buffer of this size.
-			 */
-			ENSURE(reflen);
-
-			/*
-			 * Fill-up the buffer.
-			 */
-			ptr = managedptr;
-			for(i = 0; i < ref->comp_count; i++) {
-				char *nc;
-				if(i) *ptr++ = '.';
-				for(nc = ref->components[i].name; *nc; nc++)
-					*ptr++ = *nc;
-			}
-			*ptr++ = '\0';
-			assert(reflen == (ptr - managedptr));
-			return managedptr;
-		}
+	case ATV_NULL:
+		return "NULL";
 	case ATV_REAL:
 		ret = snprintf(buf, sizeof(buf), "%f", v->value.v_double);
 		if(ret >= (ssize_t)sizeof(buf))
@@ -141,6 +113,55 @@ asn1f_printable_value(asn1p_value_t *v) {
 			assert((ptr - managedptr) == len);
 			return managedptr;
 		}
+	case ATV_REFERENCED:
+		{
+			asn1p_ref_t *ref;
+			char reflen;
+			char *ptr;
+			int i;
+
+			assert(v->value.reference);
+			ref = v->value.reference;
+			reflen = ref->comp_count;	/* Number of dots */
+			for(i = 0; i < ref->comp_count; i++)
+				reflen += strlen(ref->components[i].name);
+			/*
+			 * Make sure we have a buffer of this size.
+			 */
+			ENSURE(reflen);
+
+			/*
+			 * Fill-up the buffer.
+			 */
+			ptr = managedptr;
+			for(i = 0; i < ref->comp_count; i++) {
+				char *nc;
+				if(i) *ptr++ = '.';
+				for(nc = ref->components[i].name; *nc; nc++)
+					*ptr++ = *nc;
+			}
+			*ptr++ = '\0';
+			assert(reflen == (ptr - managedptr));
+			return managedptr;
+		}
+	case ATV_CHOICE_IDENTIFIER:
+		{
+			char *cid = v->value.choice_identifier.identifier;
+			char const *vptr = asn1f_printable_value(
+					v->value.choice_identifier.value);
+			char *val;
+
+			val = strdup(vptr);
+			if(!val) return "<memory allocation error>";
+
+			ENSURE(strlen(cid) + sizeof(": ") + strlen(val));
+
+			ret = snprintf(managedptr, managedptr_len + 1,
+				"%s: %s", cid, val);
+			assert(ret >= 0 && ret <= managedptr_len);
+			free(val);
+			return managedptr;
+		}
 	}
 
 	return "<some complex value>";
-- 
GitLab