extensions of conditional native-typing to -fbless-SIZE constraints


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@959 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c
index 5975bc1..86b629c 100644
--- a/libasn1fix/asn1fix_crange.c
+++ b/libasn1fix/asn1fix_crange.c
@@ -711,7 +711,7 @@
 }
 
 asn1cnst_range_t *
-asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, int strict_PV) {
+asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) {
 	asn1cnst_range_t *range;
 	asn1cnst_range_t *tmp;
 	asn1p_value_t *vmin;
@@ -729,7 +729,8 @@
 	 * Check if the requested constraint is theoretically compatible
 	 * with the given expression type.
 	 */
-	if(asn1constraint_compatible(expr_type, type) != 1) {
+	if(asn1constraint_compatible(expr_type, type,
+			cpr_flags & CPR_simulate_fbless_SIZE) != 1) {
 		errno = EINVAL;
 		return 0;
 	}
@@ -776,7 +777,8 @@
 	if((expr_type & ASN_STRING_NKM_MASK))
 		range->not_PER_visible = 1;
 
-	if(!ct || (strict_PV && range->not_PER_visible))
+	if(!ct
+	|| (range->not_PER_visible && (cpr_flags & CPR_strict_PER_visibility)))
 		return range;
 
 	switch(ct->type) {
@@ -809,7 +811,7 @@
 		}
 		assert(ct->el_count == 1);
 		tmp = asn1constraint_compute_PER_range(expr_type,
-			ct->elements[0], type, minmax, exmet, strict_PV);
+			ct->elements[0], type, minmax, exmet, cpr_flags);
 		if(tmp) {
 			_range_free(range);
 		} else {
@@ -830,7 +832,7 @@
 			tmp = asn1constraint_compute_PER_range(expr_type,
 				ct->elements[i], type,
 				ct->type==ACT_CA_SET?range:minmax, exmet,
-				strict_PV);
+				cpr_flags);
 			if(!tmp) {
 				if(errno == ERANGE) {
 					continue;
@@ -851,7 +853,8 @@
 				continue;
 			}
 
-			if(strict_PV && tmp->not_PER_visible) {
+			if(tmp->not_PER_visible
+			&& (cpr_flags & CPR_strict_PER_visibility)) {
 				if(ct->type == ACT_CA_SET) {
 					/*
 					 * X.691, #9.3.18:
@@ -889,7 +892,7 @@
 		for(i = 0; i < ct->el_count; i++) {
 			tmp = asn1constraint_compute_PER_range(expr_type,
 				ct->elements[i], type, minmax, exmet,
-				strict_PV);
+				cpr_flags);
 			if(!tmp) {
 				if(errno == ERANGE) {
 					range->extensible = 1;
@@ -922,7 +925,7 @@
 		for(; i < ct->el_count; i++) {
 			tmp = asn1constraint_compute_PER_range(expr_type,
 				ct->elements[i], type, minmax, exmet,
-				strict_PV);
+				cpr_flags);
 			if(!tmp) {
 				if(errno == ERANGE) {
 					range->extensible = 1;
@@ -963,7 +966,8 @@
 			range->not_PER_visible = 1;
 		}
 
-		if(strict_PV && range->not_PER_visible) {
+		if(range->not_PER_visible
+		&& (cpr_flags & CPR_strict_PER_visibility)) {
 			/*
 			 * X.691, #9.3.19:
 			 * If not PER-visible constraint is part of UNION,
@@ -987,7 +991,7 @@
 		assert(ct->el_count >= 1);
 		_range_free(range);
 		range = asn1constraint_compute_PER_range(expr_type,
-			ct->elements[0], type, minmax, exmet, strict_PV);
+			ct->elements[0], type, minmax, exmet, cpr_flags);
 		return range;
 	default:
 		range->incompatible = 1;