catch error from as.*printf
This commit is contained in:
@@ -124,7 +124,10 @@ test_principal (void)
|
|||||||
|
|
||||||
for (i = 0; i < ntests; ++i) {
|
for (i = 0; i < ntests; ++i) {
|
||||||
tests[i].val = &values[i];
|
tests[i].val = &values[i];
|
||||||
asprintf (&tests[i].name, "Principal %d", i);
|
if (asprintf (&tests[i].name, "Principal %d", i) < 0)
|
||||||
|
errx(1, "malloc");
|
||||||
|
if (tests[i].name == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = generic_test (tests, ntests, sizeof(Principal),
|
ret = generic_test (tests, ntests, sizeof(Principal),
|
||||||
@@ -191,7 +194,10 @@ test_authenticator (void)
|
|||||||
|
|
||||||
for (i = 0; i < ntests; ++i) {
|
for (i = 0; i < ntests; ++i) {
|
||||||
tests[i].val = &values[i];
|
tests[i].val = &values[i];
|
||||||
asprintf (&tests[i].name, "Authenticator %d", i);
|
if (asprintf (&tests[i].name, "Authenticator %d", i) < 0)
|
||||||
|
errx(1, "malloc");
|
||||||
|
if (tests[i].name == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = generic_test (tests, ntests, sizeof(Authenticator),
|
ret = generic_test (tests, ntests, sizeof(Authenticator),
|
||||||
|
@@ -116,7 +116,7 @@ get_filename (void)
|
|||||||
void
|
void
|
||||||
init_generate (const char *filename, const char *base)
|
init_generate (const char *filename, const char *base)
|
||||||
{
|
{
|
||||||
char *fn;
|
char *fn = NULL;
|
||||||
|
|
||||||
orig_filename = filename;
|
orig_filename = filename;
|
||||||
if (base != NULL) {
|
if (base != NULL) {
|
||||||
@@ -145,6 +145,7 @@ init_generate (const char *filename, const char *base)
|
|||||||
if (privheaderfile == NULL)
|
if (privheaderfile == NULL)
|
||||||
err (1, "open %s", fn);
|
err (1, "open %s", fn);
|
||||||
free(fn);
|
free(fn);
|
||||||
|
fn = NULL;
|
||||||
|
|
||||||
/* template file */
|
/* template file */
|
||||||
if (asprintf(&template, "%s-template.c", headerbase) < 0 || template == NULL)
|
if (asprintf(&template, "%s-template.c", headerbase) < 0 || template == NULL)
|
||||||
@@ -229,8 +230,7 @@ init_generate (const char *filename, const char *base)
|
|||||||
headerfile);
|
headerfile);
|
||||||
fprintf (headerfile, "struct units;\n\n");
|
fprintf (headerfile, "struct units;\n\n");
|
||||||
fprintf (headerfile, "#endif\n\n");
|
fprintf (headerfile, "#endif\n\n");
|
||||||
asprintf(&fn, "%s_files", base);
|
if (asprintf(&fn, "%s_files", base) < 0 || fn == NULL)
|
||||||
if (fn == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
logfile = fopen(fn, "w");
|
logfile = fopen(fn, "w");
|
||||||
if (logfile == NULL)
|
if (logfile == NULL)
|
||||||
@@ -324,19 +324,19 @@ gen_compare_defval(const char *var, struct value *val)
|
|||||||
void
|
void
|
||||||
generate_header_of_codefile(const char *name)
|
generate_header_of_codefile(const char *name)
|
||||||
{
|
{
|
||||||
char *filename;
|
char *filename = NULL;
|
||||||
|
|
||||||
if (codefile != NULL)
|
if (codefile != NULL)
|
||||||
abort();
|
abort();
|
||||||
|
|
||||||
asprintf (&filename, "%s_%s.x", STEM, name);
|
if (asprintf (&filename, "%s_%s.x", STEM, name) < 0 || filename == NULL)
|
||||||
if (filename == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
codefile = fopen (filename, "w");
|
codefile = fopen (filename, "w");
|
||||||
if (codefile == NULL)
|
if (codefile == NULL)
|
||||||
err (1, "fopen %s", filename);
|
err (1, "fopen %s", filename);
|
||||||
fprintf(logfile, "%s ", filename);
|
fprintf(logfile, "%s ", filename);
|
||||||
free(filename);
|
free(filename);
|
||||||
|
filename = NULL;
|
||||||
fprintf (codefile,
|
fprintf (codefile,
|
||||||
"/* Generated from %s */\n"
|
"/* Generated from %s */\n"
|
||||||
"/* Do not edit */\n\n"
|
"/* Do not edit */\n\n"
|
||||||
@@ -664,7 +664,8 @@ getnewbasename(char **newbasename, int typedefp, const char *basename, const cha
|
|||||||
else {
|
else {
|
||||||
if (name[0] == '*')
|
if (name[0] == '*')
|
||||||
name++;
|
name++;
|
||||||
asprintf(newbasename, "%s_%s", basename, name);
|
if (asprintf(newbasename, "%s_%s", basename, name) < 0)
|
||||||
|
errx(1, "malloc");
|
||||||
}
|
}
|
||||||
if (*newbasename == NULL)
|
if (*newbasename == NULL)
|
||||||
err(1, "malloc");
|
err(1, "malloc");
|
||||||
@@ -730,27 +731,30 @@ define_type (int level, const char *name, const char *basename, Type *t, int typ
|
|||||||
|
|
||||||
fprintf (headerfile, "struct %s {\n", newbasename);
|
fprintf (headerfile, "struct %s {\n", newbasename);
|
||||||
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
||||||
char *n;
|
char *n = NULL;
|
||||||
|
|
||||||
/* pad unused */
|
/* pad unused */
|
||||||
while (pos < m->val) {
|
while (pos < m->val) {
|
||||||
asprintf (&n, "_unused%d:1", pos);
|
if (asprintf (&n, "_unused%d:1", pos) < 0 || n == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
define_type (level + 1, n, newbasename, &i, FALSE, FALSE);
|
define_type (level + 1, n, newbasename, &i, FALSE, FALSE);
|
||||||
free(n);
|
free(n);
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
asprintf (&n, "%s:1", m->gen_name);
|
n = NULL;
|
||||||
if (n == NULL)
|
if (asprintf (&n, "%s:1", m->gen_name) < 0 || n == NULL)
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
define_type (level + 1, n, newbasename, &i, FALSE, FALSE);
|
define_type (level + 1, n, newbasename, &i, FALSE, FALSE);
|
||||||
free (n);
|
free (n);
|
||||||
|
n = NULL;
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
/* pad to 32 elements */
|
/* pad to 32 elements */
|
||||||
while (pos < 32) {
|
while (pos < 32) {
|
||||||
char *n;
|
char *n = NULL;
|
||||||
asprintf (&n, "_unused%d:1", pos);
|
if (asprintf (&n, "_unused%d:1", pos) < 0 || n == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
define_type (level + 1, n, newbasename, &i, FALSE, FALSE);
|
define_type (level + 1, n, newbasename, &i, FALSE, FALSE);
|
||||||
free(n);
|
free(n);
|
||||||
pos++;
|
pos++;
|
||||||
@@ -794,10 +798,9 @@ define_type (int level, const char *name, const char *basename, Type *t, int typ
|
|||||||
if (m->ellipsis) {
|
if (m->ellipsis) {
|
||||||
;
|
;
|
||||||
} else if (m->optional) {
|
} else if (m->optional) {
|
||||||
char *n;
|
char *n = NULL;
|
||||||
|
|
||||||
asprintf (&n, "*%s", m->gen_name);
|
if (asprintf (&n, "*%s", m->gen_name) < 0 || n == NULL)
|
||||||
if (n == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
define_type (level + 1, n, newbasename, m->type, FALSE, FALSE);
|
define_type (level + 1, n, newbasename, m->type, FALSE, FALSE);
|
||||||
free (n);
|
free (n);
|
||||||
@@ -882,10 +885,9 @@ define_type (int level, const char *name, const char *basename, Type *t, int typ
|
|||||||
space(level + 2);
|
space(level + 2);
|
||||||
fprintf(headerfile, "heim_octet_string asn1_ellipsis;\n");
|
fprintf(headerfile, "heim_octet_string asn1_ellipsis;\n");
|
||||||
} else if (m->optional) {
|
} else if (m->optional) {
|
||||||
char *n;
|
char *n = NULL;
|
||||||
|
|
||||||
asprintf (&n, "*%s", m->gen_name);
|
if (asprintf (&n, "*%s", m->gen_name) < 0 || n == NULL)
|
||||||
if (n == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
define_type (level + 2, n, newbasename, m->type, FALSE, FALSE);
|
define_type (level + 2, n, newbasename, m->type, FALSE, FALSE);
|
||||||
free (n);
|
free (n);
|
||||||
|
@@ -320,14 +320,13 @@ decode_type (const char *name, const Type *t, int optional,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
||||||
char *s;
|
char *s = NULL;
|
||||||
|
|
||||||
if (m->ellipsis)
|
if (m->ellipsis)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
asprintf (&s, "%s(%s)->%s", m->optional ? "" : "&",
|
if (asprintf (&s, "%s(%s)->%s", m->optional ? "" : "&",
|
||||||
name, m->gen_name);
|
name, m->gen_name) < 0 || s == NULL)
|
||||||
if (s == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
decode_type (s, m->type, m->optional, forwstr, m->gen_name, NULL);
|
decode_type (s, m->type, m->optional, forwstr, m->gen_name, NULL);
|
||||||
free (s);
|
free (s);
|
||||||
@@ -363,8 +362,7 @@ decode_type (const char *name, const Type *t, int optional,
|
|||||||
is_primitive_type(m->type->subtype->type) ? "PRIM" : "CONS",
|
is_primitive_type(m->type->subtype->type) ? "PRIM" : "CONS",
|
||||||
valuename(m->type->tag.tagclass, m->type->tag.tagvalue));
|
valuename(m->type->tag.tagclass, m->type->tag.tagvalue));
|
||||||
|
|
||||||
asprintf (&s, "%s(%s)->%s", m->optional ? "" : "&", name, m->gen_name);
|
if (asprintf (&s, "%s(%s)->%s", m->optional ? "" : "&", name, m->gen_name) < 0 || s == NULL)
|
||||||
if (s == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
if(m->optional)
|
if(m->optional)
|
||||||
fprintf(codefile,
|
fprintf(codefile,
|
||||||
@@ -388,8 +386,7 @@ decode_type (const char *name, const Type *t, int optional,
|
|||||||
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
asprintf (&s, "%s->%s", name, m->gen_name);
|
if (asprintf (&s, "%s->%s", name, m->gen_name) < 0 || s == NULL)
|
||||||
if (s == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
fprintf(codefile, "if((members & (1 << %d)) == 0)\n", memno);
|
fprintf(codefile, "if((members & (1 << %d)) == 0)\n", memno);
|
||||||
if(m->optional)
|
if(m->optional)
|
||||||
@@ -406,8 +403,8 @@ decode_type (const char *name, const Type *t, int optional,
|
|||||||
}
|
}
|
||||||
case TSetOf:
|
case TSetOf:
|
||||||
case TSequenceOf: {
|
case TSequenceOf: {
|
||||||
char *n;
|
char *n = NULL;
|
||||||
char *sname;
|
char *sname = NULL;
|
||||||
|
|
||||||
fprintf (codefile,
|
fprintf (codefile,
|
||||||
"{\n"
|
"{\n"
|
||||||
@@ -441,11 +438,9 @@ decode_type (const char *name, const Type *t, int optional,
|
|||||||
tmpstr, forwstr,
|
tmpstr, forwstr,
|
||||||
name, tmpstr);
|
name, tmpstr);
|
||||||
|
|
||||||
asprintf (&n, "&(%s)->val[(%s)->len]", name, name);
|
if (asprintf (&n, "&(%s)->val[(%s)->len]", name, name) < 0 || n == NULL)
|
||||||
if (n == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
asprintf (&sname, "%s_s_of", tmpstr);
|
if (asprintf (&sname, "%s_s_of", tmpstr) < 0 || sname == NULL)
|
||||||
if (sname == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
decode_type (n, t->subtype, 0, forwstr, sname, NULL);
|
decode_type (n, t->subtype, 0, forwstr, sname, NULL);
|
||||||
fprintf (codefile,
|
fprintf (codefile,
|
||||||
@@ -472,10 +467,11 @@ decode_type (const char *name, const Type *t, int optional,
|
|||||||
decode_primitive ("general_string", name, forwstr);
|
decode_primitive ("general_string", name, forwstr);
|
||||||
break;
|
break;
|
||||||
case TTag:{
|
case TTag:{
|
||||||
char *tname, *typestring;
|
char *tname = NULL, *typestring = NULL;
|
||||||
char *ide = NULL;
|
char *ide = NULL;
|
||||||
|
|
||||||
asprintf(&typestring, "%s_type", tmpstr);
|
if (asprintf(&typestring, "%s_type", tmpstr) < 0 || typestring == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
|
|
||||||
fprintf(codefile,
|
fprintf(codefile,
|
||||||
"{\n"
|
"{\n"
|
||||||
@@ -528,8 +524,7 @@ decode_type (const char *name, const Type *t, int optional,
|
|||||||
fprintf(codefile,
|
fprintf(codefile,
|
||||||
"if (%s_datalen > len) { e = ASN1_OVERRUN; %s; }\n"
|
"if (%s_datalen > len) { e = ASN1_OVERRUN; %s; }\n"
|
||||||
"len = %s_datalen;\n", tmpstr, forwstr, tmpstr);
|
"len = %s_datalen;\n", tmpstr, forwstr, tmpstr);
|
||||||
asprintf (&tname, "%s_Tag", tmpstr);
|
if (asprintf (&tname, "%s_Tag", tmpstr) < 0 || tname == NULL)
|
||||||
if (tname == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
decode_type (name, t->subtype, 0, forwstr, tname, ide);
|
decode_type (name, t->subtype, 0, forwstr, tname, ide);
|
||||||
if(support_ber)
|
if(support_ber)
|
||||||
@@ -568,7 +563,7 @@ decode_type (const char *name, const Type *t, int optional,
|
|||||||
|
|
||||||
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
||||||
const Type *tt = m->type;
|
const Type *tt = m->type;
|
||||||
char *s;
|
char *s = NULL;
|
||||||
Der_class cl;
|
Der_class cl;
|
||||||
Der_type ty;
|
Der_type ty;
|
||||||
unsigned tag;
|
unsigned tag;
|
||||||
@@ -586,9 +581,8 @@ decode_type (const char *name, const Type *t, int optional,
|
|||||||
classname(cl),
|
classname(cl),
|
||||||
ty ? "CONS" : "PRIM",
|
ty ? "CONS" : "PRIM",
|
||||||
valuename(cl, tag));
|
valuename(cl, tag));
|
||||||
asprintf (&s, "%s(%s)->u.%s", m->optional ? "" : "&",
|
if (asprintf (&s, "%s(%s)->u.%s", m->optional ? "" : "&",
|
||||||
name, m->gen_name);
|
name, m->gen_name) < 0 || s == NULL)
|
||||||
if (s == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
decode_type (s, m->type, m->optional, forwstr, m->gen_name, NULL);
|
decode_type (s, m->type, m->optional, forwstr, m->gen_name, NULL);
|
||||||
fprintf(codefile,
|
fprintf(codefile,
|
||||||
|
@@ -259,13 +259,12 @@ encode_type (const char *name, const Type *t, const char *tmpstr)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
ASN1_TAILQ_FOREACH_REVERSE(m, t->members, memhead, members) {
|
ASN1_TAILQ_FOREACH_REVERSE(m, t->members, memhead, members) {
|
||||||
char *s;
|
char *s = NULL;
|
||||||
|
|
||||||
if (m->ellipsis)
|
if (m->ellipsis)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
asprintf (&s, "%s(%s)->%s", m->optional ? "" : "&", name, m->gen_name);
|
if (asprintf (&s, "%s(%s)->%s", m->optional ? "" : "&", name, m->gen_name) < 0 || s == NULL)
|
||||||
if (s == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
fprintf(codefile, "/* %s */\n", m->name);
|
fprintf(codefile, "/* %s */\n", m->name);
|
||||||
if (m->optional)
|
if (m->optional)
|
||||||
@@ -352,19 +351,17 @@ encode_type (const char *name, const Type *t, const char *tmpstr)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSequenceOf: {
|
case TSequenceOf: {
|
||||||
char *n;
|
char *sname = NULL;
|
||||||
char *sname;
|
char *n = NULL;
|
||||||
|
|
||||||
fprintf (codefile,
|
fprintf (codefile,
|
||||||
"for(i = (%s)->len - 1; i >= 0; --i) {\n"
|
"for(i = (%s)->len - 1; i >= 0; --i) {\n"
|
||||||
"size_t %s_for_oldret = ret;\n"
|
"size_t %s_for_oldret = ret;\n"
|
||||||
"ret = 0;\n",
|
"ret = 0;\n",
|
||||||
name, tmpstr);
|
name, tmpstr);
|
||||||
asprintf (&n, "&(%s)->val[i]", name);
|
if (asprintf (&n, "&(%s)->val[i]", name) < 0 || n == NULL)
|
||||||
if (n == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
asprintf (&sname, "%s_S_Of", tmpstr);
|
if (asprintf (&sname, "%s_S_Of", tmpstr) < 0 || sname == NULL)
|
||||||
if (sname == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
encode_type (n, t->subtype, sname);
|
encode_type (n, t->subtype, sname);
|
||||||
fprintf (codefile,
|
fprintf (codefile,
|
||||||
@@ -388,10 +385,9 @@ encode_type (const char *name, const Type *t, const char *tmpstr)
|
|||||||
constructed = 0;
|
constructed = 0;
|
||||||
break;
|
break;
|
||||||
case TTag: {
|
case TTag: {
|
||||||
char *tname;
|
char *tname = NULL;
|
||||||
int c;
|
int c;
|
||||||
asprintf (&tname, "%s_tag", tmpstr);
|
if (asprintf (&tname, "%s_tag", tmpstr) < 0 || tname == NULL)
|
||||||
if (tname == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
c = encode_type (name, t->subtype, tname);
|
c = encode_type (name, t->subtype, tname);
|
||||||
fprintf (codefile,
|
fprintf (codefile,
|
||||||
@@ -405,20 +401,19 @@ encode_type (const char *name, const Type *t, const char *tmpstr)
|
|||||||
}
|
}
|
||||||
case TChoice:{
|
case TChoice:{
|
||||||
Member *m, *have_ellipsis = NULL;
|
Member *m, *have_ellipsis = NULL;
|
||||||
char *s;
|
char *s = NULL;
|
||||||
|
|
||||||
if (t->members == NULL)
|
if (t->members == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
fprintf(codefile, "\n");
|
fprintf(codefile, "\n");
|
||||||
|
|
||||||
asprintf (&s, "(%s)", name);
|
if (asprintf (&s, "(%s)", name) < 0 || s == NULL)
|
||||||
if (s == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
fprintf(codefile, "switch(%s->element) {\n", s);
|
fprintf(codefile, "switch(%s->element) {\n", s);
|
||||||
|
|
||||||
ASN1_TAILQ_FOREACH_REVERSE(m, t->members, memhead, members) {
|
ASN1_TAILQ_FOREACH_REVERSE(m, t->members, memhead, members) {
|
||||||
char *s2;
|
char *s2 = NULL;
|
||||||
|
|
||||||
if (m->ellipsis) {
|
if (m->ellipsis) {
|
||||||
have_ellipsis = m;
|
have_ellipsis = m;
|
||||||
@@ -426,9 +421,8 @@ encode_type (const char *name, const Type *t, const char *tmpstr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fprintf (codefile, "case %s: {", m->label);
|
fprintf (codefile, "case %s: {", m->label);
|
||||||
asprintf(&s2, "%s(%s)->u.%s", m->optional ? "" : "&",
|
if (asprintf(&s2, "%s(%s)->u.%s", m->optional ? "" : "&",
|
||||||
s, m->gen_name);
|
s, m->gen_name) < 0 || s2 == NULL)
|
||||||
if (s2 == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
if (m->optional)
|
if (m->optional)
|
||||||
fprintf (codefile, "if(%s) {\n", s2);
|
fprintf (codefile, "if(%s) {\n", s2);
|
||||||
|
@@ -93,10 +93,9 @@ free_type (const char *name, const Type *t, int preserve)
|
|||||||
|
|
||||||
if(t->type == TChoice)
|
if(t->type == TChoice)
|
||||||
fprintf(codefile, "case %s:\n", m->label);
|
fprintf(codefile, "case %s:\n", m->label);
|
||||||
asprintf (&s, "%s(%s)->%s%s",
|
if (asprintf (&s, "%s(%s)->%s%s",
|
||||||
m->optional ? "" : "&", name,
|
m->optional ? "" : "&", name,
|
||||||
t->type == TChoice ? "u." : "", m->gen_name);
|
t->type == TChoice ? "u." : "", m->gen_name) < 0 || s == NULL)
|
||||||
if (s == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
if(m->optional)
|
if(m->optional)
|
||||||
fprintf(codefile, "if(%s) {\n", s);
|
fprintf(codefile, "if(%s) {\n", s);
|
||||||
@@ -128,8 +127,7 @@ free_type (const char *name, const Type *t, int preserve)
|
|||||||
char *n;
|
char *n;
|
||||||
|
|
||||||
fprintf (codefile, "while((%s)->len){\n", name);
|
fprintf (codefile, "while((%s)->len){\n", name);
|
||||||
asprintf (&n, "&(%s)->val[(%s)->len-1]", name, name);
|
if (asprintf (&n, "&(%s)->val[(%s)->len-1]", name, name) < 0 || n == NULL)
|
||||||
if (n == NULL)
|
|
||||||
errx(1, "malloc");
|
errx(1, "malloc");
|
||||||
free_type(n, t->subtype, FALSE);
|
free_type(n, t->subtype, FALSE);
|
||||||
fprintf(codefile,
|
fprintf(codefile,
|
||||||
|
@@ -583,15 +583,18 @@ template_members(struct templatehead *temp, const char *basetype, const char *na
|
|||||||
Member *m;
|
Member *m;
|
||||||
|
|
||||||
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
||||||
char *newbasename;
|
char *newbasename = NULL;
|
||||||
|
|
||||||
if (m->ellipsis)
|
if (m->ellipsis)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (name)
|
if (name) {
|
||||||
asprintf(&newbasename, "%s_%s", basetype, name);
|
if (asprintf(&newbasename, "%s_%s", basetype, name) < 0)
|
||||||
else
|
errx(1, "malloc");
|
||||||
|
} else
|
||||||
newbasename = strdup(basetype);
|
newbasename = strdup(basetype);
|
||||||
|
if (newbasename == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
|
|
||||||
template_members(temp, newbasename, m->gen_name, m->type, m->optional, isstruct, 1);
|
template_members(temp, newbasename, m->gen_name, m->type, m->optional, isstruct, 1);
|
||||||
|
|
||||||
@@ -601,7 +604,7 @@ template_members(struct templatehead *temp, const char *basetype, const char *na
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TTag: {
|
case TTag: {
|
||||||
char *tname, *elname;
|
char *tname = NULL, *elname = NULL;
|
||||||
const char *sename, *dupname;
|
const char *sename, *dupname;
|
||||||
int subtype_is_struct = is_struct(t->subtype, isstruct);
|
int subtype_is_struct = is_struct(t->subtype, isstruct);
|
||||||
|
|
||||||
@@ -610,10 +613,12 @@ template_members(struct templatehead *temp, const char *basetype, const char *na
|
|||||||
else
|
else
|
||||||
sename = symbol_name(basetype, t->subtype);
|
sename = symbol_name(basetype, t->subtype);
|
||||||
|
|
||||||
asprintf(&tname, "tag_%s_%lu", name ? name : "", (unsigned long)t);
|
if (asprintf(&tname, "tag_%s_%lu", name ? name : "", (unsigned long)t) < 0 || tname == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
output_name(tname);
|
output_name(tname);
|
||||||
|
|
||||||
asprintf(&elname, "%s_%s", basetype, tname);
|
if (asprintf(&elname, "%s_%s", basetype, tname) < 0 || elname == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
|
|
||||||
generate_template_type(elname, &dupname, NULL, sename, name,
|
generate_template_type(elname, &dupname, NULL, sename, name,
|
||||||
t->subtype, 0, subtype_is_struct, 0);
|
t->subtype, 0, subtype_is_struct, 0);
|
||||||
@@ -633,16 +638,17 @@ template_members(struct templatehead *temp, const char *basetype, const char *na
|
|||||||
case TSetOf:
|
case TSetOf:
|
||||||
case TSequenceOf: {
|
case TSequenceOf: {
|
||||||
const char *type, *tname, *dupname;
|
const char *type, *tname, *dupname;
|
||||||
char *sename, *elname;
|
char *sename = NULL, *elname = NULL;
|
||||||
int subtype_is_struct = is_struct(t->subtype, 0);
|
int subtype_is_struct = is_struct(t->subtype, 0);
|
||||||
|
|
||||||
if (name && subtype_is_struct) {
|
if (name && subtype_is_struct) {
|
||||||
tname = "seofTstruct";
|
tname = "seofTstruct";
|
||||||
asprintf(&sename, "%s_%s_val",
|
if (asprintf(&sename, "%s_%s_val", basetype, name) < 0)
|
||||||
basetype, name);
|
errx(1, "malloc");
|
||||||
} else if (subtype_is_struct) {
|
} else if (subtype_is_struct) {
|
||||||
tname = "seofTstruct";
|
tname = "seofTstruct";
|
||||||
asprintf(&sename, "%s_val", symbol_name(basetype, t->subtype));
|
if (asprintf(&sename, "%s_val", symbol_name(basetype, t->subtype)) < 0)
|
||||||
|
errx(1, "malloc");
|
||||||
} else {
|
} else {
|
||||||
if (name)
|
if (name)
|
||||||
tname = name;
|
tname = name;
|
||||||
@@ -650,12 +656,15 @@ template_members(struct templatehead *temp, const char *basetype, const char *na
|
|||||||
tname = "seofTstruct";
|
tname = "seofTstruct";
|
||||||
sename = strdup(symbol_name(basetype, t->subtype));
|
sename = strdup(symbol_name(basetype, t->subtype));
|
||||||
}
|
}
|
||||||
|
if (sename == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
|
|
||||||
if (t->type == TSetOf) type = "A1_OP_SETOF";
|
if (t->type == TSetOf) type = "A1_OP_SETOF";
|
||||||
else if (t->type == TSequenceOf) type = "A1_OP_SEQOF";
|
else if (t->type == TSequenceOf) type = "A1_OP_SEQOF";
|
||||||
else abort();
|
else abort();
|
||||||
|
|
||||||
asprintf(&elname, "%s_%s_%lu", basetype, tname, (unsigned long)t);
|
if (asprintf(&elname, "%s_%s_%lu", basetype, tname, (unsigned long)t) < 0 || elname == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
|
|
||||||
generate_template_type(elname, &dupname, NULL, sename, NULL, t->subtype,
|
generate_template_type(elname, &dupname, NULL, sename, NULL, t->subtype,
|
||||||
0, subtype_is_struct, need_offset);
|
0, subtype_is_struct, need_offset);
|
||||||
@@ -668,21 +677,22 @@ template_members(struct templatehead *temp, const char *basetype, const char *na
|
|||||||
struct templatehead template = ASN1_TAILQ_HEAD_INITIALIZER(template);
|
struct templatehead template = ASN1_TAILQ_HEAD_INITIALIZER(template);
|
||||||
struct template *q;
|
struct template *q;
|
||||||
size_t count = 0, i;
|
size_t count = 0, i;
|
||||||
char *tname;
|
char *tname = NULL;
|
||||||
FILE *f = get_code_file();
|
FILE *f = get_code_file();
|
||||||
Member *m;
|
Member *m;
|
||||||
int ellipsis = 0;
|
int ellipsis = 0;
|
||||||
char *e;
|
char *e;
|
||||||
|
|
||||||
asprintf(&tname, "asn1_choice_%s_%s%x",
|
if (asprintf(&tname, "asn1_choice_%s_%s%x",
|
||||||
basetype, name ? name : "", (unsigned int)(uintptr_t)t);
|
basetype, name ? name : "", (unsigned int)(uintptr_t)t) < 0 || tname == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
|
|
||||||
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
ASN1_TAILQ_FOREACH(m, t->members, members) {
|
||||||
const char *dupname;
|
const char *dupname;
|
||||||
char *elname;
|
char *elname = NULL;
|
||||||
char *newbasename;
|
char *newbasename = NULL;
|
||||||
int subtype_is_struct;
|
int subtype_is_struct;
|
||||||
|
|
||||||
if (m->ellipsis) {
|
if (m->ellipsis) {
|
||||||
ellipsis = 1;
|
ellipsis = 1;
|
||||||
continue;
|
continue;
|
||||||
@@ -690,13 +700,19 @@ template_members(struct templatehead *temp, const char *basetype, const char *na
|
|||||||
|
|
||||||
subtype_is_struct = is_struct(m->type, 0);
|
subtype_is_struct = is_struct(m->type, 0);
|
||||||
|
|
||||||
asprintf(&elname, "%s_choice_%s", basetype, m->gen_name);
|
if (asprintf(&elname, "%s_choice_%s", basetype, m->gen_name) < 0 || elname == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
|
|
||||||
if (subtype_is_struct)
|
if (subtype_is_struct) {
|
||||||
asprintf(&newbasename, "%s_%s", basetype, m->gen_name);
|
if (asprintf(&newbasename, "%s_%s", basetype, m->gen_name) < 0)
|
||||||
else
|
errx(1, "malloc");
|
||||||
|
} else
|
||||||
newbasename = strdup(basetype);
|
newbasename = strdup(basetype);
|
||||||
|
|
||||||
|
if (newbasename == NULL)
|
||||||
|
errx(1, "malloc");
|
||||||
|
|
||||||
|
|
||||||
generate_template_type(elname, &dupname, NULL,
|
generate_template_type(elname, &dupname, NULL,
|
||||||
symbol_name(newbasename, m->type),
|
symbol_name(newbasename, m->type),
|
||||||
NULL, m->type, 0, subtype_is_struct, 1);
|
NULL, m->type, 0, subtype_is_struct, 1);
|
||||||
@@ -710,10 +726,11 @@ template_members(struct templatehead *temp, const char *basetype, const char *na
|
|||||||
free(newbasename);
|
free(newbasename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e = NULL;
|
||||||
if (ellipsis) {
|
if (ellipsis) {
|
||||||
asprintf(&e, "offsetof(%s%s, u.asn1_ellipsis)", isstruct ? "struct " : "", basetype);
|
if (asprintf(&e, "offsetof(%s%s, u.asn1_ellipsis)", isstruct ? "struct " : "", basetype) < 0 || e == NULL)
|
||||||
} else
|
errx(1, "malloc");
|
||||||
e = NULL;
|
}
|
||||||
|
|
||||||
ASN1_TAILQ_FOREACH(q, &template, members) {
|
ASN1_TAILQ_FOREACH(q, &template, members) {
|
||||||
count++;
|
count++;
|
||||||
|
Reference in New Issue
Block a user