BMPString and UniversalString support


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1271 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c
index bc9102e..4894839 100644
--- a/libasn1compiler/asn1c_C.c
+++ b/libasn1compiler/asn1c_C.c
@@ -1825,14 +1825,16 @@
 				}
 			}
 
-			if(1) {
+			if(alphabetsize) {
+				ebits = rbits;
+			} else {
 				/* X.691, #10.9.4.1 */
 				for(ebits = 0; ebits <= 16; ebits++)
 					if(r <= 1 << ebits) break;
 				if(ebits == 17
 				|| range->right.value >= 65536)
 					ebits = -1;
-			} else {
+			if(0) {
 				/* X.691, #10.5.7.1 */
 				for(ebits = 0; ebits <= 8; ebits++)
 					if(r <= 1 << ebits) break;
@@ -1843,11 +1845,25 @@
 						ebits = -1;
 				}
 			}
+			}
 
 			OUT("{ APC_CONSTRAINED%s,%s% d, % d, ",
 				range->extensible
 					? " | APC_EXTENSIBLE" : "",
 				range->extensible ? " " : "\t", rbits, ebits);
+
+			if(alphabetsize) {
+				asn1c_integer_t lv = range->left.value;
+				asn1c_integer_t rv = range->right.value;
+				int gcmt = 0;
+				if(lv > 0x7fffffff) { lv = 0x7fffffff; gcmt++; }
+				if(rv > 0x7fffffff) { rv = 0x7fffffff; gcmt++; }
+				if(gcmt) {
+					OUT("% " PRIdASN ", % " PRIdASN " }",
+						lv, rv);
+					goto pcmt;
+				}
+			}
 		} else {
 			if(range->extensible) {
 				OUT("{ APC_SEMI_CONSTRAINED | APC_EXTENSIBLE, "
@@ -1862,6 +1878,8 @@
 		OUT("{ APC_UNCONSTRAINED,\t-1, -1,  0,  0 }");
 	}
 
+  pcmt:
+
 	/*
 	 * Print some courtesy debug information.
 	 */
@@ -1948,8 +1966,30 @@
 				expr->combined_constraints, ACT_CT_FROM,
 				0, 0, 0);
 		DEBUG("Emitting FROM constraint for %s", expr->Identifier);
+
+		if((range->left.type == ARE_MIN && range->right.type == ARE_MAX)
+		|| range->not_PER_visible) {
+			switch(etype) {
+			case ASN_STRING_BMPString:
+				range->left.type = ARE_VALUE;
+				range->left.value = 0;
+				range->right.type = ARE_VALUE;
+				range->right.value = 65535;
+				range->not_PER_visible = 0;
+				range->extensible = 0;
+				break;
+			case ASN_STRING_UniversalString:
+				OUT("{ APC_CONSTRAINED,\t32, 32,"
+					" 0, 2147483647 }"
+					" /* special case 1 */\n");
+				goto avoid;
+			default:
+				break;
+			}
+		}
 		if(emit_single_member_PER_constraint(arg, range, 1, 0))
 			return -1;
+		avoid:
 		asn1constraint_range_free(range);
 	} else {
 		range = asn1constraint_compute_PER_range(etype,