diff --git a/lib/asn1/gen_maybe.c b/lib/asn1/gen_maybe.c new file mode 100644 index 000000000..46e4e4a63 --- /dev/null +++ b/lib/asn1/gen_maybe.c @@ -0,0 +1,57 @@ +#include "asn1_locl.h" + +RCSID("$Id$"); + +void +generate_type_maybe (Symbol *s) +{ + fprintf (headerfile, + "int maybe_%s(unsigned char *, int);\n", + s->gen_name); + + fprintf (codefile, "int\n" + "maybe_%s(unsigned char *p, int len)\n" + "{\n ", + s->gen_name); + + switch (s->type->type) { + case TInteger: + fprintf (codefile, "return der_match_tag (p, len, UNIV, " + "PRIM, UT_Integer) >= 0;\n"); + break; + case TOctetString: + fprintf (codefile, "return der_match_tag (p, len, UNIV, " + "PRIM, UT_OctetString) >= 0;\n"); + break; + case TGeneralizedTime: + fprintf (codefile, "return der_match_tag (p, len, UNIV, " + "PRIM, UT_GeneralizedTime) >= 0;\n"); + break; + case TGeneralString: + fprintf (codefile, "return der_match_tag (p, len, UNIV, " + "PRIM, UT_GeneralString) >= 0;\n"); + break; + case TBitString: + fprintf (codefile, "return der_match_tag (p, len, UNIV, " + "PRIM, UT_BitString) >= 0;\n"); + break; + + case TSequence: + case TSequenceOf: + fprintf (codefile, "return der_match_tag (p, len, UNIV, " + "CONS, UT_Sequence) >= 0;\n"); + break; + case TApplication: + fprintf (codefile, "return der_match_tag (p, len, APPL, " + "CONS, %d) >= 0;\n", s->type->application); + break; + case TType: + fprintf (codefile, "return maybe_%s(p, len) >= 0;\n", + s->type->symbol->gen_name); + break; + default: + abort (); + } + fprintf (codefile, "}\n\n"); +} +