From 07cd16cba05648a1d0075930311c19c9b11dde4c Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Wed, 12 Mar 1997 16:41:48 +0000 Subject: [PATCH] Generate free functions. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1380 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/asn1/gen.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/lib/asn1/gen.c b/lib/asn1/gen.c index f17783cbf..1d59bc400 100644 --- a/lib/asn1/gen.c +++ b/lib/asn1/gen.c @@ -661,10 +661,102 @@ generate_type_decode (Symbol *s) } #endif +static void +free_primitive (char *typename, char *name) +{ + fprintf (codefile, "free_%s(%s);\n", typename, name); +} + +static void +free_type (char *name, Type *t) +{ + switch (t->type) { + case TType: +#if 0 + free_type (name, t->symbol->type); +#endif + fprintf (codefile, "free_%s(%s);\n", t->symbol->gen_name, name); + break; + case TInteger: + free_primitive ("integer", name); + break; + case TOctetString: + free_primitive ("octet_string", name); + break; + case TBitString: { + break; + } + case TSequence: { + Member *m; + int tag = -1; + + if (t->members == NULL) + break; + + for (m = t->members; m && tag != m->val; m = m->next) { + char *s = malloc(2 + strlen(name) + 1 + strlen(m->gen_name) + 3); + + sprintf (s, "%s(%s)->%s", m->optional ? "" : "&", name, m->gen_name); + free_type (s, m->type); + if(m->optional) + fprintf(codefile, "if(%s) free(%s);\n", s, s); + if (tag == -1) + tag = m->val; + free (s); + } + break; + } + case TSequenceOf: { + char *n = malloc(2*strlen(name) + 20); + + fprintf (codefile, "while((%s)->len){\n", name); + sprintf (n, "&(%s)->val[(%s)->len-1]", name, name); + free_type(n, t->subtype); + fprintf(codefile, + "(%s)->len--;\n" + "}\n", + name); + fprintf(codefile, + "free((%s)->val);\n", name); + free(n); + break; + } + case TGeneralizedTime: + free_primitive ("generalized_time", name); + break; + case TGeneralString: + free_primitive ("general_string", name); + break; + case TApplication: + free_type (name, t->subtype); + break; + default : + abort (); + } +} + +static void +generate_type_free (Symbol *s) +{ + fprintf (headerfile, + "void free_%s(%s *);\n", + s->gen_name, s->gen_name); + + fprintf (codefile, "void\n" + "free_%s(%s *data)\n" + "{\n", + s->gen_name, s->gen_name); + + free_type ("data", s->type); + fprintf (codefile, "}\n\n"); +} + + void generate_type (Symbol *s) { generate_type_header (s); generate_type_encode (s); generate_type_decode (s); + generate_type_free (s); }