asn1: Make int sizing consistent and better
This commit is contained in:
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user