diff --git a/lib/asn1/gen.c b/lib/asn1/gen.c index ad8a0b832..b47bb30e9 100644 --- a/lib/asn1/gen.c +++ b/lib/asn1/gen.c @@ -1079,17 +1079,16 @@ define_type(int level, const char *name, const char *basename, Type *pt, Type *t fprintf(headerfile, "} %s;\n", name); } else if (t->range == NULL) { fprintf(headerfile, "heim_integer %s;\n", name); - } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) { + } else if (t->range->min < 0 && + (t->range->min < INT_MIN || t->range->max > INT_MAX)) { fprintf(headerfile, "int64_t %s;\n", name); - } else if (t->range->min >= 0 && t->range->max > UINT_MAX) { - fprintf (headerfile, "uint64_t %s;\n", name); - } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) { - fprintf (headerfile, "unsigned int %s;\n", name); - } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) { + } else if (t->range->min < 0) { fprintf (headerfile, "int %s;\n", name); - } else - errx(1, "%s: unsupported range %lld -> %lld", - name, (long long)t->range->min, (long long)t->range->max); + } else if (t->range->max > UINT_MAX) { + fprintf (headerfile, "uint64_t %s;\n", name); + } else { + fprintf (headerfile, "unsigned int %s;\n", name); + } break; case TBoolean: space(level); diff --git a/lib/asn1/gen_decode.c b/lib/asn1/gen_decode.c index e40870b4f..54579384d 100644 --- a/lib/asn1/gen_decode.c +++ b/lib/asn1/gen_decode.c @@ -275,17 +275,16 @@ decode_type(const char *name, const Type *t, int optional, struct value *defval, name); } else if (t->range == NULL) { decode_primitive ("heim_integer", name, forwstr); - } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) { + } else if (t->range->min < 0 && + (t->range->min < INT_MIN || t->range->max > INT_MAX)) { decode_primitive ("integer64", name, forwstr); - } else if (t->range->min >= 0 && t->range->max > UINT_MAX) { - decode_primitive ("unsigned64", name, forwstr); - } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) { + } else if (t->range->min < 0) { decode_primitive ("integer", name, forwstr); - } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) { + } else if (t->range->max > UINT_MAX) { + decode_primitive ("unsigned64", name, forwstr); + } else { decode_primitive ("unsigned", name, forwstr); - } else - errx(1, "%s: unsupported range %lld -> %lld", - name, (long long)t->range->min, (long long)t->range->max); + } break; case TBoolean: decode_primitive ("boolean", name, forwstr); diff --git a/lib/asn1/gen_encode.c b/lib/asn1/gen_encode.c index 742d2d182..43cf04926 100644 --- a/lib/asn1/gen_encode.c +++ b/lib/asn1/gen_encode.c @@ -139,21 +139,20 @@ encode_type (const char *name, const Type *t, const char *tmpstr) "{\n" "int enumint = (int)*%s;\n", name); - encode_primitive ("integer", "&enumint"); + encode_primitive("integer", "&enumint"); fprintf(codefile, "}\n;"); } else if (t->range == NULL) { - encode_primitive ("heim_integer", name); - } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) { - encode_primitive ("integer64", name); - } else if (t->range->min >= 0 && t->range->max > UINT_MAX) { - encode_primitive ("unsigned64", name); - } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) { - encode_primitive ("integer", name); - } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) { - encode_primitive ("unsigned", name); - } else - errx(1, "%s: unsupported range %lld -> %lld", - name, (long long)t->range->min, (long long)t->range->max); + encode_primitive("heim_integer", name); + } else if (t->range->min < 0 && + (t->range->min < INT_MIN || t->range->max > INT_MAX)) { + encode_primitive("integer64", name); + } else if (t->range->min < 0) { + encode_primitive("integer", name); + } else if (t->range->max > UINT_MAX) { + encode_primitive("unsigned64", name); + } else { + encode_primitive("unsigned", name); + } constructed = 0; break; diff --git a/lib/asn1/gen_length.c b/lib/asn1/gen_length.c index 722508d68..01086baad 100644 --- a/lib/asn1/gen_length.c +++ b/lib/asn1/gen_length.c @@ -80,17 +80,16 @@ length_type (const char *name, const Type *t, fprintf(codefile, "}\n"); } else if (t->range == NULL) { length_primitive ("heim_integer", name, variable); - } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) { + } else if (t->range->min < 0 && + (t->range->min < INT_MIN || t->range->max > INT_MAX)) { length_primitive ("integer64", name, variable); - } else if (t->range->min >= 0 && t->range->max > UINT_MAX) { - length_primitive ("unsigned64", name, variable); - } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) { + } else if (t->range->min < 0) { length_primitive ("integer", name, variable); - } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) { + } else if (t->range->max > UINT_MAX) { + length_primitive ("unsigned64", name, variable); + } else { length_primitive ("unsigned", name, variable); - } else - errx(1, "%s: unsupported range %lld -> %lld", - name, (long long)t->range->min, (long long)t->range->max); + } break; case TBoolean: fprintf (codefile, "%s += 1;\n", variable); diff --git a/lib/asn1/gen_template.c b/lib/asn1/gen_template.c index ef003042f..50a5ce5e4 100644 --- a/lib/asn1/gen_template.c +++ b/lib/asn1/gen_template.c @@ -65,18 +65,15 @@ integer_symbol(const char *basename, const Type *t) return "int"; else if (t->range == NULL) return "heim_integer"; - else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) + else if (t->range->min < 0 && + (t->range->min < INT_MIN || t->range->max > INT_MAX)) return "int64_t"; - else if (t->range->min >= 0 && t->range->max > UINT_MAX) - return "uint64_t"; - else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) + else if (t->range->min < 0) return "int"; - else if (t->range->min >= 0 && t->range->max <= UINT_MAX) + else if (t->range->max > UINT_MAX) + return "uint64_t"; + else return "unsigned"; - else { - abort(); - UNREACHABLE(return NULL); - } } static const char * @@ -578,17 +575,15 @@ defval(struct templatehead *temp, Member *m) if (t->members) dv = "A1_DV_INTEGER32"; /* XXX Enum size assumptions! No good! */ - else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) + else if (t->range->min < 0 && + (t->range->min < INT_MIN || t->range->max > INT_MAX)) dv = "A1_DV_INTEGER64"; - else if (t->range->min >= 0 && t->range->max > UINT_MAX) + else if (t->range->min < 0) + dv = "A1_DV_INTEGER32"; + else if (t->range->max > UINT_MAX) dv = "A1_DV_INTEGER64"; - else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) - dv = "A1_DV_INTEGER32"; - else if (t->range->min >= 0 && t->range->max <= UINT_MAX) - dv = "A1_DV_INTEGER32"; else - errx(1, "unsupported range %lld -> %lld", - (long long)m->type->range->min, (long long)m->type->range->max); + dv = "A1_DV_INTEGER32"; add_line(temp, "{ A1_OP_DEFVAL|%s, ~0, (void *)%llu }", dv, (long long)m->defval->u.integervalue); break; @@ -918,17 +913,15 @@ template_members(struct templatehead *temp, itype = "IMEMBER"; else if (t->range == NULL) itype = "HEIM_INTEGER"; - else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) + else if (t->range->min < 0 && + (t->range->min < INT_MIN || t->range->max > INT_MAX)) itype = "INTEGER64"; - else if (t->range->min >= 0 && t->range->max > UINT_MAX) - itype = "UNSIGNED64"; - else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) + else if (t->range->min < 0) itype = "INTEGER"; - else if (t->range->min >= 0 && t->range->max <= UINT_MAX) - itype = "UNSIGNED"; + else if (t->range->max > UINT_MAX) + itype = "UNSIGNED64"; else - errx(1, "%s: unsupported range %lld -> %lld", - name, (long long)t->range->min, (long long)t->range->max); + itype = "UNSIGNED"; /* * If `t->members' then we should generate a template for those