📄 gen.c
字号:
break; case TBoolean: fprintf (headerfile, "BOOLEAN"); break; case TOctetString: fprintf (headerfile, "OCTET STRING"); break; case TEnumerated : case TBitString: { Member *m; space(level); if(t->type == TBitString) fprintf (headerfile, "BIT STRING {\n"); else fprintf (headerfile, "ENUMERATED {\n"); ASN1_TAILQ_FOREACH(m, t->members, members) { space(level + 1); fprintf (headerfile, "%s(%d)%s\n", m->name, m->val, last_member_p(m)); } space(level); fprintf (headerfile, "}"); break; } case TChoice: case TSet: case TSequence: { Member *m; int max_width = 0; if(t->type == TChoice) fprintf(headerfile, "CHOICE {\n"); else if(t->type == TSet) fprintf(headerfile, "SET {\n"); else fprintf(headerfile, "SEQUENCE {\n"); ASN1_TAILQ_FOREACH(m, t->members, members) { if(strlen(m->name) > max_width) max_width = strlen(m->name); } max_width += 3; if(max_width < 16) max_width = 16; ASN1_TAILQ_FOREACH(m, t->members, members) { int width = max_width; space(level + 1); if (m->ellipsis) { fprintf (headerfile, "..."); } else { width -= fprintf(headerfile, "%s", m->name); fprintf(headerfile, "%*s", width, ""); define_asn1(level + 1, m->type); if(m->optional) fprintf(headerfile, " OPTIONAL"); } if(last_member_p(m)) fprintf (headerfile, ","); fprintf (headerfile, "\n"); } space(level); fprintf (headerfile, "}"); break; } case TSequenceOf: fprintf (headerfile, "SEQUENCE OF "); define_asn1 (0, t->subtype); break; case TSetOf: fprintf (headerfile, "SET OF "); define_asn1 (0, t->subtype); break; case TGeneralizedTime: fprintf (headerfile, "GeneralizedTime"); break; case TGeneralString: fprintf (headerfile, "GeneralString"); break; case TTag: { const char *classnames[] = { "UNIVERSAL ", "APPLICATION ", "" /* CONTEXT */, "PRIVATE " }; if(t->tag.tagclass != ASN1_C_UNIV) fprintf (headerfile, "[%s%d] ", classnames[t->tag.tagclass], t->tag.tagvalue); if(t->tag.tagenv == TE_IMPLICIT) fprintf (headerfile, "IMPLICIT "); define_asn1 (level, t->subtype); break; } case TUTCTime: fprintf (headerfile, "UTCTime"); break; case TUTF8String: space(level); fprintf (headerfile, "UTF8String"); break; case TPrintableString: space(level); fprintf (headerfile, "PrintableString"); break; case TIA5String: space(level); fprintf (headerfile, "IA5String"); break; case TBMPString: space(level); fprintf (headerfile, "BMPString"); break; case TUniversalString: space(level); fprintf (headerfile, "UniversalString"); break; case TVisibleString: space(level); fprintf (headerfile, "VisibleString"); break; case TOID : space(level); fprintf(headerfile, "OBJECT IDENTIFIER"); break; case TNull: space(level); fprintf (headerfile, "NULL"); break; default: abort (); }}static voiddefine_type (int level, const char *name, Type *t, int typedefp, int preservep){ switch (t->type) { case TType: space(level); fprintf (headerfile, "%s %s;\n", t->symbol->gen_name, name); break; case TInteger: space(level); if(t->members) { Member *m; fprintf (headerfile, "enum %s {\n", typedefp ? name : ""); ASN1_TAILQ_FOREACH(m, t->members, members) { space (level + 1); fprintf(headerfile, "%s = %d%s\n", m->gen_name, m->val, last_member_p(m)); } 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 == INT_MAX) { fprintf (headerfile, "int %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 == 0 && t->range->max == INT_MAX) { fprintf (headerfile, "unsigned int %s;\n", name); } else errx(1, "%s: unsupported range %d -> %d", name, t->range->min, t->range->max); break; case TBoolean: space(level); fprintf (headerfile, "int %s;\n", name); break; case TOctetString: space(level); fprintf (headerfile, "heim_octet_string %s;\n", name); break; case TBitString: { Member *m; Type i; struct range range = { 0, INT_MAX }; i.type = TInteger; i.range = ⦥ i.members = NULL; i.constraint = NULL; space(level); if(ASN1_TAILQ_EMPTY(t->members)) fprintf (headerfile, "heim_bit_string %s;\n", name); else { fprintf (headerfile, "struct %s {\n", typedefp ? name : ""); ASN1_TAILQ_FOREACH(m, t->members, members) { char *n; asprintf (&n, "%s:1", m->gen_name); if (n == NULL) errx(1, "malloc"); define_type (level + 1, n, &i, FALSE, FALSE); free (n); } space(level); fprintf (headerfile, "} %s;\n\n", name); } break; } case TEnumerated: { Member *m; space(level); fprintf (headerfile, "enum %s {\n", typedefp ? name : ""); ASN1_TAILQ_FOREACH(m, t->members, members) { space(level + 1); if (m->ellipsis) fprintf (headerfile, "/* ... */\n"); else fprintf (headerfile, "%s = %d%s\n", m->gen_name, m->val, last_member_p(m)); } space(level); fprintf (headerfile, "} %s;\n\n", name); break; } case TSet: case TSequence: { Member *m; space(level); fprintf (headerfile, "struct %s {\n", typedefp ? name : ""); if (t->type == TSequence && preservep) { space(level + 1); fprintf(headerfile, "heim_octet_string _save;\n"); } ASN1_TAILQ_FOREACH(m, t->members, members) { if (m->ellipsis) { ; } else if (m->optional) { char *n; asprintf (&n, "*%s", m->gen_name); if (n == NULL) errx(1, "malloc"); define_type (level + 1, n, m->type, FALSE, FALSE); free (n); } else define_type (level + 1, m->gen_name, m->type, FALSE, FALSE); } space(level); fprintf (headerfile, "} %s;\n", name); break; } case TSetOf: case TSequenceOf: { Type i; struct range range = { 0, INT_MAX }; i.type = TInteger; i.range = ⦥ i.members = NULL; i.constraint = NULL; space(level); fprintf (headerfile, "struct %s {\n", typedefp ? name : ""); define_type (level + 1, "len", &i, FALSE, FALSE); define_type (level + 1, "*val", t->subtype, FALSE, FALSE); space(level); fprintf (headerfile, "} %s;\n", name); break; } case TGeneralizedTime: space(level); fprintf (headerfile, "time_t %s;\n", name); break; case TGeneralString: space(level); fprintf (headerfile, "heim_general_string %s;\n", name); break; case TTag: define_type (level, name, t->subtype, typedefp, preservep); break; case TChoice: { int first = 1; Member *m; space(level); fprintf (headerfile, "struct %s {\n", typedefp ? name : ""); if (preservep) { space(level + 1); fprintf(headerfile, "heim_octet_string _save;\n"); } space(level + 1); fprintf (headerfile, "enum {\n"); m = have_ellipsis(t); if (m) { space(level + 2); fprintf (headerfile, "%s = 0,\n", m->label); first = 0; } ASN1_TAILQ_FOREACH(m, t->members, members) { space(level + 2); if (m->ellipsis) fprintf (headerfile, "/* ... */\n"); else fprintf (headerfile, "%s%s%s\n", m->label, first ? " = 1" : "", last_member_p(m)); first = 0; } space(level + 1); fprintf (headerfile, "} element;\n"); space(level + 1); fprintf (headerfile, "union {\n"); ASN1_TAILQ_FOREACH(m, t->members, members) { if (m->ellipsis) { space(level + 2); fprintf(headerfile, "heim_octet_string asn1_ellipsis;\n"); } else if (m->optional) { char *n; asprintf (&n, "*%s", m->gen_name); if (n == NULL) errx(1, "malloc"); define_type (level + 2, n, m->type, FALSE, FALSE); free (n); } else define_type (level + 2, m->gen_name, m->type, FALSE, FALSE); } space(level + 1); fprintf (headerfile, "} u;\n"); space(level); fprintf (headerfile, "} %s;\n", name); break; } case TUTCTime: space(level); fprintf (headerfile, "time_t %s;\n", name); break; case TUTF8String: space(level); fprintf (headerfile, "heim_utf8_string %s;\n", name); break; case TPrintableString: space(level); fprintf (headerfile, "heim_printable_string %s;\n", name); break; case TIA5String: space(level); fprintf (headerfile, "heim_ia5_string %s;\n", name); break; case TBMPString: space(level); fprintf (headerfile, "heim_bmp_string %s;\n", name); break; case TUniversalString: space(level); fprintf (headerfile, "heim_universal_string %s;\n", name); break; case TVisibleString: space(level); fprintf (headerfile, "heim_visible_string %s;\n", name); break; case TOID : space(level); fprintf (headerfile, "heim_oid %s;\n", name); break; case TNull: space(level); fprintf (headerfile, "int %s;\n", name); break; default: abort (); }}static voidgenerate_type_header (const Symbol *s){ int preservep = preserve_type(s->name) ? TRUE : FALSE; fprintf (headerfile, "/*\n"); fprintf (headerfile, "%s ::= ", s->name); define_asn1 (0, s->type); fprintf (headerfile, "\n*/\n\n"); fprintf (headerfile, "typedef "); define_type (0, s->gen_name, s->type, TRUE, preservep); fprintf (headerfile, "\n");}voidgenerate_type (const Symbol *s){ generate_header_of_codefile(s->gen_name); generate_type_header (s); generate_type_encode (s); generate_type_decode (s); generate_type_free (s); generate_type_length (s); generate_type_copy (s); generate_type_seq (s); generate_glue (s->type, s->gen_name); fprintf(headerfile, "\n\n"); close_codefile();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -