asn1: Make int sizing consistent and better

This commit is contained in:
Nicolas Williams
2021-03-10 15:26:34 -06:00
parent 440bfeda58
commit 7f4e9db9f9
5 changed files with 52 additions and 63 deletions

View File

@@ -1079,17 +1079,16 @@ define_type(int level, const char *name, const char *basename, Type *pt, Type *t
fprintf(headerfile, "} %s;\n", name); fprintf(headerfile, "} %s;\n", name);
} else if (t->range == NULL) { } else if (t->range == NULL) {
fprintf(headerfile, "heim_integer %s;\n", name); 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); fprintf(headerfile, "int64_t %s;\n", name);
} else if (t->range->min >= 0 && t->range->max > UINT_MAX) { } else if (t->range->min < 0) {
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) {
fprintf (headerfile, "int %s;\n", name); fprintf (headerfile, "int %s;\n", name);
} else } else if (t->range->max > UINT_MAX) {
errx(1, "%s: unsupported range %lld -> %lld", fprintf (headerfile, "uint64_t %s;\n", name);
name, (long long)t->range->min, (long long)t->range->max); } else {
fprintf (headerfile, "unsigned int %s;\n", name);
}
break; break;
case TBoolean: case TBoolean:
space(level); space(level);

View File

@@ -275,17 +275,16 @@ decode_type(const char *name, const Type *t, int optional, struct value *defval,
name); name);
} else if (t->range == NULL) { } else if (t->range == NULL) {
decode_primitive ("heim_integer", name, forwstr); 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); decode_primitive ("integer64", name, forwstr);
} else if (t->range->min >= 0 && t->range->max > UINT_MAX) { } else if (t->range->min < 0) {
decode_primitive ("unsigned64", name, forwstr);
} else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) {
decode_primitive ("integer", name, forwstr); 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); 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; break;
case TBoolean: case TBoolean:
decode_primitive ("boolean", name, forwstr); decode_primitive ("boolean", name, forwstr);

View File

@@ -139,21 +139,20 @@ encode_type (const char *name, const Type *t, const char *tmpstr)
"{\n" "{\n"
"int enumint = (int)*%s;\n", "int enumint = (int)*%s;\n",
name); name);
encode_primitive ("integer", "&enumint"); encode_primitive("integer", "&enumint");
fprintf(codefile, "}\n;"); fprintf(codefile, "}\n;");
} else if (t->range == NULL) { } else if (t->range == NULL) {
encode_primitive ("heim_integer", name); encode_primitive("heim_integer", name);
} else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) { } else if (t->range->min < 0 &&
encode_primitive ("integer64", name); (t->range->min < INT_MIN || t->range->max > INT_MAX)) {
} else if (t->range->min >= 0 && t->range->max > UINT_MAX) { encode_primitive("integer64", name);
encode_primitive ("unsigned64", name); } else if (t->range->min < 0) {
} else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) { encode_primitive("integer", name);
encode_primitive ("integer", name); } else if (t->range->max > UINT_MAX) {
} else if (t->range->min >= 0 && t->range->max <= UINT_MAX) { encode_primitive("unsigned64", name);
encode_primitive ("unsigned", name); } else {
} else encode_primitive("unsigned", name);
errx(1, "%s: unsupported range %lld -> %lld", }
name, (long long)t->range->min, (long long)t->range->max);
constructed = 0; constructed = 0;
break; break;

View File

@@ -80,17 +80,16 @@ length_type (const char *name, const Type *t,
fprintf(codefile, "}\n"); fprintf(codefile, "}\n");
} else if (t->range == NULL) { } else if (t->range == NULL) {
length_primitive ("heim_integer", name, variable); 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); length_primitive ("integer64", name, variable);
} else if (t->range->min >= 0 && t->range->max > UINT_MAX) { } else if (t->range->min < 0) {
length_primitive ("unsigned64", name, variable);
} else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) {
length_primitive ("integer", name, variable); 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); 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; break;
case TBoolean: case TBoolean:
fprintf (codefile, "%s += 1;\n", variable); fprintf (codefile, "%s += 1;\n", variable);

View File

@@ -65,18 +65,15 @@ integer_symbol(const char *basename, const Type *t)
return "int"; return "int";
else if (t->range == NULL) else if (t->range == NULL)
return "heim_integer"; 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"; return "int64_t";
else if (t->range->min >= 0 && t->range->max > UINT_MAX) else if (t->range->min < 0)
return "uint64_t";
else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX)
return "int"; 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"; return "unsigned";
else {
abort();
UNREACHABLE(return NULL);
}
} }
static const char * static const char *
@@ -578,17 +575,15 @@ defval(struct templatehead *temp, Member *m)
if (t->members) if (t->members)
dv = "A1_DV_INTEGER32"; /* XXX Enum size assumptions! No good! */ 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"; 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"; 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 else
errx(1, "unsupported range %lld -> %lld", dv = "A1_DV_INTEGER32";
(long long)m->type->range->min, (long long)m->type->range->max);
add_line(temp, "{ A1_OP_DEFVAL|%s, ~0, (void *)%llu }", add_line(temp, "{ A1_OP_DEFVAL|%s, ~0, (void *)%llu }",
dv, (long long)m->defval->u.integervalue); dv, (long long)m->defval->u.integervalue);
break; break;
@@ -918,17 +913,15 @@ template_members(struct templatehead *temp,
itype = "IMEMBER"; itype = "IMEMBER";
else if (t->range == NULL) else if (t->range == NULL)
itype = "HEIM_INTEGER"; 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"; itype = "INTEGER64";
else if (t->range->min >= 0 && t->range->max > UINT_MAX) else if (t->range->min < 0)
itype = "UNSIGNED64";
else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX)
itype = "INTEGER"; itype = "INTEGER";
else if (t->range->min >= 0 && t->range->max <= UINT_MAX) else if (t->range->max > UINT_MAX)
itype = "UNSIGNED"; itype = "UNSIGNED64";
else else
errx(1, "%s: unsupported range %lld -> %lld", itype = "UNSIGNED";
name, (long long)t->range->min, (long long)t->range->max);
/* /*
* If `t->members' then we should generate a template for those * If `t->members' then we should generate a template for those