refactored parameterization support


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1102 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1parser/asn1p_value.c b/libasn1parser/asn1p_value.c
index 2242e3f..6686e49 100644
--- a/libasn1parser/asn1p_value.c
+++ b/libasn1parser/asn1p_value.c
@@ -110,6 +110,13 @@
 
 asn1p_value_t *
 asn1p_value_clone(asn1p_value_t *v) {
+	return asn1p_value_clone_with_resolver(v, 0, 0);
+}
+
+asn1p_value_t *
+asn1p_value_clone_with_resolver(asn1p_value_t *v,
+		asn1p_value_t *(*resolver)(asn1p_value_t *, void *rarg),
+		void *rarg) {
 	asn1p_value_t *clone = NULL;
 	if(v) {
 		switch(v->type) {
@@ -142,6 +149,11 @@
 			return asn1p_value_frombits(v->value.binary_vector.bits,
 				v->value.binary_vector.size_in_bits, 1);
 		case ATV_REFERENCED:
+			if(resolver) {
+				clone = resolver(v, rarg);
+				if(clone) return clone;
+				else if(errno != ESRCH) return NULL;
+			}
 			return asn1p_value_fromref(v->value.reference, 1);
 		case ATV_CHOICE_IDENTIFIER: {
 			char *id = v->value.choice_identifier.identifier;