cleaner pointer arithmetics
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@268 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c
index 10832b5..f824e3a 100644
--- a/libasn1compiler/asn1c_constraint.c
+++ b/libasn1compiler/asn1c_constraint.c
@@ -207,6 +207,20 @@
return 0;
}
+
+ if(range->left.type == ARE_MIN
+ && range->right.type == ARE_MAX) {
+ /*
+ * The permitted alphabet constraint checker code guarantees
+ * that either both bounds (left/right) are present, or
+ * they're absent simultaneously. Thus, this assertion
+ * legitimately holds true.
+ */
+ assert(range->el_count == 0);
+ /* The full range is specified. Ignore it. */
+ return 0;
+ }
+
range_start = range->left.value;
range_stop = range->right.value;
assert(range->left.type == ARE_VALUE);
@@ -369,28 +383,28 @@
natural_stop = 0xffffffffUL;
break;
case ASN_STRING_UniversalString:
- OUT("const uint32_t *ch = st->buf;\n");
- OUT("const uint32_t *end = ch + st->size;\n");
+ OUT("const uint8_t *ch = st->buf;\n");
+ OUT("const uint8_t *end = ch + st->size;\n");
OUT("\n");
- OUT("if(st->size % 4) return -1; /* (size%4)! */\n");
- OUT("for(; ch < end; ch++) {\n");
+ OUT("if(st->size %% 4) return -1; /* (size%%4)! */\n");
+ OUT("for(; ch < end; ch += 4) {\n");
INDENT(+1);
- OUT("uint32_t cv = (((const uint8_t *)ch)[0] << 24)\n");
- OUT("\t\t| (((const uint8_t *)ch)[1] << 16)\n");
- OUT("\t\t| (((const uint8_t *)ch)[2] << 8)\n");
- OUT("\t\t| ((const uint8_t *)ch)[3];\n");
+ OUT("uint32_t cv = (ch[0] << 24)\n");
+ OUT("\t\t| (ch[1] << 16)\n");
+ OUT("\t\t| (ch[2] << 8)\n");
+ OUT("\t\t| ch[3];\n");
if(!range) OUT("if(cv > 255) return -1;\n");
natural_stop = 0xffffffffUL;
break;
case ASN_STRING_BMPString:
- OUT("const uint16_t *ch = st->buf;\n");
- OUT("const uint16_t *end = ch + st->size;\n");
+ OUT("const uint8_t *ch = st->buf;\n");
+ OUT("const uint8_t *end = ch + st->size;\n");
OUT("\n");
- OUT("if(st->size % 2) return -1; /* (size%2)! */\n");
- OUT("for(; ch < end; ch++) {\n");
+ OUT("if(st->size %% 2) return -1; /* (size%%2)! */\n");
+ OUT("for(; ch < end; ch += 2) {\n");
INDENT(+1);
- OUT("uint16_t cv = (((const uint8_t *)ch)[0] << 8)\n");
- OUT("\t\t| ((const uint8_t *)ch)[1];\n");
+ OUT("uint16_t cv = (ch[0] << 8)\n");
+ OUT("\t\t| ch[1];\n");
if(!range) OUT("if(cv > 255) return -1;\n");
natural_stop = 0xffff;
break;